Porting QML Applications to Qt 5
When porting QML-related code from Qt 4.8 to Qt 5, application developers should be aware that the QML infrastructure has undergone considerable changes in Qt 5. The sections below describe these changes and the impact they have on your existing code.
This article describes the changes that affect your existing code. If you are interested in the summary of all new features in Qt 5 for QML application development, see Qt QML Release Notes and Qt Quick Release Notes.
QML Language changes
There are very few changes in the QML language that affect the porting of existing Qt 4.8 QML code to Qt 5. These are:
- Individual file imports no longer work (for example, import "MyType.qml"). Import the containing directory instead.
- Relative file paths in JavaScript files are now resolved relative to the location of the JavaScript file instead of the QML file that imported it.
- It's no longer possible to override signals from the base component.
QtQuick Module
The QtQuick module has been updated to version 2. All QML applications should update their import statements to use the new version:
import QtQuick 2.3
Property and Method Changes
- ListView's highlightMoveSpeed and highlightResizeSpeed properties have been renamed to highlightMoveVelocity and highlightResizeVelocity, respectively.
- TextInput and TextEdit's openSoftwareInputPanel() and closeSoftwareInputPanel() methods have been removed. Use the new Qt.inputMethod property and call Qt.inputMethod.show() Qt.inputMethod.hide() to show and hide the virtual keyboard.
Type and API Changes
- XmlListModel has moved into its own module, QtQuick.XmlListModel. Any code that uses the XmlListModel and XmlRole types must import QtQuick.XmlListModel instead.
- The local storage API that enables SQL support has been moved from the QML Global Object into a QtQuick.LocalStorage singleton type. Any code that requires the local storage API must import QtQuick.LocalStorage instead. See theQt Quick Local Storage documentation for examples.
- The LayoutItem type has been removed from the QtQuick module as it was specific to the Graphics View framework backend used in Qt Quick 1.
Behavioral Changes
QtQuick 2 includes a number of behavioral changes and you should thoroughly test your applications after porting. These changes will not necessarily lead to run-time errors, but may break certain assumptions in your code. Below are the prominent changes to be aware of when porting your applications.
Item opacity and visibility:
- The input handling details of opacity and visible have changed. An opacity of zero no longer affects input handling, where previously it stopped mouse input. A visibility of false no longer affects keyboard input, but still stops mouse input. The new enabled property stops mouse and keyboard input, but does not affect how or whether the item is rendered. A workaround for applying the old behavior in most cases is to bind enabled to (visible && opacity > 0.0).
- Previously, if an item was in a positioner (i.e. a Row, Column, Grid and Flow) and the item's opacity changed to 0, or its visible value became false, the positioner would remove the item from its layout and collapse the space for that item. In QtQuick 2, this now only happens when an item's visible is false; the item opacity no longer affects whether the item is laid out. (This is consistent with the existing behavior of ListView and GridView).
Text:
- The TextEdit::textFormat property now defaults to PlainText instead of AutoText.
- When Text::textFormat is set to Text.AutoText format, the text object will automatically switch to Text.StyledText instead of Text.RichText.
Other:
- Modifying the Image::sourceSize now fits the image to the size, maintaining aspect ratio.
- For ListView and GridView, the cacheBuffer property now has a non-zero default and delegates in the cache buffer are created asynchronously. Also, using a RightToLeft layout now also reverses the preferredHighlightBegin andpreferredHighlightEnd.
- For Loader, the sourceChanged and sourceComponentChanged signals are now only emitted when their respective properties change value. (Previously Loader emitted both of these signals when either of the relevant properties had changed.)
Changes to experimental Qt.labs modules
- The Qt.labs.particles module has been removed. It is replaced by the fully-fledged QtQuick.Particles module which is an enormous improvement on its predecessor.
- The Qt.labs.shaders module has been removed as the ShaderEffectItem and ShaderEffectSource types from this module have been moved into the QtQuick module. Note the ShaderEffectItem type has been renamed toShaderEffect.
C++ code
In Qt 5, all QML applications are rendered with an OpenGL scenegraph architecture rather than the Graphics View framework used in Qt 4. Due to the scale of this architectural change, the C++ API has been extensively restructured and theQtDeclarative module has been deprecated in favor of two new modules: Qt QML, which implements the QML engine and language infrastructure, and Qt Quick, which implements the visual canvas and scenegraph backend.
All classes that were previously in the QtDeclarative module have been moved into the Qt QML and Qt Quick modules, and their class names have been changed to reflect their new module locations. The class name changes are as follows:
Qt QML
Qt Quick
- QDeclarativeComponent -> QQmlComponent
- QDeclarativeContext -> QQmlContext
- QDeclarativeEngine -> QQmlEngine
- QDeclarativeError -> QQmlError
- QDeclarativeExpression -> QQmlExpression
- QDeclarativeExtensionPlugin -> QQmlExtensionPlugin
- QDeclarativeInfo -> QQmlInfo
- QDeclarativeListReference -> QQmlListReference
- QDeclarativeNetworkAccessManagerFactory -> QQmlNetworkAccessManagerFactory
- QDeclarativeParserStatus -> QQmlParserStatus
- QDeclarativeProperty -> QQmlProperty
- QDeclarativePropertyMap -> QQmlPropertyMap
- QDeclarativePropertyValueSource -> QQmlPropertyValueSource
- QDeclarativeScriptString -> QQmlScriptString
- QDeclarativeItem -> QQuickItem
- QDeclarativeView -> QQuickView
- QDeclarativeImageProvider -> QQuickImageProvider
To use the new QQml* and QQuick* classes in Qt 5, link against the approprate module from your qmake .pro file. For example the following will link against both the Qt QML and Qt Quick modules:
QT += qml quick
Required header files can then be included:
#include <QtQml/QQmlEngine>
#include <QtQuick/QQuickView>
(The QtDeclarative module is still available to developers as the Qt Quick 1 module, as discussed below. However, it should not be used for new applications.)
QDeclarativeItem and QDeclarativeView
When porting to QQuickItem, note that QDeclarativeItem inherited from QGraphicsItem; in contrast, QQuickItem inherits directly from QObject, and any QGraphicsItem-specific functionality is no longer available. In particular, QQuickItem does not have a paint() method for performing custom rendering through the QPainter API. Instead, in Qt 5, custom rendering should be performed through the new QSG* classes to take full advantage of the scene graph. See the Qt Quick Scene Graphdocumentation details on using these classes.
Alternatively, the QQuickPaintedItem provides a paint() method and can be used as a convenient way to port QDeclarativeItem-based classes that use the QPainter API. Note this method is less performant than using the QSG* classes.
When porting from QDeclarativeView to QQuickView, note that QDeclarativeView inherited from QGraphicsView. In contrast, QQuickView inherits from QQuickWindow and uses the QWindow infrastructure introduced in Qt 5; any QGraphicsView-specific functionality is no longer available.
qmlscene Utility
The qmlviewer tool provided for prototyping and testing QML applications in Qt 4.x has been replaced with the qmlscene tool which integrates with the new scenegraph features in Qt 5.
QML plugins
All QML plugins should extend QQmlExtensionPlugin in Qt 5.
Additionally, plugins should use the new Qt plugin infrastructure introduced in Qt 5. QML plugins no longer require the Q_EXPORT_PLUGIN2() macro. Instead, they should use the Q_PLUGIN_METADATA() macro within the plugin class declaration.
See the updated Creating C++ Plugins For QML documentation for an overview of creating QML plugins in Qt 5.
QtDeclarative module in Qt 5
For the purposes of porting older applications, the QtDeclarative module is still available in Qt 5 but has been renamed to Qt Quick 1. Applications that required Qt Quick 1 specific API (e.g. QDeclarativeView or QDeclarativeItem and the Graphics View integration) can use this module. Note that new applications should use the new Qt QML and Qt Quick modules instead.
To use the Qt Quick 1 module, add "declarative" to your qmake .pro file:
QT += declarative
Required header files can be included as follows:
#include <QtDeclarative/QDeclarativeView>
#include <QtDeclarative/QDeclarativeItem>
Porting QML Applications to Qt 5的更多相关文章
- QML官方系列教程——QML Applications
附网址:http://qt-project.org/doc/qt-5/qmlapplications.html 假设你对Qt的官方demo感兴趣,能够參考本博客的另一个系列Qt5官方demo解析集 每 ...
- Debugging QML Applications
Debugging QML Applications Console API Log console.log, console.debug, console.info, console.warn an ...
- C++和QML混合的QT程序调试方法
以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...
- 词频统计_输入到文件_update
/* 输入文件见337.in.txt 输出文件见338.out.txt */ #include <iostream> #include <cctype> #include &l ...
- Declarative Widgets is a QML plugin that adds Qt Widgets support to QML
05.04.2018 Nathan Collins 8 comments FacebookTwitterGoogle+LinkedInEmail Declarative Widgets is a ...
- Qt 5.7 > QML
本文档翻译自Qt官方文档: http://doc.qt.io/qt-5/qtqml-index.html Qt QML Qt QML模块使用QML语言为开发应用与库提供一个框架.它定义并实现了语言与引 ...
- Qt(QML)本地化
Internationalization and Localization with Qt Quick 程序国际化 1) Use qsTr() for all Literial UI strings ...
- Qt 5.7 > Qt Applications
本文翻译自Qt官方文档: http://doc.qt.io/qt-5/qmlapplications.html QML 应用 QML是声明式语言,它使得用户界面以及交互行为可以被"描述&qu ...
- Qt Quick编程(1)——QML的核心部分ECMAScript
说道QML,不得不先说一下ECMAScript: ECMAScript语言的标准是由Netscape.Sun.微软.Borland等公司基于JavaScript和JScript锤炼.定义出来的. EC ...
随机推荐
- annotation-config和component-scan
以前学到<context:annotation-config></context:annotation-config>和<context:component-scan b ...
- django 创建QueryDict类型报错
报错信息:django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are ...
- GIF图制作
一.安装image 首先在cmd中敲入代码pip install imageio,以便制作动图 二.安装完之后便可读取gif了 在idle中输入代码 import imageio savename = ...
- Weblogic反序列化远程命令执行漏洞(CNVD-C-2019-48814)测试
漏洞简介 2018年4月18日,Oracle官方发布了4月份的安全补丁更新CPU(Critical Patch Update),更新中修复了一个高危的 WebLogic 反序列化漏洞CVE-2018- ...
- DataGridView绑定list的注意事项
1.DataGridView数据绑定对比(DataTable与泛型List): 当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时, ...
- unity 渲染第二步
先不要用 unity shader 提供给你的转换矩阵,看看屏幕上的图形,你会学到更多. --- <unity 渲染箴言> 假设你 create 了一个 cube,放在默认的位置,默认的 ...
- Git学习系列之Git是什么?
前言 现在主流IDE里,都集成git了. https://git-scm.com/docs 史上最浅显易懂的Git教程! 为什么要编写这个教程?因为我在学习Git的过程中,买过书,也在网上Google ...
- nginx文件访问403问题
配置测试环境nginx时,增加了一个新的用户用来上传资源,所以想着就直接把静态资源放在新用户的home目录.为此,还特地设置了相应目录的所有用户都可以读取. chmod 755 /home/tom/s ...
- Orcale 之 SQL 数据定义
SQL 的数据定义功能主要是针对数据对象进行定义的,这些数据对象主要包括:表,视图以及索引. 注意:由于视图是基于表的虚表,而索引是依附在基表上的,所以视图和索引均不提供修改视图和索引定义的操作.如果 ...
- Software Architecture Pattern(Mark Richards)笔记
软件架构模式 缺少规范架构的程序通常会变得紧耦合.脆弱.难以更改,缺少清晰的发展方向和愿景.这本小书用50多页介绍了常用的5种常见架构模式,相信不管是大牛还是萌新都会有所收获,特别是对我这种偏爱系统设 ...