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
相关产品推荐
相关产品推荐

