You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt 6.5带ui.qml的Quick项目中调用C++函数的方法

解决Qt Quick项目调用C++函数的实操步骤

1. 找对要修改的CMake文件

你创建的带Qt Design Studio支持的项目,**根目录下的CMakeLists.txt**就是核心修改文件,别找子目录里的小文件,就改最外层这个。

2. 准备可被QML调用的C++类

先写一个简单的C++类,比如MyCppClass,要给暴露给QML的函数加Q_INVOKABLE宏:

// mycppclass.h
#ifndef MYCPPCLASS_H
#define MYCPPCLASS_H

#include <QObject>

class MyCppClass : public QObject
{
    Q_OBJECT
public:
    explicit MyCppClass(QObject *parent = nullptr);

    // 标记这个函数可被QML调用
    Q_INVOKABLE QString sayHello(const QString &name);
};

#endif // MYCPPCLASS_H
// mycppclass.cpp
#include "mycppclass.h"

MyCppClass::MyCppClass(QObject *parent)
    : QObject{parent}
{}

QString MyCppClass::sayHello(const QString &name)
{
    return "Hello " + name + "!";
}

3. 修改根目录CMakeLists.txt

找到原本的qt_add_executable代码块,在它后面添加qt_add_qml_module配置,把你的C++类和QML模块绑定:

# 项目原有可执行文件配置(无需修改,在它后面加新内容)
qt_add_executable(YourProjectName
    main.cpp
)

# 新增QML模块配置,替换成你的项目名和文件
qt_add_qml_module(YourProjectName
    URI MyModule  # 这是QML里要import的模块名,比如import MyModule 1.0
    VERSION 1.0
    QML_FILES
        ui.qml  # 把你的ui.qml纳入模块管理
    SOURCES
        mycppclass.h mycppclass.cpp  # 加入你的C++源文件
)

# 原有目标链接配置(无需修改)
target_link_libraries(YourProjectName
    PRIVATE Qt6::Quick Qt6::QuickControls2
)

4. 在ui.qml里调用C++函数

现在可以在ui.qml中导入模块、实例化C++类并调用函数了:

import QtQuick
import QtQuick.Controls
import MyModule 1.0  # 和CMake里的URI、VERSION对应

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Test C++ Call")

    // 实例化你的C++类
    MyCppClass {
        id: cppObj
    }

    Button {
        text: "Call C++ Function"
        onClicked: {
            let result = cppObj.sayHello("QML User")
            console.log(result)  // 控制台会输出Hello QML User!
        }
    }
}

5. 为什么之前ui.qml调用不了?

带Qt Design Studio的项目默认把ui.qml当作纯UI文件,没有关联你的C逻辑。通过qt_add_qml_module把ui.qml纳入模块管理,同时添加C源文件,QML才能识别到你的类和函数。

额外注意事项

  • 必须给要暴露的C++函数加Q_INVOKABLE宏,或者用SLOT宏,否则QML无法调用
  • CMake里的URI和VERSION要和QML中的import语句完全对应
  • 编译前要确保C++文件已经添加到项目中,避免CMake找不到源文件

内容的提问来源于stack exchange,提问作者mathe_matician

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:57:45