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

微信公众号视频网站开发北京市网站设计公司网址

微信公众号视频网站开发,北京市网站设计公司网址,品牌网络营销推广方案策划,崂山区建设管理局网站怎么了黑文章目录 1 . 前言2 . Qml调用C的变量3 . Qml调用C的类4 . Qml调用C的方法5 . Qml接收C的信号6 . C接收Qml的信号#xff08;在Qml中定义信号槽#xff09;7 . C接收Qml的信号#xff08;在C中定义信号槽#xff09;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}} }小结 以上代码的思路是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 QtQmlclass 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.hMyObject::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;qmlRegisterTypeMyObject(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: zhangsanonValueChanged: {}onStrChanged: {}Component.onCompleted: {console.log(value,str)}} }小结 以上代码的思路是C通过 qmlRegisterType类名(“Qml调用的类名称”,版本,“类名”); 例如上述的 qmlRegisterType(“MyObject”, 1, 0, “MyObject”); 向Qml注册一个类使Qml可以基于这个类在Qml中创建对象。其中C类中要声明Q_OBJECTQ_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged) 这个是属性注册接口其中注册了《读》《写》《信号》三个接口其中Qml可以 读取/写入 C的类成员变量信号是C调用后Qml中用onValueChanged: {}作为槽int getValue(); void setValue(int newValue); 这两个是根据第3点的属性注册绑定的读写接口signals: void valueChanged(); 这个是根据第3点的属性注册绑定的信号接口emit valueChanged(); 这样在C调用后就会发送信号Qml中 onValueChanged: {} 触发响应接收 4 . Qml调用C的方法 C代码如下 #ifndef MYOBJECT_H #define MYOBJECT_H#include QObject #include QtQmlclass 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.hMyObject::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;qmlRegisterTypeMyObject(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()}} }小结 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(/*-----------收到信号----------*/)} }小结 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)} }小结 在Qml创建完毕之后把Qml的信号sendMsg连接到C的类槽函数之中这样在Qml完成Qml信号C槽绑定。 7 . C接收Qml的信号在C中定义信号槽 Qml的代码如下 Window {id: windowobjectName: windowvisible: truewidth: 400height: 500title: qsTr(Hello World) }C的代码如下 QQmlApplicationEngine engine;qmlRegisterTypeMyObject(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)));小结 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));小结 在Qml中创建一个test函数在C中通过元对象方法 QMetaObject::invokeMethod 来绑定调用Qml中的test函数从而使得Qml可以接收C的任意类型数据。 9 . 总结 以上描述了C与QML数据交互的方式大家可以根据以上方式扩展模拟MVVM的模式代入框架实现简洁高效的前后端架构谢谢观看。 技术交流QQ群 : 745662457 群内专注 - 问题答疑项目外包技术研究
http://www.zqtcl.cn/news/32871/

相关文章:

  • 湖北做网站的微网站建设及微信推广方案
  • 肥城网站建设推广vpsputty做网站
  • 建设一个百度百科类网站进销存免费管理软件
  • 杭州市拱墅区建设局网站网站m3u8链接视频怎么做的
  • 手机网站建设基本流程有关网站空间正确的说法是
  • 男女做暧视频网站免费品牌vi设计内容
  • 代理注册公司网站模版个人网站
  • 制作网站软件叫什么西安网络优化大的公司
  • vs网站开发实例千博网站建设
  • 网站推广app软件下载请打开app
  • 设计素材网站的问卷调查加盟哪家装修公司好
  • 做网站网站庄家在哪个网站上做简历
  • 自做网站多少钱财务管理培训
  • 公司地址查询网站电子商务网站建设 精品课程
  • 免费 建网站网站风格分析怎么写
  • wordpress 电影下载站知名的设计网站
  • 帮人做网站如何收费桂林市住房和城乡建设局网站
  • 苏州制作企业网站的唐山建设公司网站
  • 网站怎么做引流网站开发公司多少钱
  • 文化产品电商网站建设规划江西人才网
  • 网架公司十大排名整站seo排名公司
  • 深圳网站优化公司杭州关键词优化服务
  • 湖南免费网站建设德州网站设计
  • 做网站和做网页一样吗发布广东建设工程信息网站
  • 如何修改公司网站内容搜搜网站收录
  • 网站建设优化服务效果一般使用的分辨率是多少dpi?
  • 珠海建设银行官方网站运维工程师累吗
  • 什么网站帮人做网页成都市住房与城乡建设局网站
  • 好的网站分享阿里巴巴1688网官网
  • 中国纪检监察网站首页百度商桥怎么绑定网站