qml文件加载

296 阅读1分钟

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
)

1.png

使用相对路径

图片文件加载、其他目录 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();
}

1.png

使用资源文件路径

定义一个资源文件 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();
}

1.png

使用 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.png

使用绝对路径

  • 方法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();
}