Home · All Classes · Main Classes · Grouped Classes · Modules · Functions

[Следующая: Tulip - классы-контейнеры]

Новое в Qt 4

Данный документ охватывает большую часть различий между Qt 3 и Qt 4. Несмотря на то, что этот текст не задумывался, как краткое руководство по переходу, он подскажет решение многих проблем, которые могут возникнуть. Также здесь сказано, как сохранить поддержку модулей, написанных в Qt 3.

Новые Технологии

Qt 4 предоставляет следующие ключевые технологии:

Qt 4 также содержит новый инструмент разработки пользовательских интерфейсов Qt Designer.

Новое в Qt 4.1

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
QtTestTool classes for unit testing

QtCore содержит заготовки классов-контейнеров наподобие QString, QList и QFile, так же как центральные классы типа QObject и QTimer. Класс QApplication был переделан для использования в не содержащих GUI приложениях. Он был разделен на QCoreApplicationQtCore) и QApplicationQtGui).

Такое разделение дало возможность создавать приложения 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

Синтаксис Include

Синтаксис включения определения 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.

Конструкторы QObject/QWidget

В Qt 4 мы попытались упростить создание подклассов QObject/QWidget. Это делает создание подклассов проще и в тоже время эффективнее за счет использования библиотек Qt.

Конструкторы не принимают длинных строк типа "const char *name" в качестве параметров. Если вы хотите задать имя для объекта QObject, то нужно использовать QObject::setObjectName() после выполнения конструктора. Имя объекта теперь имеет тип QString. Данные изменения сделаны потому что:

Тип данных 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>

Класс 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 3

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
Hosted by uCoz