Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |
[Следующая: Tulip - классы-контейнеры]
Данный документ охватывает большую часть различий между Qt 3 и Qt 4. Несмотря на то, что этот текст не задумывался, как краткое руководство по переходу, он подскажет решение многих проблем, которые могут возникнуть. Также здесь сказано, как сохранить поддержку модулей, написанных в Qt 3.
Qt 4 предоставляет следующие ключевые технологии:
Qt 4 также содержит новый инструмент разработки пользовательских интерфейсов Qt Designer.
Qt 4.1 дополняет Qt 4 новыми технологиями со следующими особенностями:
Для получения более полной информации о новшествах данной версии см. подробный список изменений.
Следующие модули были существенно доработаны в Qt 4:
В отличие от предыдущих релизов Qt, Qt 4 представляет собой коллекцию небольших библиотек:
Библиотека | Описание |
---|---|
QtCore | Основа не-GUI функциональности |
QtGui | Основа GUI функциональности |
QtNetwork | Модуль работы с сетью |
QtOpenGL | Модуль OpenGL |
QtSql | Модуль SQL |
QtSvg | Классы отрисовки SVG |
QtXml | Модуль XML |
Qt3Support | Классы поддержки Qt 3 |
QAxContainer | Клиентское расширение ActiveQt |
QAxServer | Серверное расширение ActiveQt |
QtAssistant | Классы, используемые Qt Assistant |
QtDesigner | Классы для расширения возможностей и встраивания в Qt Designer |
QtUiTools | Классы для динамической постройки GUI |
QtTest | Tool classes for unit testing |
QtCore содержит заготовки классов-контейнеров наподобие QString, QList и QFile, так же как центральные классы типа QObject и QTimer. Класс QApplication был переделан для использования в не содержащих GUI приложениях. Он был разделен на QCoreApplication (в QtCore) и QApplication (в QtGui).
Такое разделение дало возможность создавать приложения Qt без включения ненужного GUI-совместимого кода и без нужныч GUI-совместимым системам библиотек представляющих целевый механизмы (т.е. Xlib на X11, Carbon на Mac OS X).
Если вы используете qmake для создания make-файла, qmake будет по умолчанию включать в приложение QtCore и QtGui. Чтобы избавиться от этой зависимости от QtGui, добавьте строку
QT -= gui
в ваш файл проекта (.pro). Чтобы включить другие библиотеки, добавьте строку
QT += network opengl sql qt3support
Другие изменения вносятся в систему сборки с помощью понятных препроцессору директив. qmake автоматически обрабатывает определенные настройки вашего проекта (using "DEFINES +=") с помощью moc, когда вы хотите компилировать с C++ препроцессором.
Для сборки приложения с использованием файлов .ui , необходимо вставить следующую строку в .pro файл:
CONFIG += uic3
Синтаксис включения определения Qt-класса следующий:
#include <QClassName>
Например:
#include <QString> #include <QApplication> #include <QSqlTableModel>
Это гарантирует работу с любым доступным Qt-классом. Старый синтаксис,
#include <qclassname.h>
так же допустим, но вы можете быстро привыкнуть к новому.
Если Вы попытаетесь включить заголовочный файл несуществующей библиотеки, то получите предупреждение при компиляции (например "QSqlQuery: No such file or directory"). Вы можете исправить данную ситуацию одним из двух способов: удалить некорректный Include или включить ссылку на библиотеку в файл проекта в секцию "QT entry" (см. Система сборки ).
Для включения в приложение определений всех файлов библиотеки, просто включите имя этой библиотеки. Например:
#include <QtCore>
Qt 2 заключала все вызовы классов Qt в подобие глобальных констант (например Qt::yellow). Пространство имен 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::.
Инструменты автоматичесткого перевода с Qt 3 описаны здесь qt3to4.html.
В Qt 4 мы попытались упростить создание подклассов QObject/QWidget. Это делает создание подклассов проще и в тоже время эффективнее за счет использования библиотек Qt.
Конструкторы не принимают длинных строк типа "const char *name" в качестве параметров. Если вы хотите задать имя для объекта QObject, то нужно использовать QObject::setObjectName() после выполнения конструктора. Имя объекта теперь имеет тип QString. Данные изменения сделаны потому что:
QLabel *label1 = new QLabel("Hello", this); QLabel *label2 = new QLabel(this, "Hello");
label1 - это QLabel, отображающий текст "Hello"; label2 - это QLabel без текста, но с именем "Hello".
MyWidget::MyWidget(QWidget *parent, const char *name) : QWidget(parent, name) { ... }
Тип данных WFlags класса QWidget разделен на два: Qt::WindowFlags флаги окна нижниго уровня (тип окна стиль рамок), Qt::WidgetAttribute принимает во внимание спецификациии различных атрибутов виджетов высокого уровня (например: WA_StaticContents). Атрибуты виджетов можно установить в любое время QWidget::setAttribute(); флаги окна нижнего уровня можно установить в конструкторе QWidget или позже используя QWidget::setParent(). В последствие, конструкторы большинства подклассов QWidget не предоставляют параметров WFlags.
Параметр parent конструкторов всех классов QObject по умолчанию является указателем на null, как он использовался в 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> предоставляет указатель на тип T (T наследует QObject), который автоматически устанавливается на 0 при удалении объекта на который ссылается. Защищенные указатели следует использовать всегда, когда Вы хотите иметь указатель на объект созданный на Вами.
Например:
QLabel *label = new QLabel; QPointer<QLabel> safeLabel = label; safeLabel->setText("Hello world!"); delete label; // safeLabel теперь равно 0, так как label теперь пустой указатель
QPointer<T> это, примерно, то же, что и класс QGuardedPtr<T>, за исключением того, что его проще использовать. Ценность объекта QPointer<T> примерно та же, что у связи сигнал-слот.
Qt 4 поддерживает двойную буферизацию поддерживаемую всеми платформами. Данный режим может быть отменен с помощью вызова QWidget::setAttribute(Qt::WA_PaintOnScreen).
В связи с отменой режима двойной буферизации перерисовка будет выполняться каждый раз при вызове функции paintEvent(). Так же это необходимо в HIView API on Mac OS X. На практике это редко создает проблемы: Вы можете вызвать update() из любого места программы для вызова события рисования для обновления передаваемого параметра.
Для получения помощи в переносе QWidget поддерживающих Qt::WA_PaintOutsidePaintEvent атрибуты должна быть настроена возможность вызова извне paintEvent() в Windows и X11.
Qt 4 предоставляет расширение библиотеки для поддержания приложений основанных на Qt 3, вызовите Qt3Support и Ваше приложение Qt сможет с ним связаться. Это позволит использова классы больше не поддерживаемые 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 4.0 см. веб-сайт Trolltech.
[Далее: Tulip - классы-контейнеры]
Copyright © 2005 Trolltech | Trademarks | Qt 4.1.0 |