Что нового в Qt 4Данный документ освещает наиболее важные различия между Qt 3 и Qt 4. Хотя он не планировался в качестве всестороннего руководства по переносу программ, он расскажет вам о наиболее важных проблемах переносимости с которыми вы можете встретиться. В нем также объясняется как включить поддержку совместимости с Qt 3. Новые технологии в Qt 4Qt 4 представляет следующие базовые технологии:
Последние дополнения в Qt 4Следующие возможности были добавлены в Qt после первого релиза Qt 4. В Qt 4.8:
В Qt 4.7:
В Qt 4.6:
В Qt 4.5:
В Qt 4.4:
В Qt 4.3:
В Qt 4.2:
В Qt 4.1:
Для получения дополнительной информации об улучшениях в каждом релизе Qt смотрите детальные списки изменений. Существенные улучшенияСледующие модули были существенно улучшены в Qt 4:
Система сборкиВ отличие от предыдущих релизов, Qt 4 содержит меньшее количество библиотек. Полный список библиотек в текущей версии Qt может быть найден на странице Все модули. В следующей таблице приведён начальный набор библиотек в выпуске Qt 4.
QtCore содержит инструментальные классы, такие как QString, QList и QFile, также как и классы ядра, такие как QObject и QTimer. Класс QApplication был подвергнут рефакторингу, так что теперь он может быть использован и в неграфических (non-GUI) приложениях. Он разделен на QCoreApplication (в модуле QtCore) и QApplication (в модуле QtGui). Это разделение делает возможным разработку серверных приложений с использованием Qt без компоновки с любым ненужным кодом, относящимся к ГПИ, и без необходимости присутствия на целевой машине системных библиотек, связанных с ГПИ (например, Xlib на X11, Carbon на Mac OS X). Если вы используете qmake для формирования make-файлов, qmake по умолчанию будет компоновать ваши приложения вместе с QtCore и QtGui. Чтобы удалить зависимость от QtGui, добавьте строку QT -= gui в ваш .pro-файл. Чтобы подключить другие библиотеки, добавьте строку QT += network opengl sql qt3support Еще одно изменение в системе сборки - теперь moc понимает директивы препроцессора. qmake автоматически передает установленные для вашего проекта определения (используя "DEFINES +=") в moc, который имеет собственный встроенный препроцессор C++. Чтобы скомпилировать код, использующий UI-файлы, вы должны также добавить в ваш .pro-файл такую строку: CONFIG += uic3 Синтаксис IncludeСинтаксис подключения описаний классов Qt стал таким #include <QClassName>
Например: #include <QString> #include <QApplication> #include <QSqlTableModel> Это гарантированно работает с любыми открытыми классами Qt. Старый синтаксис, #include <qclassname.h>
по-прежнему работает, но мы предлагаем вам перейти на новый синтаксис. Если вы попробуете подключить заголовочный файл библиотеки, которая не скомпонована с приложением, это приведет к появлению во время компиляции предупреждения (например, "QSqlQuery: No such file or directory"). Решить эту проблему можно либо удалив проблемную директиву include, либо указав недостающую библиотеку в вашем .pro-файле в записи QT (смотрите Систему сборки выше). Чтобы включить определения всех классов библиотеки просто укажите имя этой библиотеки. Например: #include <QtCore>
Пространства именВ Qt 2 был введен класс с именем Qt для квази-глобальных (global-like) констант (например, Qt::yellow). Конструкция namespace C++ не использовалась, поскольку на тот момент не все компиляторы ее понимали. Начиная с Qt 4 класс Qt стал пространством имен Qt. Если вы хотите получить доступ к константе, являющейся частью пространства имен Qt, добавьте к ее имени префикс Qt:: (например, Qt::yellow), или добавьте директиву using namespace Qt; в ваши файлы с исходным кодом, сразу после директив #include. Если вы используете синтаксис using namespace, то вам не нужно добавлять префикс (например, достаточно yellow). При переносе приложений с Qt 3 вы можете столкнуться в некоторых исходных кодах с проблемами совместимости, связанными с некоторыми из этих символов. Например, в Qt 3 допустимо было написать QWidget::yellow вместо Qt::yellow, поскольку QWidget унаследован от Qt. Это не будет работать в Qt 4; вы должны написать Qt::yellow или добавить директиву "using namespace" и удалить префикс Qt::. Инструмент портирования qt3to4 автоматизирует это преобразование. Конструкторы QObject/QWidgetВ Qt 4 мы попытались упростить конструкторы подклассов QObject/QWidget. Это делает создание подклассов легче и в то же время помогает сделать библиотеку Qt более эффективной. Конструкторы больше не принимают параметр "const char *name". Если вы хотите задать имя для QObject, вы должны вызвать QObject::setObjectName() после создания объекта. Имя объекта теперь является QString. Причины данного изменения:
Тип данных QWidget'а - WFlags - был разделен на две части: Qt::WindowFlags устанавливает низкоуровневые флаги окна (тип окна и стиль рамки), в то время как Qt::WidgetAttribute задает различные высокоуровневые атрибуты виджета (например, WA_StaticContents). Атрибуты виджета можно установить в любое время, используя QWidget::setAttribute(); низкоуровневые флаги окна можно передать конструктору QWidget или установить позднее, используя QWidget::setParent(). Как результат, конструкторам большинства подклассов QWidget нет необходимости предоставлять параметр WFlags. Параметр parent во всех классах QObject в Qt по умолчанию равен указателю на 0 (0 pointer), как это было сделано в Qt 1. Это позволяет использовать стиль программирования, когда виджеты создаются без родителей и затем вставлять их в компоновку, где компоновщик автоматически перепривяжет им родителя. Динамическое приведениеQt 4 предоставляет функцию qobject_cast<>(), которая выполняет динамическое приведение основанное на мета-информации, генерируемой moc для подклассов QObject. В отличие от стандартной конструкции C++ dynamic_cast<>(), qobject_cast<>() работает даже когда RTTI отключен, и он корректно работает через границы DLL. Вот стиль Qt 3 приведения типа к подтипу: // УСТАРЕЛО if (obj->inherits("QPushButton")) { QPushButton *pushButton = (QPushButton *)obj; ... } Стиль Qt 4 чище и безопаснее, поскольку опечатки всегда будут приводить к ошибкам компилятора: QPushButton *pushButton = qobject_cast<QPushButton *>(obj); if (pushButton) { ... } QPointer<T>Класс QPointer<T> предоставляет указатель на тип T (где T унаследован от QObject), который автоматически устанавливается равным 0, когда объект, на который он ссылается, разрушается. Безопасные указатели полезны всякий раз, когда вы хотите сохранить указатель на объект, которым не владеете. Пример: QLabel *label = new QLabel; QPointer<QLabel> safeLabel = label; safeLabel->setText("Hello world!"); delete label; // safeLabel теперь равен 0, поскольку label - провисший (dangling) указатель Класс QPointer<T> примерно соответствует старому классу QGuardedPtr<T>, за исключением того, что он теперь реализован в более легковесной манере, чем до этого. Затраты на один объект QPointer<T> сейчас приблизительно такие же, как и на соединение сигнал-слот. События рисованияQt 4 поддерживает двойную буферизацию прозрачности (double buffering transparently) на всех платформах. Эта возможность может быть отключена на уровне отдельного виджета с помощью вызова QWidget::setAttribute(Qt::WA_PaintOnScreen). Результатом этого является то, что все рисование теперь должно выполняться из функции paintEvent(). Это также требуется для HIView API на Mac OS X. На практике, это редкая проблема, поэтому вы можете вызывать update() в любом месте кода для создания события рисования, с областью для обновления в качестве аргумента. Чтобы помочь переносу, QWidget поддерживает атрибут Qt::WA_PaintOutsidePaintEvent, который может быть установлен, чтобы сделать возможным рисование вне функции paintEvent() в Windows и X11. Слой поддержки Qt 3Приложения, основанные на Qt 3, можно компоновать вместе с предоставляемой в Qt 4 библиотекой расширения - Qt3Support. Это предоставляет большую совместимость, чем до этого, не увеличивая размер Qt.
Чтобы включить поддержку классов и функций Qt 3, добавьте строку QT += qt3support в ваш .pro-файл. В Visual C++ 7 и GCC 3.2+ использование функций совместимости часто вызывает предупреждение компилятора (например, "'find' is deprecated"). Если вы хотите отключить такие предупреждения, добавьте строку DEFINES += QT3_SUPPORT в ваш .pro-файл. Если вы хотите использовать функции совместимости, но не хотите компоновать приложение вместе с библиотекой Qt3Support, добавьте строку DEFINES += QT3_SUPPORT_WARNINGS или DEFINES += QT3_SUPPORT в ваш .pro-файл, в зависимости от того, хотите ли вы чтобы при вызове функций совместимости компилятор генерировал предупреждения или нет. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |