gpt4 book ai didi

与 Qt 4 (QtQuick 1.x) 和 Qt 5 (QtQuick 2.x) 兼容的 C++/QML 项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:51 25 4
gpt4 key购买 nike

当编写不使用 QML 且不依赖于新的 Qt 5 功能的 Qt 应用程序时,我们可以同时使用 Qt 4 和 Qt 5 对其进行编译(除了少数源代码不兼容)。

当我们想要使用 Qt 5 功能但又想退回到等效但效率较低的 Qt 4 解决方案时,我们可以简单地使用 #if检查 Qt 版本,例如使用新的 QStringLiteral但回到QString::fromUtf8使用 Qt 4 编译时。

我们怎样才能用 QtQuick 做同样的事情?请注意,可以使用 QDeclarativeViewQtQuick 1.x在 Qt 5 中,但这不会使用 Qt 5 中的新场景图。只有 1.xQDeclarativeView 中得到支持并且只有 2.xQQuickView 中得到支持,即使我不使用 Quick 2.0 中引入的功能。

我想要的是:

  • 使用 Qt 4 编译时,使用 QDeclarativeView和 friend ;在 QML 中:import QtQuick 1.x
  • 使用 Qt 5 编译时,使用新的 QQuickView和 friend ;在 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;

然后使用 QGuiApplication , QQuickView在 Qt 4 和 Qt 5 中依此类推。但是当 QML 文件包含 QtQuick 的导入声明时, 我无法添加 #if在 1.x 和 2.x 之间做出决定。比方说,有没有一种官方方法可以添加一个别名 来生成QtQuick 1.x?在 QQuickView 工作(所以它实际上被解析为 QtQuick 2.0 )?

最佳答案

我所做的是在部署所有 QML 文件时替换字符串 QtQuick x.y。如果您的源代码树中有一个文件夹 qml,并且希望在您的构建树中有相同的 qml 文件夹,您可以部署该文件夹,但替换字符串以匹配你想要的 QtQuick 版本。

以下解决方案适用于 POSIX 系统,因为它需要一些命令行工具;在 Linux (Ubuntu) 上测试。也许具有 Windows 命令行经验的人可以添加适用于 Windows 的版本。

在您的 .pro 中添加:(以下代码假定在构建文件夹中,可以使用 ../src/< 访问源文件夹;如果不是这种情况,请更改 *** 注释所在的路径)

// Define QT5 macro for use in C++, and select the correct module for QML:
greaterThan(QT_MAJOR_VERSION, 4) {
DEFINES += QT5
QT += quick
} else {
QT += declarative
}

// Define qmake variables for QtQuick version, and if you want, QtQuick Controls:
equals(QT_MAJOR_VERSION, 4) {
equals(QT_MINOR_VERSION, 7) {
QT_QUICK_VERSION = 1.0
}
equals(QT_MINOR_VERSION, 8) {
QT_QUICK_VERSION = 1.1
}
}
equals(QT_MAJOR_VERSION, 5) {
QT_QUICK_VERSION = 2.$${QT_MINOR_VERSION}
equals(QT_MINOR_VERSION, 1): QT_QUICKCONTROLS_VERSION = 1.0
equals(QT_MINOR_VERSION, 2): QT_QUICKCONTROLS_VERSION = 1.1
equals(QT_MINOR_VERSION, 3): QT_QUICKCONTROLS_VERSION = 1.2
}

// Add a pre-build step which copies your qml folder
QtQuickVersion.target = FORCE
QtQuickVersion.commands = "rm -rf qml/;"
QtQuickVersion.commands += "cp -r ../src/qml/ .;" // <-- *** Here is the source path
!isEmpty(QT_QUICK_VERSION) {
QtQuickVersion.commands += "grep -rl 'QtQuick [0-9]\\.[0-9]' qml/ | xargs -r sed -i 's/QtQuick [0-9]\\.[0-9]/QtQuick $${QT_QUICK_VERSION}/g';"
}
!isEmpty(QT_QUICKCONTROLS_VERSION) {
QtQuickVersion.commands += "grep -rl 'QtQuick.Controls [0-9]\\.[0-9]' qml/ | xargs -r sed -i 's/QtQuick.Controls [0-9]\\.[0-9]/QtQuick.Controls $${QT_QUICKCONTROLS_VERSION}/g';"
}

// Give the Makefile target *any* name which will *not* be created
// as a file, so the step is always executed
PRE_TARGETDEPS += FORCE
QMAKE_EXTRA_TARGETS += QtQuickVersion

在 C++ (main.cpp) 中,您可以创建一个 QQuickView,它回落到 QDeclarativeView对于 Qt 4:

#ifdef QT5

#include <QGuiApplication>
#include <QQuickView>
#include <QQmlEngine>

#else

#include <QApplication>
#include <QDeclarativeView>
#include <QDeclarativeEngine>
typedef QApplication QGuiApplication;
typedef QDeclarativeView QQuickView;
// The following is the official fallback for QStringLiteral,
// see qstring.h in Qt 5 after #ifndef QStringLiteral */
#define QStringLiteral(str) QString::fromUtf8("" str "", sizeof(str) - 1)
#endif


int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);

// (add qmlRegisterType etc.)

// Open the QML view with the main QML document:
QQuickView view;
view.setSource(QUrl::fromLocalFile(QStringLiteral("qml/main.qml")));
view.show();

// Needed for "Qt.quit()" within QML:
QObject::connect(view.engine(), SIGNAL(quit()), &a, SLOT(quit()));

// I normally use this sizing behavior:
view.setResizeMode(QQuickView::SizeRootObjectToView);

return a.exec();
}

由上面的代码打开的 QML 文件 qml/main.qml 看起来像这样:

// This import will replaced with the largest supported QtQuick version:
import QtQuick 1.0

Rectangle {
width: 450
height: 200

Text {
anchors.centerIn: parent
horizontalAlignment: Text.AlignHCenter
font.pointSize: Math.min(parent.width / 10, parent.height / 5)

// This text will also be replaced to show the correct QtQuick version:
text: "Hello from\nQtQuick 1.0!"

// Some fancy animations...
SequentialAnimation on scale {
running: true; loops: Animation.Infinite
NumberAnimation { from: 1; to: .6; easing.type: Easing.InOutQuad; duration: 600 }
NumberAnimation { from: .6; to: 1; easing.type: Easing.InOutQuad; duration: 600 }
}
SequentialAnimation on rotation {
running: true; loops: Animation.Infinite
NumberAnimation { from: -10; to: 10; easing.type: Easing.InOutQuad; duration: 2000 }
NumberAnimation { from: 10; to: -10; easing.type: Easing.InOutQuad; duration: 2000 }
}
}

MouseArea {
anchors.fill: parent
onClicked: Qt.quit()
}
}

QML 文件包含一个导入指令,它将选择正确的 QtQuick 版本(您可以在构建文件夹中检查它)。 Text 元素中的字符串也被替换,因此您将在此演示中轻松看到版本。

关于与 Qt 4 (QtQuick 1.x) 和 Qt 5 (QtQuick 2.x) 兼容的 C++/QML 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21412257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com