在编写不使用QML并且不依赖于新的Qt 5功能的Qt应用程序时,我们可以使用Qt 4和Qt 5编译它(除了少数源不兼容性) .
当我们想要使用Qt 5功能但希望回归到同等但效率较低的Qt 4解决方案时,我们可以简单地使用 #if
来检查Qt版本,例如:使用新的 QStringLiteral
但在使用Qt 4编译时回落到 QString::fromUtf8
.
我们怎么能用QtQuick做同样的事情?请注意,可以在Qt 5中使用 QDeclarativeView
和 QtQuick 1.x
,但不会使用Qt 5中的新场景图 . 在 QDeclarativeView
中仅支持 1.x
, QQuickView
中仅支持 2.x
,即使我不使用引入的功能在Quick 2.0中 .
我想要的是:
-
使用Qt 4编译时,请使用
QDeclarativeView
和朋友;在QML中:import QtQuick 1.x
-
使用Qt 5进行编译时,请使用新的
QQuickView
和朋友;在QML中:import QtQuick 2.x
-
只有一组QML文件,但没有一个用于
QtQuick 1.x
而另一个用于QtQuick 2.x
关于C部分,这似乎很容易 . 在Qt 4中,我们可以简单地添加:
#include <QApplication>
#include <QDeclarativeView>
#include <QDeclarativeEngine>
typedef QApplication QGuiApplication;
typedef QDeclarativeView QQuickView;
然后在Qt 4和Qt 5中使用 QGuiApplication
, QQuickView
等 . 但是当QML文件包含 QtQuick
的导入声明时,我无法添加 #if
来决定1.x和2.x.有没有官方的方法,比方说,添加一个别名让 QtQuick 1.x
在 QQuickView
中工作(所以它实际上被解析为 QtQuick 2.0
)?
1 回答
我所做的是在部署它们时替换所有QML文件中的字符串
QtQuick x.y
. 如果源树中有一个文件夹qml
,并且希望在构建树中具有相同的qml
文件夹,则可以部署该文件夹,但替换该字符串以匹配所需的QtQuick版本 .以下解决方案适用于POSIX系统,因为它需要一些命令行工具;在Linux(Ubuntu)上测试过 . 也许具有Windows命令行经验的人可以为Windows添加版本 .
Add in your .pro: (以下代码假定在构建文件夹中,使用
../src/
可以访问源文件夹;如果不是这种情况,请更改***
注释所在的路径)In C++ (main.cpp) ,然后你可以为Qt 4创建一个
QQuickView
,它回落到QDeclarativeView
:The QML file qml/main.qml 上面的代码打开后可以看起来像这样:
QML文件包含一个import指令,它将选择正确的QtQuick版本(您可以在build文件夹中查看) .
Text
元素中的字符串也会被替换,因此您将在此演示中轻松看到该版本 .