Clion中 qml 项目 CMakeLists.txt 模板
cmake_minimum_required(VERSION 3.28)
project(qmldemo)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_PREFIX_PATH "/home/wlzhou/Qt/6.5.3/gcc_64")
find_package(Qt6 COMPONENTS
Core
Gui
Widgets
Quick
REQUIRED)
qt_standard_project_setup()
qt_add_executable(appqmldemo main.cpp)
qt_add_qml_module(appqmldemo
URI qmldemo
VERSION 1.0
QML_FILES
Main.qml
Common/MyRedBox.qml
Common/MyBlueBox.qml
RESOURCES
images/file.png
)
target_link_libraries(appqmldemo PRIVATE
Qt::Core
Qt::Gui
Qt::Widgets
Qt::Quick
)
使用相对路径
图片文件加载、其他目录 qml 文件引用都使用相对路径
main.cpp 中加载
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("../Main.qml")));
return QApplication::exec();
}
使用资源文件路径
定义一个资源文件 resources.qrc, 图片和qml文件需要定义
<RCC>
<qresource prefix="/qt/qml">
<file>Main.qml</file>
<file>Common/MyRedBox.qml</file>
<file>Common/MyBlueBox.qml</file>
<file>images/file.png</file>
</qresource>
</RCC>
main.cpp 中加载
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/qt/qml/Main.qml")));
return QApplication::exec();
}
使用 qt_add_qml_module
CMakeLists.txt 文件中添加qt模块
qt_add_qml_module(appqmldemo
URI qmldemo
VERSION 1.0
QML_FILES
Main.qml
Common/MyRedBox.qml
Common/MyBlueBox.qml
RESOURCES
images/file.png
)
默认会创建和资源文件类似的前缀路径 /qmldemo, 使用的图片和qml文件都要定义
main.cpp 中加载qml文件有两种方式
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/qmldemo/Main.qml")));
// engine.loadFromModule("qmldemo", "Main");
return QApplication::exec();
}
使用绝对路径
- 方法1
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QDir>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QQmlApplicationEngine engine;
QDir dir(QApplication::applicationDirPath());
if (dir.dirName().startsWith( "cmake-build-debug")) {
dir.cdUp();
} else if (dir.dirName().contains( "Debug")) {
dir.cdUp();
dir.cdUp();
}
engine.load( dir.absolutePath() + "/" + "Main.qml");
return QApplication::exec();
}
- 方法2
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDir>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreationFailed,
&app,
[]() { QCoreApplication::exit(-1); },
Qt::QueuedConnection);
QString appPath = QCoreApplication::applicationDirPath();
QString projectRootPath;
QDir currentDir(appPath);
while (currentDir.cdUp()) {
if (currentDir.exists("main.cpp")) {
projectRootPath = currentDir.path();
break;
}
}
qDebug() << "projectRootPath = " << projectRootPath;
engine.load(projectRootPath + "/Main.qml");
return app.exec();
}