Портирование Приложения Qt4 На Qt5

Где-то здесь не так давно был пост про нововведения в Qt5. Вроде все замечательно, но какова реальная ситуация с существующими приложениями? В этой статье я рассмотрю пример портирования одного из моих проектов на Qt5 с сохранением совместимости исходного кода с Qt4. Итак, как и следовало ожидать, мое приложение с графическим интерфейсом не собирается.

И он не собирается, потому что я использую стандартные виджеты Qt. После некоторого расследования оказывается, что виджеты теперь находятся в отдельном модуле и их необходимо явно включать.

Давайте сделаем это совместимым с Qt4 способом — добавим следующий код в файл qmake нашего проекта (*.

pro|*.

pri):

  
  
  
   

greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets DEFINES += HAVE_QT5 }

Кроме того, теперь, благодаря добавленному определению, вы можете вставлять #ifdef HAVE_QT5 в любом месте вашего кода, а затем писать код, специфичный для Qt5. Того же эффекта с ifdef можно добиться, создав предварительно скомпилированный заголовок с содержимым:

#define HAVE_QT5 (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))

И снова мой проект не сработает. На этот раз причина в отсутствии определений Q_WS_*.

С Q_WS_WIN и Q_WS_MAC вроде бы все предельно ясно, просто меняем их на Q_OS_WIN и Q_OS_MAC соответственно.

Но что делать с Q_WS_X11? Довольно часто Q_WS_X11 используется как просто признак Unix-подобных систем за исключением Mac OS (X), но бывает и так, что за этим определением скрывается X11-специфичный код. Но в моем случае это по сути одно и то же, поэтому можно просто заменить его на какое-то другое определение (мы не можем просто переопределить Q_WS_X11, так как некоторые части Qt все еще используют это определение) и объявить его в нужном месте, в проекте файл, например:

unix:!mac:DEFINES += HAVE_X11

Вперед, продолжать.

Мой проект довольно старый и использует множество устаревших классов, методов классов или чего-то еще, что уже исключено или запрещено в Qt5. Сборка снова не работает. Кое-что из того, что устарело, можно найти в Документация Qt5 .

Как правило, в той же документации написано, что следует использовать вместо этого, хотя есть исключения, о которых я расскажу ниже.

Если в документации Qt5 не обнаружено устаревших классов и их методов, то, вероятно, это остатки Qt3 и их можно найти в Документация Qt4 .

Из того, с чем я столкнулся, стоит отметить: QIconSet, QMenuItem (qt3. меняется на QIcon и QAction соответственно), QAbstractItemModel::reset (используйте BeginResetModel/endResetModel), QKeySequence больше не приводится в int (мы перебираем элементы последовательность), часть QUrl перемещена в новый класс QUrlQuery, Qt::escape удален (его встроенная оболочка над Qt::escape и QString::toHtmlEscaped), qInstallMsgHandler(qInstallMessageHandler)… Дальше КПА .

Все бы ничего, но с появлением этой штуки из Qt исчез очень полезный класс QX11Info, а в документации по этому поводу ничего вменяемого не сказано.

Он исчез, потому что был тесно привязан к Xlib. Вместо него в Qt5 появился QPlatformNativeInterface, который, однако, вскоре был запрещен и теперь доступен только как приватный класс/заголовок.

В своем проекте в качестве быстрого решения, все еще привязанного к Xlib, я просто написал обертку над QX11Info, которая в случае с Qt5 имеет собственную реализацию: x11info.h

#ifndef X11INFO_H #define X11INFO_H typedef struct _XDisplay Display; class X11Info {

Теги: #Qt #qt5 #программирование #портирование #программирование #C++ #Qt

Вместе с данным постом часто просматривают: