【转】QML调用C++

本文介绍了一个使用C++实现并通过QML界面展示的简单示例项目。该示例展示了如何定义一个C++类并将其属性暴露给QML,同时实现了信号与槽机制以通知QML界面更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

myclass.h

  1. #ifndef MYCLASS_H
  2. #define MYCLASS_H
  3. #include <QObject>
  4. #include<QString>
  5. class MyClass : public QObject
  6. {
  7. Q_OBJECT
  8. //暴露给QML 属性
  9. Q_PROPERTY(QString mystring READ getString WRITE setString NOTIFY mystringChanged)
  10. private:
  11. QString * m_pstring;
  12. public:
  13. explicit MyClass(QObject *parent = 0);
  14. Q_INVOKABLE QString getString(); //Q_INVOCABLE暴露给 QML
  15. Q_INVOKABLE void setString(QString string);
  16. ~MyClass();
  17. signals:
  18. void mystringChanged(QString value); //信号
  19. public slots:
  20. };
  21. #endif // MYCLASS_H
myclass.cpp
  1. #include "myclass.h"
  2. MyClass::MyClass(QObject *parent) : QObject(parent)
  3. {
  4. this->m_pstring=new QString("默认值");
  5. }
  6. MyClass::~MyClass()
  7. {
  8. delete this->m_pstring;
  9. }
  10. QString MyClass::getString()
  11. {
  12. setString("xx");
  13. return *(this->m_pstring);
  14. }
  15. void MyClass::setString(QString string){
  16. *(this->m_pstring)=string;
  17. emit mystringChanged(string);//发送信号
  18. }

main.cpp
  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include<QtQml>
  4. #include<myclass.h>
  5. int main(int argc, char *argv[])
  6. {
  7. QGuiApplication app(argc, argv);
  8. //注册到QML,留意注册函数所在的位置
  9. qmlRegisterType<MyClass>("RegisterMyType",1,0,"MyClassType");
  10. QQmlApplicationEngine engine;
  11. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  12. return app.exec();
  13. }

main.qml
  1. import QtQuick 2.4
  2. import QtQuick.Window 2.2
  3. import QtQuick.Controls 1.2
  4. import QtQuick.Controls.Styles 1.2
  5. import RegisterMyType 1.0 //导入
  6. Window {
  7. visible: true
  8. Button{
  9. id:btn1;
  10. height:20;
  11. width:60;
  12. text:"按钮";
  13. onClicked: {
  14. //qml操作c++
  15. btn1.text=myobj.mystring;
  16. }
  17. }
  18. Label{
  19. id:label1;
  20. text:"初始值";
  21. anchors.left:btn1.right;
  22. anchors.leftMargin: 12;
  23. }
  24. //创建对象
  25. MyClassType
  26. {
  27. id:myobj;
  28. }
  29. //连接信号 到qml
  30. Connections{
  31. target:myobj;
  32. onMystringChanged:label1.text="改变了值是:"+value; //这里的value是signal信号函数里面的参数
  33. }
  34. }



在Qt Quick应用程序中,您可以使用QML调用C++函数。以下是实现此目标的一般步骤: 1. 创建一个C++类,其中包含您希望从QML调用的函数。确保该类被声明为Q_INVOKABLE,这将允许QML调用它。 ```cpp #include <QObject> class MyCppClass : public QObject { Q_OBJECT public: MyCppClass(QObject *parent = nullptr); // 声明您希望从QML调用的函数 void myCppFunction(); }; ``` 2. 在C++类中实现您想要从QML调用的函数。确保函数名和QML代码中的函数名称匹配。 ```cpp #include "mycppclass.h" MyCppClass::MyCppClass(QObject *parent) : QObject(parent) {} void MyCppClass::myCppFunction() { // 在这里编写您想要在QML中执行的代码 } ``` 3. 在您的Qt项目文件中,将C++类添加到您的项目。确保在`.pro`文件中包含该类的头文件。 ```pro QT += quick widgets c++ ``` 4. 在QML调用C++函数。您可以使用`Qt.binding()`或`on`属性将C++函数的引用传递给QML变量或事件处理程序。例如: ```qml import QtQuick 2.12 import QtQuick.Controls 2.12 import Qt 5.7 import MyCppClass 1.0 // 将此项替换为您的实际类路径和版本号 ApplicationWindow { visible: true width: 640 height: 480 title: "QML调用C++函数" myCppObject: null // 将此变量添加到您的变量列表中,以便在QML中使用它 Component.onCompleted: { myCppObject = Qt.createObject(MyCppClass) // 创建MyCppClass的实例并赋值给myCppObject变量 myCppObject.myCppFunction() // 在完成组件加载后调用C++函数 } } ``` 这样,当应用程序完成加载时,您就可以在QML中使用`myCppObject`变量调用C++函数了。请注意,您需要确保C++类和函数的正确实现,并确保在QML中正确引用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值