C++与QML交互

一.C++调用QML函数

	//1.必须在添加到main.cpp文件 engine.load(url)后面才有效 是后面
    QList<QObject *> listObj = engine.rootObjects();
    //2.必须先设置QML中控件属性objectName:objectName1,才能找到。
    //如果设置的是main.qml中的根控件,就是他本身,不需要找子类,直接QObject * obj = listObj.first()就行。
    QObject * obj = listObj.first()->findChild<QObject*>("objectName1");
    QVariant ret;
    QVariant param1("参数1");
    //3.通过元对象,调用函数或者信号,传参与获取返回值,
    //C++类型选择QVariant,QML 信号类型选择用var;
   QMetaObject::invokeMethod(obj,"function1", 
  		 Q_RETURN_ARG(QVariant,ret),Q_ARG(QVariant,param1) );
   QMetaObject::invokeMethod(obj,"sigTest",
  		 Q_ARG(QVariant,param1));
    qDebug()<<"ret:"<<ret.toString();

二.QML调用C++函数

首先创建一个test的C++类 DataDeal,QML测试按钮 button

//1.C++类函数前必须加 Q_INVOKABLE
class DataDeal : public QObject
{
    Q_OBJECT
private:
    explicit DataDeal(QObject *parent = nullptr);
public:
    Q_INVOKABLE QString setStr(QString str)
    {
        qDebug()<<"C++函数被调用:"<<str;
        emit sigSetstr(str);//发射C++信号
        return str;
    }
signals:
   void sigSetstr(QString str);
public slots:
    void SlotOnclick()
    {
        qDebug()<<"C++槽函数被调用";
    }
}

//2.QML 里面添加按钮测试
     Button{
        id:"button"
        objectName:"buttonObj"
        text:"QML按键"
        onClicked: {
          var ret=  Datadeal.setStr("QML调用C++")
           console.log("QML获取C++函数返回值:",ret);
        }
    }

1.添加单独实例类方法:

   //第一种:main.cpp文件engine.load(url)前面加代码 是前面
    DataDeal  deal;
   QQmlContext * ctx = engine.rootContext();
   ctx->setContextProperty("Datadeal",&deal);
   
   //第二种:main.cpp文件engine.load(url)前面加代码 是前面
   // QML使用文件需要添加 import Model1 1.0
    DataDeal  deal;
	qmlRegisterSingletonInstance("Model1",1,0,"Datadeal",&deal);	 

2.添加类型类方法:

//1.创建C++类型
class Peopel : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
public:
    explicit Peopel(QObject *parent = nullptr);
    Q_INVOKABLE void setName(QString name)
    {
        m_strName=name;
        emit nameChanged();
    }
    Q_INVOKABLE QString getName()
    {
        return m_strName;
    }
signals:
   void  nameChanged();
private:
    QString m_strName;
};
//2.注入C++类
  qmlRegisterType<Peopel>("ModelPeople",1,0,"People");
//3.使用People类型
People{
    id:people
    name:"xiaoming"
    onNameChanged: {
    console.log(people.age)
     }
}

三.C++,QML信号槽的绑定

QML信号关联C++槽:

   auto objlist = engine.rootObjects();
   auto button = objlist.first()->findChild<QObject*>("buttonObj");
   QObject::connect(button,SIGNAL(clicked()),deal,SLOT(SlotOnclick()));

C++ 信号关联QML槽

//C++信号首字母必须小写;QML 超函数必须把信号首字母大写
  Connections{
        target: Datadeal
        function onSigSetstr(str)
        {
            console.log("C++信号关联QML槽:成功",str)
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值