0.4.4. Исправлено 15 ошибок(!). Появились 2-е структуры:
//Структура файла свойств
struct sFileSettings
{
bool gRegimeViewing,//true - Режим просмотра, false - Режим редактирования
LanguageProgram,//Язык программы
bStandardPanel,//Состояние показа стандартной панели
bEditPanel,//Состояние показа панели редактирования
bFormatPanel,//Состояние показа панели форматирования
bTimePanel,//Состояние показа панели времени
bPointPanel,//Состояние показа панели баллов
bLimitTime,//Ограничение времени
bAutoStartTest;//Автоматический запуск
QString RegimePassword;//Пароль режима
};
//Структура теста
struct sShelkTestVar
{
QString sNameTest,//Название теста
sAllPoint,//Все баллы строкой
sMidPoint,//Средний балл строкой
sCurrentPoint,//Текущий балл строкой
sTypeQuestion,//Тип вопроса
TestPassword,//Пароль теста
StatNameTest,//Имя пользователя в статистике
sQuestion,//Текст вопроса
sTimeStart;//Время начала
int CountQuestion,//Количество вопросов
iNumberQuestion,//Номер вопроса
iNumberTest,//Номер теста
AllPoint,//Общий балл
MidPoint,//Средний балл
CurrentPoint,//Текущий балл
AllPointCheck,//Общий балл для проверки
AllTime,//Общее время
MidTime,//Среднее время
CurrentTime,//Текущее время
i5First;//Номер прошлого выделенного ответа (установка последовательности)
QVector<double> *iRangeFirst,//Начальное значение диапазона (ввод числа)
*iRangeLast;//Конечное значение диапазона (ввод числа)
QStringList ListQuestions,//Список вопросов
slTableNumber,//Список номеров таблиц в базе тестов
slQuestionType,//Список типов вопросов
slPoint,//Список баллов
slTime;//Список времени
QVector<QVariant> *ListRightAnswer,//Список правильных ответов
*ListCheckRightAnswer;//Список правильных ответов для проверки
QVector<QStringList> *ListAnswers;//Список ответов
QVector<QByteArray> *ListImages;//Список изображений
QVector<QFont> *ListFonts;//Список шрифтов
QSqlDatabase db;//База данных тестов
QTimer TimerTest,
TimerTestLabel;
QTime TimeTestCurrent,
TimeTestAll;
};
Их было решено использовать сразу, после выхода кроссворда за предел стека
Введение вектора типа QVariant позволило функцию проверки ответов максимально упростить и вынести отдельно:
bool ShelkTest::MakeCheckRightAnswer(int iIndex)
{
int iTypeR;
QString str1, str2;
QByteArray ba1, ba2;
iTypeR = vShelkTestVar->ListRightAnswer->at(iIndex).type();
if(iTypeR == QVariant::Int)
{
if(vShelkTestVar->ListRightAnswer->at(iIndex).toInt()
== vShelkTestVar->ListCheckRightAnswer->at(iIndex).toInt())
return true;
else return false;
}
if(iTypeR == QVariant::Double)
{
if(vShelkTestVar->ListRightAnswer->at(iIndex).toDouble()
== vShelkTestVar->ListCheckRightAnswer->at(iIndex).toDouble())
return true;
else return false;
}
if(iTypeR == QVariant::String)
{
if(vShelkTestVar->ListRightAnswer->at(iIndex).toString()
== vShelkTestVar->ListCheckRightAnswer->at(iIndex).toString())
return true;
else return false;
}
if(iTypeR == QVariant::ByteArray)
{
ba1.append(vShelkTestVar->ListRightAnswer->at(iIndex).toByteArray());
ba2.append(vShelkTestVar->ListCheckRightAnswer->at(iIndex).toByteArray());
str1.append(vShelkTestVar->ListRightAnswer->at(iIndex).toByteArray());
str2.append(vShelkTestVar->ListCheckRightAnswer->at(iIndex).toByteArray());
if(vShelkTestVar->ListRightAnswer->at(iIndex).toByteArray()
== vShelkTestVar->ListCheckRightAnswer->at(iIndex).toByteArray())
return true;
else return false;
}
if(iTypeR == QVariant::StringList)
{
if(vShelkTestVar->ListRightAnswer->at(iIndex).toStringList()
== vShelkTestVar->ListCheckRightAnswer->at(iIndex).toStringList())
return true;
else return false;
}
return false;
}
Несмотря на то, что QVariant не рекомендуется использовать из за большого потребления памяти, так как он позволяет хранить даже контейнеры(!), я решил сделать это. Использование один раз в масштабах простой программы для создания тестов показала свою рентабельность.
Скачать