前言:
本次教程是把前两个示例合并在一个工程中,以方便后面的教程
在日常开发过程中,笔者不建议将2个大版本的Qt/qml合并,毕竟二者相关太大,不便维护
笔者使用的是Qtcreator6.0.0
一、新建qml工程
以上过程仅供参考
Qtcreator6还未正式发布,本身就存在不少问题,建议小伙伴还是继续使用QtCreator5.0.3
想吐槽一下,Qtcreator6建qml工程,竟没有模块工程了
二、复制原工程文件
1将所有C++文件复制到工程对应目录中
注意,2个Tool类要合并一下
2.将qml文件按照版本号放入不同的目录中
当然也可以使用pri文件,建2个工程,引入同样的C++类文件
三、修改工程文件
增加新模块,并添加C++、qml文件,关键代码如下
QT += quick qml multimedia quickcontrols2
SOURCES += \
imageprovider/imageprovider.cpp \
main.cpp \
tool/tool.cpp
HEADERS += \
imageprovider/imageprovider.h \
tool/tool.h
RESOURCES += \
qml.qrc
qml.qrc文件中,请小伙伴自己添加qml文件
笔者建议,若真需要同时兼容多个版本的qml文件,请不要放在一个qml.qrc文件中。应该每个版本放置一个,并根据大版本,加载不同的qml.qrc文件,使用方法如下所示
greaterThan(QT_MAJOR_VERSION, 5){
# message(当前为Qt6及以上版本)
RESOURCES += qml6.qrc
}
else{
# message(当前为Qt6以下版本)
RESOURCES += qml5.qrc
}
四、修改main.cpp文件
int main(int argc, char *argv[])
{
//自定义style
QQuickStyle::setStyle("Material");
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
//注册C++到qml
qmlRegisterType<Tool>("com.xdqd.classes", 1, 0, "Tool");
QQmlApplicationEngine engine;
//添加图像提供者
engine.addImageProvider(QLatin1String("imageProvider"), new ImageProvider);
//在不同Qt版本,加载不同的文件
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
const QUrl url("qrc:/qml/qt5/main.qml");
#else
const QUrl url(u"qrc:/qml/qt6/main.qml"_qs);
#endif
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
完成以上操作后,就可以使用Qt5.15.2或Qt6.2.1编译工程了
本次教程示例源码
后记:
若是条件允许,笔者还是建议多尝试一下高版本的Qt,新版本有了多处更新,如现在qml和js都转化成C++代码,再编译(当前也出现了不少问题)
下篇会再次加入opencv的解码函数