LinuxForum.Fans
Тема

Программа для создания тестов. Обсуждение программы и кода

Автор: xwicked 40 сообщений 22349 просмотров
#229568

Здравствуйте! Представляю новую версию программы 0.4.7. Добавился файл с константами:

text
//const.h
//Определение путей констант, в соответствии с системой
#if defined(Q_WS_WIN)

#define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwst" #define PATH_SHARE_DOC QApplication::applicationDirPath() #define PATH_SHARE_APP QApplication::applicationDirPath() #define PATH_TMP QApplication::applicationDirPath()

#elif defined(Q_WS_X11)

#define PATH_TMP_SET "/tmp/shelk-test-0.4.7/settings.xwst" #define PATH_SHARE_DOC "/usr/share/doc/shelk-test-0.4.7" #define PATH_SHARE_APP "/usr/share/shelk-test-0.4.7" #define PATH_TMP "/tmp/shelk-test-0.4.7"

#elif defined(Q_WS_MAC)

#define PATH_TMP_SET QApplication::applicationDirPath() + "/settings.xwst" #define PATH_SHARE_DOC QApplication::applicationDirPath() #define PATH_SHARE_APP QApplication::applicationDirPath() #define PATH_TMP QApplication::applicationDirPath()

#endif

#define MODE_VIEW true #define MODE_EDIT false

#define LANGUAGE_RUSSIAN true #define LANGUAGE_ENGLISH false

#define TOOLBAR_SHOW true #define TOOLBAR_HIDE false

#define STATISTICS_FIELD_SHOW true #define STATISTICS_FIELD_HIDE false

#define VIEW_RUSSIAN 0 #define VIEW_ENGLISH 1 #define EDIT_RUSSIAN 2 #define EDIT_ENGLISH 3

//Типы вопросов #define TYPE_ONE_ANSWER "1" #define TYPE_MANY_ANSWERS "2" #define TYPE_ENTER_WORD "3" #define TYPE_ENTER_NUMBER "4" #define TYPE_INSTALLATION_SEQUENCE "5"

Добавилась новая структура, но в коде она пока не задействована:

text
//Структура показа полей статистики
struct TStateFieldStatistics
{
     bool bUserName,//Имя пользователя
          bNameTest,//Название теста
          bTotalQuestions,//Всего вопросов
          bCorrectAnswers,//Правильных ответов
          bWrongAnswers,//Неправильных ответов
          bTotalPoints,//Всего баллов
          bScore,//Оценка
          bDate,//Дата
          bTimeBegin,//Время начала
          bTimeEnd,//Время окончания
          bElapsedTime;//Прошедшее время
};

Оптимизирована функция изменения шрифта(была 195 строк):

text
        bool Accept;
        QFont TextFont;
        TextFont = TextQuestion->textCursor().charFormat().font();
        TextFont = QFontDialog::getFont(&Accept, TextFont);

if(Accept) { QTextCharFormat tcf; tcf.setFont(TextFont); TextQuestion->textCursor().setCharFormat(tcf); cbFont.setCurrentFont(TextFont); } else return 1;

Скачать

#229622
text

    #define PATH_TMP_SET "/tmp/shelk-test-0.4.7/settings.xwst"
    #define PATH_SHARE_DOC "/usr/share/doc/shelk-test-0.4.7"
    #define PATH_SHARE_APP "/usr/share/shelk-test-0.4.7"
    #define PATH_TMP "/tmp/shelk-test-0.4.7"

Мало того, что "зашитые" пути в коде это..... некрасиво (ИМХО)
Так еще и править надо из версии в версию.

#229626

voral написал:
text

    #define PATH_TMP_SET "/tmp/shelk-test-0.4.7/settings.xwst"
    #define PATH_SHARE_DOC "/usr/share/doc/shelk-test-0.4.7"
    #define PATH_SHARE_APP "/usr/share/shelk-test-0.4.7"
    #define PATH_TMP "/tmp/shelk-test-0.4.7"

Мало того, что "зашитые" пути в коде это..... некрасиво (ИМХО)
Так еще и править надо из версии в версию.

Пруфлинк?
#229634

На что?
На то что зашитые пути плохо? oO
Это мое имхо я ж сказал.

То что править версии надо.... Ну, а как если у вас текущая версия программы указанна в 100500 строках кода?

Заодно про винду:

text

Application::applicationDirPath()

Судя по использованию "temp" в имени. Вы туда собираетесь что то писать. Вопрос на засыпку: в правильно настроенной системе можно ли писать в Application::applicationDirPath()?

Кроме того уж для временного каталога можно нормально и кросплатформенно получить: QDir::tempPath ()
А еще temp(), currentPath(), homePath() и rootPath(); QCoreApplication::libraryPaths (); QTemporaryFile ()

#229795
text
#./configure
# installation paths
prefix_default="/usr/local"
bindir_default='${prefix}/bin'
datadir_default='${prefix}/share/ffmpeg'
incdir_default='${prefix}/include'
libdir_default='${prefix}/lib'
mandir_default='${prefix}/share/man'
shlibdir_default="$libdir_default"

Нашёл информацию но, ближайшие полгода я этим заниматься не буду :o .
В приведённом выше коде возможна только одна установка, у меня же можно установить несколько разных версий, которые абсолютно не будут друг другу мешать, это не unix-way, поэтому я крепко над этим задумаюсь.

#230463

Новая и последняя на данный момент версия 1.0.0. Здесь я постарался конкретно. Изменения:

- Добавились новые возможности: проверка наличия новой версии через интернет; печать теста; печать статистики; экспорт тестов в HTML, RTF, PDF, PostScript, простой текстовый формат;
- Добавлено использование системных временных каталогов для размещения временных файлов;
- Изменилось расположение файла статистики по-умолчанию на домашний каталог пользователя;
- Изменилась кодировка файла статистики на UTF-8:
- Изменилась кодировка импортируемого текстового файла на UTF-8;
text
//Новые константы
//Типы вопросов для определения содержимого переменной QVariant
#define V_TYPE_ONE_ANSWER QVariant::Int
#define V_TYPE_MANY_ANSWERS QVariant::ByteArray
#define V_TYPE_ENTER_WORD QVariant::String
#define V_TYPE_ENTER_NUMBER QVariant::Double
#define V_TYPE_INSTALLATION_SEQUENCE QVariant::StringList

//Перевод слов в rtf-unicode QString ShelkTest::WordToUnicode(QString sWord) { QString sTemp, sNum; sTemp.clear(); for (int i = 0; i < sWord.length(); i++) { sNum.setNum(sWord.at(i).unicode()); sTemp.append("\\u" + sNum + "?"); } return sTemp; }

Далее, задействовал webkit:

text
private: QWebView *wvUpdate;//Для обновления и печати :)

, так как QTextEdit и QTextBrowser не могут отображать элементы ввода(текст, переключатель, флажок), для формирования правильной html-ки. Раз уж было принято решение добавить новую зависимость от библиотеки QtWebkit, то на его же основе я сделал проверку наличия новой версии через интернет, смотрим:

text
void ShelkTest::slotCheckForUpdates()
{
    connect(wvUpdate, SIGNAL(loadFinished(bool)), SLOT(slotMakeCheckUpdates(bool)));
    wvUpdate->load(QUrl("http://labfreetech.org/shelk_1.0.0.html"));
}

void ShelkTest::slotMakeCheckUpdates(bool bError) { if (bError && wvUpdate->page()->findText("new_version")) QMessageBox::information(0, tr("Information"), tr("On the official website available a new version!")); else QMessageBox::information(0, tr("Information"), tr("You have the latest version!")); disconnect(wvUpdate, SIGNAL(loadFinished(bool)), 0, 0); }

Как видно - всё просто. Если текст "new_version" найден в загруженной html-ке, то есть новая версия :)
Чтобы сделать всё так, как я задумал - пришлось использовать новый метод disconnect, который я ранее не использовал и всё получилось.

Теперь за кодом можно наблюдать не дожидаясь релиза. В git создана новая ветка current. Скачать.

#230466

по поводу путей и версий: очень советую освоить для этих целей утилиты сборки в частности cmake. можно и autotools, но ИМХО - это каторжный труд...
На крайний, случай дефайнов у вас не так много, можно всю логику и в qmake'е уместить...

#230653
xwicked написал:
, так как QTextEdit и QTextBrowser не могут отображать элементы ввода(текст, переключатель, флажок), для формирования правильной html-ки. Раз уж было принято решение добавить новую зависимость от библиотеки QtWebkit, то на его же основе я сделал проверку наличия новой версии через интернет, смотрим:

Гуевый класс для проверки последней версии???? Это типа как микроскопом гвозди.

я бы на вашем месте создал отдельный поток, в нем объект класса QNetworkAccessManager (еще лучше унаследуйтесь от него)..... Эта задача с ГУИ вообще ни как не связана, а вы QWebView припахали. Наследника от этого же класса можно припахать и к скачиванию новой версии. Тут уж объеденять это в одном классе или нет вам решать. Я в одном проекте такое делал, но оно было разделено по классам, т.к. первый кроме проверки версий еще много каких сетевых функций делал.

#230672

Основная задача - это печать правильной html-ки. А с сетью я, в ближайшем будущем связываться не буду - программы все ещё сырые для дистрябов unix'овых wink

#230743

Какой смысл ваять временные костыли, чтобы потом переписывать? Это ж не отнимет больше времени чем заняло у вас. Если вы не вынесли в отдельный поток так же можно сделать и с акцессменеджером. Правда это в обоих случаях как то не правильно.

#267282

Очередная версия программы 1.5.1. Часть переменных сгруппирована и выделена в отдельные классы:
TAnswer,//Ответ
TQuestion,//Вопрос
TTest,//Тест
TDepository,//Хранилище
TFileOptions//файл свойств

text
...
    QString s_NameTest;//Название теста
    QByteArray ba_TestPassword;//Пароль теста

public:

QVector<TQuestion> vListQuestions;//Список вопросов QVector<TAnswer> vListAnswers;//Список ответов

QTimer TimerTest; QTimer TimerTestLabel; QTime TimeTestCurrent; QTime TimeTestAll;

TTest(); ~TTest();

int countQuestions() const;//Получить количество вопросов void setCountQuestions(int iCountQuestions);//Задать количество вопросов ...

Всё работает нормально, но память очищается не вся. :( Вектора списков вопросов и ответов, при вызове стандартного метода clear(), возможно неполностью очищают своё содержимое. Сделал так:

text
    for (int i = 0; i < TestDepository->Test->vListQuestions.count(); i++)
    {
        TestDepository->paTemp[i].clear();//Указатель на TestDepository->Test->vListAnswers
        TestDepository->pqTemp[i].clear();//Указатель на TestDepository->Test->vListQuestions
    }

TestDepository->TestAnswer.clear(); TestDepository->TestQuestion.clear(); TestDepository->Test->vListAnswers.clear(); TestDepository->Test->vListQuestions.clear();

всё равно после недолгой работы(открытий / закрытий тестов) с программой. Остаётся, при закрытии ~3 МБ не выгружено. По, что это мелочь, но ...

Изменения:

- Оптимизация процесса сохранения теста(~10 раз(!)) в базу хранилища;
- Декомпозиция программы на отдельные классы, с занесением части переменных в секцию private;
- Добавлена возможность использовать дифференцированную или недифференцированную систему оценивания;
- Добавлены возможности: удалённого расположения файла свойств программы; ограничивать время для всего теста; пропуска вопросов, при тестировании; перемешивания вопросов; настраиваемого показа полей статистики; запоминать последнюю открытую базу хранилища; не показывать результаты тестируемому; ограничивать количество задаваемых вопросов из общего числа;
Скачать
#285736

1.5.2 - скачать

- Теперь сохранение свойств программы происходит при каждом их изменении;
- Убрана чувствительность регистра ответа в вопросе типа "Ввод слова(предложения)";
- Исправлена ошибка ограничения количества вопросов в режиме редактирования;
- Добавлено новое поле статистики "Количество заданных вопросов из общего числа";
- Исправлена ошибка, когда нельзя было ввести вариант ответа, при увеличении и обратном уменьшении изображения, в вопросе "Ввод слова(предложения)";
- Изменено и отлажено автоматическое определение пропущенных вопросов, при тестировании;
- Добавлена дополнительная детализация к статистике протестировавшихся;
В следующей версии я хочу прикрутить веб-интрефейс тестируемого. Собираюсь использовать JavaScript(или Java? а возможно C++?) + свой простейший веб-сервер(на C++ для AJAX). Какие вопросы / проблемы меня могут поджидать?

Благодарю за ответы!
#321673

Опакетил для Магеи: [url]ftp://ftp.mageialinux.ru/.[/url] Взял в EduMageia.

#325208

romkaromka написал:
Опакетил для Магеи: [url]ftp://ftp.mageialinux.ru/.[/url] Взял в EduMageia.
Здравствуйте!
Сегодня установил Mageia 3, в центре управления его нет. Что я делаю не так? Благодарю за ответ!
#325338

Источники пока подключить не удалось, а пакет для 2-ой в 3-ей заработал. Правда нет ярлыков нигде. Запускается. Как хорошо всё работает смогу проверить чуть позже.

Благодарю!

[ДОБАВЛЕНО]

Пакет qt4-database-plugin-sqlite-4.8.4-7.mga3.i586.rpm необходимо включить в зависимости, так как без него программа нерабочая.

#347024

По-тихоньку идёт совершенствование программы. И сейчас от основного кода был отделён модуль Тестирование.

Пршу протестировать на наличие ошибок первую бета-версию: 1.6.2.0. Для полноценной проверки может потребоваться прошлая версия 1.5.2.

Благодарю за ответы!

#347046

Для linux ничего нет, только под винду.

#347065

romkaromka написал:
Для linux ничего нет, только под винду.
В связи с непрофильной работой в сервисе, у меня очень мало времени уходит сейчас на разработку, поэтому вот временный снепшот [url=labfreetech.org/f/shelk-test/1.6.2/shelk-test-view.tar.gz]сорцов[/url]. С Git'ом я ещё не решил, как ветки будут располагаться и сколько их будет.
#347242

xwicked, что за тесты-то? Ты самое главное забыл, объяснить ЗАЧЕМ?

Войдите или зарегистрируйтесь, чтобы ответить.