当前位置: 首页 > news >正文

美容院门户网站开发枸橼酸西地那非片是什么

美容院门户网站开发,枸橼酸西地那非片是什么,代理IP做网站,域名免费文章目录 1 . 前言2 . Qml调用C的变量3 . Qml调用C的类4 . Qml调用C的方法5 . Qml接收C的信号6 . C接收Qml的信号(在Qml中定义信号槽)7 . C接收Qml的信号(在C中定义信号槽)8 . C调用Qml的函数9 . 总结 【极客技术传送门】 : https…

文章目录

  • 1 . 前言
  • 2 . Qml调用C++的变量
  • 3 . Qml调用C++的类
  • 4 . Qml调用C++的方法
  • 5 . Qml接收C++的信号
  • 6 . C++接收Qml的信号(在Qml中定义信号槽)
  • 7 . C++接收Qml的信号(在C++中定义信号槽)
  • 8 . C++调用Qml的函数
  • 9 . 总结


【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485


1 . 前言

Qml与C++通信有以下思路

  • Qml调用C++的变量
  • Qml调用C++的类
  • Qml调用C++的方法
  • Qml接收C++的信号
  • C++调用Qml的方法
  • C++接收Qml的信号

2 . Qml调用C++的变量

C++代码如下 :

int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;engine.rootContext()->setContextProperty("HEIGHT",500);engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

Qml代码如下 :

Window {id: windowvisible: truewidth: 300height: HEIGHTtitle: qsTr("Hello World")Component.onCompleted: {console.log(window.width)}Button{width: 100height: 100background: {color:"black"}}
}

小结 :

  1. 以上代码的思路是C++通过engine.rootContext()->setContextProperty(“HEIGHT”,500);向Qml引擎注册一个HEIGHT名字变量,其中这里的500可以写成C++的变量,使其映射HEIGHT名字变量,然后就可以在Qml文件中访问HEIGHT该变量了

3 . Qml调用C++的类

C++代码如下 :

#ifndef MYOBJECT_H
#define MYOBJECT_H#include <QObject>
#include <QtQml>class MyObject : public QObject
{Q_OBJECTQ_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)Q_PROPERTY(QString str READ getStr WRITE setStr NOTIFY strChanged)
public:explicit MyObject(QObject *parent = nullptr);public:void setValue(int newValue);int getValue();void setStr(QString newStr);QString getStr();signals:void valueChanged();void strChanged();private:int m_value;QString m_str;
};#endif // MYOBJECT_H#include "MyObject.h"MyObject::MyObject(QObject *parent) : QObject(parent)
{}void MyObject::setValue(int newValue)
{if(newValue == m_value)return;m_value = newValue;emit valueChanged();
}int MyObject::getValue()
{return m_value;
}void MyObject::setStr(QString newStr)
{if(newStr == m_str)return;m_str = newStr;emit strChanged();
}QString MyObject::getStr()
{return m_str;
}
int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;qmlRegisterType<MyObject>("MyObject", 1, 0, "MyObject");engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

Qml代码如下 :

import MyObject 1.0Window {id: windowvisible: truewidth: 400height: 500title: qsTr("Hello World")MyObject{value: 10str: "zhangsan"onValueChanged: {}onStrChanged: {}Component.onCompleted: {console.log(value,str)}}
}

小结 :

  1. 以上代码的思路是C++通过 qmlRegisterType<类名>(“Qml调用的类名称”,版本,“类名”); 例如上述的 qmlRegisterType(“MyObject”, 1, 0, “MyObject”); 向Qml注册一个类,使Qml可以基于这个类在Qml中创建对象。
  2. 其中C++类中要声明Q_OBJECT
  3. Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)
    这个是属性注册接口,其中注册了《读》《写》《信号》三个接口,其中Qml可以 读取/写入 C++的类成员变量,信号是C++调用后,Qml中用onValueChanged: {}作为槽
  4. int getValue();
    void setValue(int newValue);
    这两个是根据第3点的属性注册绑定的读写接口
  5. signals:
    void valueChanged();
    这个是根据第3点的属性注册绑定的信号接口,emit valueChanged(); 这样在C++调用后,就会发送信号,Qml中 onValueChanged: {} 触发响应接收

4 . Qml调用C++的方法

C++代码如下 :

#ifndef MYOBJECT_H
#define MYOBJECT_H#include <QObject>
#include <QtQml>class MyObject : public QObject
{Q_OBJECTQ_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)Q_PROPERTY(QString str READ getStr WRITE setStr NOTIFY strChanged)
public:explicit MyObject(QObject *parent = nullptr);public:Q_INVOKABLE void printMsg();void setValue(int newValue);int getValue();void setStr(QString newStr);QString getStr();signals:void valueChanged();void strChanged();private:int m_value;QString m_str;
};#endif // MYOBJECT_H#include "MyObject.h"MyObject::MyObject(QObject *parent) : QObject(parent)
{}void MyObject::setValue(int newValue)
{if(newValue == m_value)return;m_value = newValue;emit valueChanged();
}int MyObject::getValue()
{return m_value;
}void MyObject::setStr(QString newStr)
{if(newStr == m_str)return;m_str = newStr;emit strChanged();
}QString MyObject::getStr()
{return m_str;
}
int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;qmlRegisterType<MyObject>("MyObject", 1, 0, "MyObject");engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

Qml代码如下 :

import MyObject 1.0Window {id: windowvisible: truewidth: 400height: 500title: qsTr("Hello World")MyObject{id: objvalue: 10str: "zhangsan"}Button{width: 50height: 50background: Rectangle{color:"red"}onClicked: {obj.printMsg()}}
}

小结 :

  1. public:
    Q_INVOKABLE void printMsg();
    这句话基于Qml调用C++的类交互的基础上增加,这样可以使得Qml创建对象后,可以调用C++类的方法

5 . Qml接收C++的信号

C++的代码如下

signals:void sigMsg(int value,QString name);//在C++中调用 emit sigMsg(xxx,"xxx");

Qml的代码如下

MyObject{   id : obj}Connections{  //信号-槽连接方式一target: objfunction onSigMsg(i,s){console.log("/*-----------收到信号----------*/")}
}

小结 :

  1. C++的类中定义信号,然后把类注册后,在Qml创建该类对象,用Connections把对象和onSigMsg(捕获类的信号)进行连接,Qml捕获信号的名字由C++类信号的名字前缀+on,后面首字母大写

6 . C++接收Qml的信号(在Qml中定义信号槽)

C++的代码如下

public slots:void slotMsg(int value,QString name);//实现
void MyObject::slotMsg(int value,QString name)
{qDebug()<<__FUNCTION__<<" value = "<<value<<" name ="<<name;
}

Qml的代码如下

Window {id: windowvisible: truewidth: 400height: 500title: qsTr("Hello World")signal sendMsg(int value,string name)   //增加信号MyObject{id: objvalue: 10str: "zhangsan"}Button{width: 50height: 50background: Rectangle{color:"red"}onClicked: {sendMsg(2,"zhangsan")}}Component.onCompleted: {    //信号-槽连接方式二sendMsg.connect(obj.slotMsg)}
}

小结 :

  1. 在Qml创建完毕之后把Qml的信号sendMsg连接到C++的类槽函数之中,这样在Qml完成Qml信号C++槽绑定。

7 . C++接收Qml的信号(在C++中定义信号槽)

Qml的代码如下

Window {id: windowobjectName: "window"visible: truewidth: 400height: 500title: qsTr("Hello World")
}

C++的代码如下

    QQmlApplicationEngine engine;qmlRegisterType<MyObject>("MyObject", 1, 0, "MyObject");engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;auto objs = engine.rootObjects();qDebug()<<objs.first()->objectName();
    MyObject *myobj = new MyObject();auto objs = engine.rootObjects();auto window = objs.first();qDebug()<<objs.first()->objectName();QObject::connect(window,SIGNAL(sendMsg(int,QString)),myobj,SLOT(slotMsg(int,QString)));

小结 :

  1. Qml的第一个对象就是window,那么在C++中通过找到window的首地址,就可以基于这个首地址进行信号槽绑定,这样在C++完成Qml信号C++槽绑定。

8 . C++调用Qml的函数

Qml的代码如下

    function test(value,name){  //供C++端调用的函数console.log("test ",value,name)}

C++的代码如下

    QVariant ret;QVariant arg1 = 123;QVariant arg2 = "zhangsan";QMetaObject::invokeMethod(window,"test",Q_RETURN_ARG(QVariant,ret),Q_ARG(QVariant,arg1),Q_ARG(QVariant,arg2));

小结 :

  1. 在Qml中创建一个test函数,在C++中通过元对象方法 QMetaObject::invokeMethod 来绑定调用Qml中的test函数,从而使得Qml可以接收C++的任意类型数据。

9 . 总结

以上描述了C++与QML数据交互的方式,大家可以根据以上方式扩展,模拟MVVM的模式代入框架实现简洁高效的前后端架构,谢谢观看。

技术交流QQ群 : 745662457
群内专注 - 问题答疑,项目外包,技术研究

http://www.ritt.cn/news/12446.html

相关文章:

  • 一个网站 多个域名网站是怎么做出来的
  • 手机显示的网站该怎样设计2000元代理微信朋友圈广告
  • 对方把我的网站他网站内页友情链接 站长工具检测到是无反链常州百度推广公司
  • 做耳机套的网站谷歌三件套一键安装
  • 品牌网站建设解决方案乔拓云网站注册
  • 盐城做网站的公司地址今日头条热点新闻
  • 天津做网站多少钱免费做网站怎么做网站链接
  • 绵阳网站建设优化百度账号购买1元40个
  • 加强网站建设和维护工作网络营销的定义是什么
  • 成都沐塔通讯5g网站建设项目一个新产品怎么推广
  • 滨州网站建设报价关键词优化排名费用
  • 有域名怎么建设网站正规营销培训
  • 采购平台排名网站seo推广方案
  • wordpress如何自建站郑州官网网站优化公司
  • 网站建设|免费seo公司
  • html好看的个人主页建站网站关键词优化
  • 轻松网站建设数据分析一般用什么软件
  • html网页设计作业成品免费石家庄网站seo外包
  • 免费建网站软件下载手机竞价外包推广
  • 如何做网站宣传片网络营销外包公司
  • 如何查询网站备案进度什么平台推广效果最好
  • 漳州 做网站搜索优化师
  • 政务服务网站建设汇报国外域名
  • 厦门专业做网站公司网站建设的技术支持
  • 深圳手机移动网站开发外贸网站推广方式
  • javascriptjava阿姨南京seo网站管理
  • 如何搭建个人网站新网域名注册
  • 360 的网站链接怎么做系统推广公司
  • 怎么做淘宝一样的网站短信营销
  • 做系统网站广州百度快速优化排名