Миграция с Qt 3 на Qt 4
Этот документ описывает, какие части Qt будут использованы при написании приложения с помощью Qt 3, так что его можно модернизировать для использования Qt 4 позднее с минимальными усилиями. Тем не менее, рекомендации могут быть также полезны для разработчиков портирующих существующие приложения с Qt 3 на Qt 4.
Для детального обзора процесса портирования для существующих приложений Qt 3, смотрите документ Портирование на Qt 4.
Так как Qt 4 предоставляет существенную новую функциональность ценой некоторой части совместимости с Qt 3, это полезно для разработчиков приложений на основе Qt 3 чтобы научиться, как сейчас получить преимущество API Qt 3, наряду с подготовкой к будущим изменениям, которые будут необходимы при обновлении до Qt 4.
Некоторые дополнительные возможности Qt 3 были в Qt 4.0 перемещены в библиотеку поддержки Qt 3 (Qt3Support), и постепенно замещаются в последующих выпусках Qt 4.
Сделать приложения Qt 3 портируемыми на Qt 4 насколько возможно даёт возможность плавного перехода между версиями Qt в долгосрочном плане, и делают возможным стабильным процесс разработки.
Возможности Qt 3 для отмены
Несмотря на то, что мы гордимся уровнем стабильности достигнутой нами в Qt, важно понять, что Qt 4 была значительно улучшена по сравнению с Qt 3, некоторые возможности были переработаны чтобы сделать каркас более удобным для нас в обслуживании и более удобным для разработчиков. Поэтому полезно знать, какие возможности Qt 3 будет отменены чтобы помочь сэкономить время позднее во время выполнения работ по портированию. Обратите внимание на то, что по-прежнему можно использовать многие из следующих классов и возможностей посредством использования модуля Qt3Support.
Рисование за пределами событий рисования
В Qt 3, при определённых обстоятельствах, было возможно использовать QPainter для рисования заданного пользовательского виджета вне его переопределения paintEvent(). В Qt 4, в большинстве ситуаций рисование должно происходить внутри обработчика событий рисования виджета.
В X11 можно установить атрибут Qt::WA_PaintOutsidePaintEvent виджета для сохранения существующего кода, но мы рекомендуем ограничить где возможно использование кода рисования границами обработчиков событий рисования.
Больше информации об этом изменении можно найти в разделе Отрисовка и перерисовка виджетов документа Портирование на Qt 4.
Qt Designer
Версия Qt Designer поставляемая с Qt 3 предоставляла исчерпывающее редактирование кода и возможности управления проектами (контроль за файлами .ui.h и .pro), и поощрять пользователей к проектированию приложений главного окна изнутри окружения Qt Designer.
Версия Qt Designer, поставляемого с Qt 4, намеренно интегрируются с другими инструментами разработки программного обеспечения (например, интегрированными средами разработки), и не поддерживает эти возможности уровня проекта.
Мы рекомендуем использовать один из подходов создания подклассов форм с формами, созданными используя Qt Designer. Это избегает необходимость для использования файлов .ui.h и редакторов кода специального назначения.
Существующие формы Qt 3, созданные с использованием Qt Designer, могут быть постепенно портированы на Qt 4 следуя совету в руководстве Портирование файлов UI в Qt 4. Тем не менее, некоторые дополнительные усилия потребуются для перемещения логики приложения из файлов .ui.h в основное тело приложения Qt 4.
Пункты меню (QMenuItem)
Конструкция меню старого стиля создавая отдельные пункты меню замещены в Qt 4 использованием обобщенные действия, которые могут быть использованы в меню, панелях инструментов и как "быстрые" клавиши.
Qt 3 также поддерживают этот подход на основе действий, поэтому, используя QAction по всему вашему приложению, потребует меньше работы для адаптирования вашего приложения в Qt 4.
Классы, основанные на указателях (QPtr*)
Qt 3 предоставляет группу классов, основанных на указателях (QPtrList, QPtrDict, QPtrVector и т.д.), которые помогают управлять коллекциями указателей на объекты(обычно подклассы QObject) в приложении. Кроме того, классы коллекций, основанных на значении (QValueList, QValueDict, QValueVector и т.д.), предоставляют способ сохранения стандартных типов значений, которые не могут сохранять в коллекциях, основанных на указателях.
Qt 4 вводит один набор коллекции классов, которые не требуют от разработчиков чтобы платить больше внимания к выделению памяти и проблем собственности объекта. В результате, классы Qt 3, основанные на указателях, не имеют прямых эквивалентных классов в Qt 4.
Для лёгкой миграции, используйте классы Qt 3, основанные на значениях, для хранения большинства объектов, включая указатели; например, используйте QValueVector<QWidget *>, а не QPtrVector<QWidget *>. Они могут быть заменены классами Qt 4 QVector, QLinkedList и QList позднее.
Другие классы коллекций (QStrList, Q*Dict)
Некоторые классы коллекции в Qt 3 устарели в пользу более лёгкого использования альтернатив более высокого уровня. Это включает классы словарей (QAsciiDict, QDict, QIntDict, QPtrDict) и QStrList.
QStrList обычно можно заменить более высокоуровневым классом Qt 3 QStringList; доступно это также в Qt 4. Рекомендуется использовать класс QMap вместо классов QDict. В Qt 4 QMap также дополняются классом QHash.
Массивы в памяти (QMemArray)
В Qt 3 класс QMemArray использовался в качестве простого контейнера массива для простых типов данных. Этот класс устарел в Qt 4 в пользу классов QVector и QVarLengthVector, которые предоставляют более мощные и непротиворечивые объекты массива.
Самым близким эквивалентным к классу Qt 4 QVector является класс Qt 3 QValueVector. Для многих целей, его можно использовать вместо QMemArray.
Операции с URL (QUrlOperator)
Оператор URL в Qt 3 предоставляет абстрактный способ обработки файлов через HTTP, FTP и локальную файловую систему. Тем не менее, Qt 4 предоставляет только эту функциональность посредством использования Q3UrlOperator.
Начиная с Qt 4.4 Network Access API предоставляет подмножество возможностей, предоставляемых QUrlOperator, которые предназначены в основном для использования с приложениями, которые используют протоколы HTTP и FTP. Подробности смотрите в документации к QNetworkRequest, QNetworkReply и QNetworkAccessManager.
Также возможно выполнение операций с удалёнными файлами посредством классов QNetworkAccessManager и QFtp, и на локальных файлах с классом QFile.
Курсоры SQL (QSqlCursor)
В Qt 3 один из предпочтительных методов работы с SQL является использование курсора для управления содержимым базы данных. В Qt 4 предпочтительным методом работы с SQL является использование архитектуры модель/представление (QSqlQueryModel и QSqlTableModel) и, в результате, интерфейс курсора поставляется только в классе Q3SqlCursor.
Самым лёгким способом чтобы обеспечить последовательность между Qt 3 и Qt 4 является использование QSqlQuery вместо QSqlCursor, и позднее миграция на QSqlQueryModel.
Доменная служба имён (QDns)
Класс QDns в Qt 4 предоставляет более простой интерфейс, нежели класс QDns в Qt 3, и главным образом используется для разрешения имён узлов. В результате, многие более сложные возможности класса Qt 3 QDns доступны только через класс совместимости Qt 4, Q3Dns.
Чтобы разрешить имена узлов с помощью Qt 3 рекомендуется, чтобы вы использовали высокоуровневый интерфейс QSocket вместо QDns. Эквивалентная функциональность доступна в Qt 4 в классах QAbstractSocket и QHostInfo.
Диалоги мастеров (QWizard)
Qt 3 предоставляет поддержку диалогам "мастеров" в виде класса QWizard. До Qt 4.3 этот класс был доступным как Q3Wizard и предоставлял такой же интерфейс для создания сравнительно сложных мастеров.
В Qt 4.3 и старше, переработанный класс QWizard может быть использован для создания этого вида диалога, но существующие реализации мастеров Qt 3 нужно зарегистрировать для работы с новым API QWizard.
Представления абстрактных сеток (QGridView)
До введения класса Qt 3 QTable, QGridView был рекомендуемым способом создания таблицы пользовательских элементов. С введением QTable, класс QGridView был фактически устаревшим, а класс QTable теперь должны использоваться для вывода на экран табличной информации в вашем приложении Qt 3. Этот подход позволяет вам использовать QTableWidget в качестве замены, при последующем портировании вашего приложения на Qt 4.
Специализированные прокручиваемые представления
В Qt 3 класс QScrollView предоставляет область просмотра, которая может использоваться для вывода на экран части большого виджета, и будет предоставлять необязательные полосы прокрутки в целях навигации. В Qt 4 эта функциональность заменена классами, такими как, QScrollArea, который предоставляет для использования разработчику более интуитивный интерфейс. QScrollView доступен в Qt 4 как класс Q3ScrollView.
В Qt 3 рекомендуется, чтобы QScrollView использовался с дочерними виджетами вместо создания подкалссов. Тем не менее, необходимо заметить, что этот подход может не подойти, если в вашем приложении вам нужно использовать сверхбольшие области прокрутки, так как виджеты Qt 3 не могут быть шире или выше, чем 32767 пикселей.
Значительно изменившиеся возможности
Некоторые возможности Qt значительно изменились в Qt 4, и по этой причине рекомендуемый способ использования их также значительно изменился. Это наиболее справедливо для API перетаскивания.
Сверх того, некоторые более специализированные возможности Qt 3 часто используемые для помощи в настройке виджетов и добавления сглаживания в приложения. Хотя эти улучшения делают приложения более представительным для пользователей, многие из них не нужны в Qt 4, и могут создать дополнительную работу по портированию.
Перетаскивание (Drag and Drop)
Qt 4 вводит более простую и более интуитивную реализацию перетаскивания между виджетами и другими приложениями. В результате, нет простого подхода, который можно использовать чтобы сделать портирование из Qt 3 в Qt 4 перетаскивания в приложении легче.
Всесторонняя настройка представлений элементов
Каждый из классов, выводящих на экран список, дерево и табличные элементы в Qt 3 могут создать подклассы для целей настройки их внешнего вида. Каркас представления элементов в Qt 4 реализован согласно другой парадигме (модель/представление), которая не позволяет настраивать элементы используя этот метод.
Хотя Qt 4 предоставляет классы совместимости (Q3ListBoxItem, Q3ListViewItem и Q3TableItem), которые можно использовать тем же способом что и их аналоги в Qt 3, они не могут быть использованы внутри стандартного каркаса модель/представление. Рекомендуем, чтобы для минимизации работ по портированию, всесторонняя настройка классов элементов будет отменена в Qt 3, если всё это возможно.
Двойная буферизация
Приложения Qt 3 часто используют двойную буферизацию для уменьшения мерцания при рисовании пользовательских виджетов. Этот подход не нужен в Qt 4, поскольку двойная буферизация выполняется механизмом рисования автоматически.
Это имеет смысл для использования двойной буферизации в Qt 4 в некоторых контекстах. Например, в Главе 5 GUI Programming with Qt 3, двойная буферизация была представлена как оптимизация скорости, а не просто как возможность для уменьшения мерцания.
Информационно-связанные формы
Классы QDataTable, QDataBrowser и QDataView в Qt 3 позволяют интегрировать между виджетами и базами данных на основе SQL.
В Qt 4.1 и ранее, предпочитаемым способом создания информационно-связанных виджета является соединение общего представления элементов (таких как табличное представление) с моделью SQL. В Qt 4.2 и позднее, класс QDataWidgetMapper может быть использован для отображения данных на виджеты в интерфейсе пользователя основанном на формах.
Новые приложения, написанные с помощью Qt 3, будут использовать QSqlQuery предпочтительно к подходу, основанному на информационно-связанных виджетах старого стиля. Это предлагает выбор стратегий портирования при последующей миграции приложения на Qt 4: Вы можете либо продолжить использовать QSqlQuery, либо получить перспективу использовать классы модель/представления для обработки интеграции с базой данных.
Присоединяемые окна и области присоединения
В Qt 4 способ, которым создаются и используются присоединяемые окна в приложениях главного окна значительно отличается от характера использования, предоставленного Qt 3. В результате, введение более простого и чистого API означает, что приложения Qt 3, которые интенсивно используют области присоединения окон, требуют тщательного изучения при портировании на Qt 4.
Мы рекомендуем, чтобы при использовании отдавалось предпочтение классу QMainWindow, а не вспомогательному классу Q3MainWindow, при портировании на Qt 4 существующих приложений главного окна. Поэтому мы рекомендуем избегать специализированного использования областей присоединения при написании приложения Qt 3, имея в виду Qt 4.
Пользовательские стили
Используемая для предоставления совместимых тем система стилей стандартных виджетов Qt была переработана в Qt 4. В результате, пользовательские стили для Qt 3 требуют выполнения некоторой работы перед портированием на используемые в Qt 4. Для облегчения процесса портирования, мы рекомендуем чтобы вы избегали реализации стилей пользовательского виджета для приложений Qt 3 если это не абсолютно необходимо для ваших пользователей.
В Qt 4.2 и позднее, Qt Style Sheets может быть использована для реализации многих общими модификациями существующих стилей, и это может быть обоснованно для приложений Qt 3.
События
В Qt 3, событий QCloseEvent не были доступны по умолчанию. В Qt 4 обработчик событий QWidget::closeEvent() получает события QCloseEvent, и принимает их по умолчанию закрывая приложение. Чтобы этого избежать, пожалуйста переопределите QWidget::closeEvent().
Авторские права © 2010 Nokia Corporation и/или её дочерние компании |
Торговые марки |
Qt 4.6.4 |
|