兼容Qt4/Qt5版本的QML例程

本篇文章介绍兼容Qt4与Qt5版本的Qml简单例程。由于Qt4与Qt5版本的qml文件不能使用宏来区分,所以使用qmake执行脚本来修改qml版本差异代码。(末尾源代码地址)

qml文件转换

  • 下列代码是项目文件代码,会在编译之前执行;
  • 主要作用为识别Qt版本然后替换对应qml文件中的import QtQuick 1.ximport QtQuick 2.x;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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}

    macx {
    !isEmpty(QT_QUICK_VERSION):
    QtQuickVersion.commands +=
    "grep -rl 'QtQuick [0-9]\\.[0-9]' $$PWD/ | xargs sed -i '' 's/QtQuick [0-9]\\.[0-9]/QtQuick $${QT_QUICK_VERSION}/g';"
    }

    unix:!macx {
    !isEmpty(QT_QUICK_VERSION):
    QtQuickVersion.commands +=
    "grep -rl 'QtQuick [0-9]\\.[0-9]' $$PWD/ | xargs sed -i 's/QtQuick [0-9]\\.[0-9]/QtQuick $${QT_QUICK_VERSION}/g';"
    }

    QtQuickVersion.target = FORCE

    PRE_TARGETDEPS += FORCE
    QMAKE_EXTRA_TARGETS += QtQuickVersion

pro文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
QT += core

equals (QT_MAJOR_VERSION, 4): QT += declarative

equals (QT_MAJOR_VERSION, 5): QT += qml quick quickwidgets

SOURCES += main.cpp

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}

macx {
!isEmpty(QT_QUICK_VERSION):
QtQuickVersion.commands +=
"grep -rl 'QtQuick [0-9]\\.[0-9]' $$PWD/ | xargs sed -i '' 's/QtQuick [0-9]\\.[0-9]/QtQuick $${QT_QUICK_VERSION}/g';"
}

unix:!macx {
!isEmpty(QT_QUICK_VERSION):
QtQuickVersion.commands +=
"grep -rl 'QtQuick [0-9]\\.[0-9]' $$PWD/ | xargs sed -i 's/QtQuick [0-9]\\.[0-9]/QtQuick $${QT_QUICK_VERSION}/g';"
}

QtQuickVersion.target = FORCE

PRE_TARGETDEPS += FORCE
QMAKE_EXTRA_TARGETS += QtQuickVersion

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <QtGlobal>
#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0))

#include <QApplication>
#include <QDeclarativeView>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QDeclarativeView viewer;
viewer.setSource(QUrl::fromLocalFile(QLatin1String("main.qml")));
viewer.show();
return app.exec();
}

#else

#include <QApplication>
#include <QQuickView>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QQuickView viewer;
viewer.setSource(QUrl::fromLocalFile(QLatin1String("main.qml")));
viewer.show();
return app.exec();
}

#endif

Qt4版本编译替换后的main.qml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import QtQuick 1.1

Rectangle {
width: 360
height: 360
Text {
text: qsTr("Hello World")
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
Qt.quit();
}
}
}

Qt5版本编译替换后的main.qml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import QtQuick 2.7

Rectangle {
width: 360
height: 360
Text {
text: qsTr("Hello World")
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
Qt.quit();
}
}
}

源码地址

1
https://github.com/aeagean/QtQuickDemo.git