Где-то здесь не так давно был пост про нововведения в Qt5. Вроде все замечательно, но какова реальная ситуация с существующими приложениями? В этой статье я рассмотрю пример портирования одного из моих проектов на Qt5 с сохранением совместимости исходного кода с Qt4. Итак, как и следовало ожидать, мое приложение с графическим интерфейсом не собирается.
И он не собирается, потому что я использую стандартные виджеты Qt. После некоторого расследования оказывается, что виджеты теперь находятся в отдельном модуле и их необходимо явно включать.
Давайте сделаем это совместимым с Qt4 способом — добавим следующий код в файл qmake нашего проекта (*.
pro|*.
pri):
Кроме того, теперь, благодаря добавленному определению, вы можете вставлять #ifdef HAVE_QT5 в любом месте вашего кода, а затем писать код, специфичный для Qt5. Того же эффекта с ifdef можно добиться, создав предварительно скомпилированный заголовок с содержимым:greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets DEFINES += HAVE_QT5 }
#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
-
Он Оставил Свою Бабушку
19 Oct, 24 -
У 003.Ru Сменился Владелец...
19 Oct, 24 -
10 Хитростей Лучших Фрилансеров
19 Oct, 24 -
Слепые Смогут Посетить Три Объекта
19 Oct, 24