qreal/qreal — pull request #651 by vapolyakov (2013-03-24 06:29:49+00:00)
Title: Qt4 -> Qt5 build support

Перевод сборки проекта с qt4 на qt5. Основные перемены:
- перевод гуи-классов, связанных с виджетами, в отдельный пакет QtWidgets (подключаемый черех QT += widgets)
- изменение сигнатур и названий разных методов разных классов (повсеместное). Старое - deprecated. С ними проект не собирается. Можно отключить - QT_DISABLE_DEPRECATED_BEFORE=0, но с Qt 5.1 так работать тоже не будет, так что не вариант.
- всякие макросы в стиле qVariantValue тоже лучше не использовать
- QT_TYPENAME больше нет
- переход на новую систему плагинов (Q_EXPORT_PLUGIN,Q_EXPORT_PLUGIN2 -> Q_PLUGIN_METADATA)
- новая система задания коннектов к сигналам

Выявленная проблема:
- классы Ellipse и Rectangle встречаются в qt5.0.1\tools\mingw\i686-w64-mingw32\include\wingdi.h (WINGDIAPI WINBOOL WINAPI Ellipse(HDC hdc,int left,int top,int right,int bottom);), пришлось их некрасиво переименовать

Notes:
- для qt 5.0 нужен libgl, т.е. установленный open gl
- если ставить параллельно две версии Qt в вин и работать в креаторе, то при сборке нужно использовать кастомную настройку версии qt (а именно пути до билдера), тк для qt 5 нужен gcc >= 4.6, а автоматом скорее всего будет подключен gcc из qt 4.8

А вообще можно почитать, например, http://habrahabr.ru/post/164721. Для большинства изменений в классах написано, на что следует заменить их использование.

Возможность сборки и в qt4, и в qt5. Размышления.
Можно воспользоваться читом из статьи на хабре, но:
- все равно когда-то нужно будет переходить без полумер
- оборачивать все deprecated и переименованные методы в ifdef'ы выглядит не очень правильным, а QT_DISABLE_DEPRECATED_BEFORE=0 с qt5.1 перестанет работать
- QtWidgets/QtGui. Разрабы предлагают писать #include вместо #include , а qt += widgets писать в greaterthan, как в статейке написано. Но: 1. не по код-стайлу 2. не работает для некоторых классов. А если делать через ifdef, то не билдится, тк строку внутри второй ветки тоже видит и не находит нужного класса
- ...