专栏首页跟Qt君学编程兼容Qt4/Qt5版本的QML例程

兼容Qt4/Qt5版本的QML例程

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

qml文件转换

  • 下列代码是项目文件代码,会在编译之前执行;
  • 主要作用为识别Qt版本然后替换对应qml文件中的 importQtQuick1.ximportQtQuick2.x;
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文件

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

#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

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

import QtQuick 2.7

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

源码地址

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

本文分享自微信公众号 - Qt君(qtjuna),作者:Prosa

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Qt简单屏幕截图(兼容Qt4/5)

    Qt君
  • Qt官方示例-Http

    Qt君
  • Qt之版本宏

    Qt君
  • 手把手教你调用百度人脸识别API

    现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

    互扯程序
  • python图片转换素描画

    崔笑颜
  • (63) 实用序列化: JSON/XML/MessagePack / 计算机程序的思维逻辑

    上节,我们介绍了Java中的标准序列化机制,我们提到,它有一些重要的限制,最重要的是不能跨语言,实践中经常使用一些替代方案,比如XML/JSON/Message...

    swiftma
  • JAVA接入一号店授权API

    1号店开放平台,是基于1号店海量商品、用户数据,为广大的开发者提供开放数据的平台。 开发者申请到app_key、app_secret后,就可以基于您的智慧和1号...

    凯哥Java
  • DevOps实践

    发布管理 Scrum 看板 交付流水线 DevOps关注: 频繁交付小的需求 对质量有大的信心

    用户5760343
  • 五分钟了解浏览器工作原理

    Web 浏览器无疑是用户访问互联网最常见的入口。浏览器凭借其免安装和跨平台等优势,逐渐取代了很多传统的富客户端。

    glumes
  • 如何用Python智能批量压缩图片?

    本文一步步为你介绍,如何用Python自动判断多张图片中哪些超出阈值需要压缩,且保持宽高比。如果你想了解Python图像处理的基础知识,欢迎动手来尝试。

    王树义

扫码关注云+社区

领取腾讯云代金券