- Версия 1.32.4 для Qt 4.8 и Qt 5.2
- Код подготовлен для одновременной сборки как под Qt 4.8, так и под Qt 5.2

Особенности компиляции под Qt 5.2

В pro файл добавлено:

message(Building running in Qt major version: $${QT_MAJOR_VERSION})

и еще добавлено:

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets \
                                        printsupport

В main.h:

 // Запрошен обычный объект, надо его найти
 // findObj=qFindChild<X *>(pMainWindow, objectName);
 findObj=pMainWindow->findChild<X *>(objectName);

В qtsingleapplication.h закомментирован прототип конструктора в котором используется тип Type:

    // This constructor dont compile under Qt 5.2.0 (Type is undeclared)
    // This constructor dont use in this program and commented
    // QtSingleApplication(int &argc, char **argv, Type type);

В qtsingleapplication.cpp закомментирован конструктор в котором используется тип Type:

/*!
    Creates a QtSingleApplication object. The application identifier
    will be QCoreApplication::applicationFilePath(). \a argc, \a
    argv, and \a type are passed on to the QAppliation constructor.
*/
// QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type)
//    : QApplication(argc, argv, type)
// {
//    sysInit();
// }

В main.cpp заменена функция fromQStringToChar():

// Преобразование из QString в обычный char
char* fromQStringToChar( const QString& str )
{
 /*
 char *tmpC=new char [str.size() + 1];
 QVariant var;

 for(int i=0;i<str.length();i++)
  {
   var=str.at(i);
   tmpC[i] = var.toChar().toAscii();
  }

 tmpC[str.size()] = 0;

 return tmpC;
 */

 return str.toLocal8Bit().data();
}

В main.cpp  в функции decryptString() заменен вызов  line.toAscii() на  line.toLatin1(), т. к. в Qt 5.2. не поддерживается toAscii(). Эта замена допустима, так как в кодировке Base64 используются только символы латиницы:

 // Заменен вызов line.toAscii на line.toLatin1 чтобы шла компиляция в Qt 5.2.
 // Эта замена допустима, так как в Base64 используются только символы латиницы и ограниченный набор прочих символов
 convertByteArrayToVector(QByteArray::fromBase64( line.toLatin1() ), vectorLineIn);

В main.cpp  в функции main() земено определение имени запущенного бинарника:

 // Файл запущенной программы (нулевой аргумент функции main)
 // QString mainProgramFile=QString::fromAscii( argv[0] );
 QString mainProgramFile=QString::fromLatin1( argv[0] );

В main.cpp установка кодека текста для функции tr() обернуто в условие, чтобы в Qt5 не срабатывало (в Qt5 и так все в UTF-8, и данный метод исключен из объекта QTextCodec:

 #if QT_VERSION < 0x050000
  // Установка кодека текстов
  QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
 #endif

В main.cpp изменена установка обработчика сообщений:

 #if QT_VERSION < 0x050000
  qInstallMsgHandler(myMessageOutput);
 #else
  qInstallMessageHandler(myMessageOutput);
 #endif

В main.cpp в функции myMessageOutput() изменен заголовок и внутри добавлена работа с переменной msg:

void myMessageOutput(QtMsgType type, const char *msg)
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msgText)
{
 Q_UNUSED(context);

 // #if DEBUG_PRINT==1

 #if QT_VERSION >= 0x050000
  const char *msg=msgText.toLocal8Bit();
 #endif

В файл AddNewRecord.h добавлено:

 #if QT_VERSION < 0x050000
  AddNewRecord( QWidget * parent = 0, Qt::WFlags f = 0 );
 #else
  AddNewRecord( QWidget * parent = 0, Qt::WindowFlags f = 0 );
 #endif
В файле KnowTreeModel вместо одиночного вызова reset() в конце метода init(), сделаны вызовы beginResetModel() и endResetModel(). Данное исправление должно нормально компилироваться начиная с Qt 4.6:
void KnowTreeModel::init(QDomDocument domModel)
{
  QMap<QString, QString> rootData;

  // Определяется одно поле в корневом объекте
  // то есть на экране будет один столбец
  rootData["id"]="0";
  rootData["name"]="";

  beginResetModel();

  // Создание корневого Item объекта
  if(rootItem!=NULL) delete rootItem;
  rootItem = new TreeItem(rootData);

  // Динамическое создание дерева из Item объектов на основе DOM модели
  setupModelData(domModel, rootItem);

  endResetModel();
}

В файле RecordTableModel вместо одиночного вызова reset() в конце метода setTableData(), сделаны вызовы beginResetModel() и endResetModel(). Данное исправление должно нормально компилироваться начиная с Qt 4.6:
void RecordTableModel::setTableData(RecordTableData *rtData)
{
 beginResetModel();

 table=rtData;

 endResetModel();
}

В RecordTableModel добавлен метод RecordTableModel::addTableData().
В RecordTableScreen в методе addNew() сделан вызов метода addTableData() вместо прямой работы с моделью данных.

В методе deleteRecords() количество перебираемых элементов таблицы теперь берется из recordModel->rowCount() :
 // Выясняется количество элементов в таблице
 int totalRowCount=recordModel->rowCount();

Ранее количество перебираемых элементов бралось напрямую из объекта типа RecordTableData, через метод size(). Этот вызов (return table->size();) и был ранее спрятан в реализации rowCount(). Теперь rowCount() используется правильно и по назначению.

И прочие изменения.