C++调用qml函数,是通过下面的函数实现的:

bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( Q_NULLPTR ), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument());

这里有两个常用的宏:Q_RETURN_ARG,Q_ARG,从字面意思就可以看出来,一个是用来获取返回值,另一个用于传参。 下面是一个例子:

QVariant returnedValue;
QVariant msg = "message sended from C++";
QMetaObject::invokeMethod(pctrlobj, "setTextString", Q_RETURN_ARG(QVariant, returnedValue),Q_ARG(QVariant, msg));

在应用该函数调用qml对象成员前,关键是要获取到要调用的qml对象,有两种方案可以很方便的获取到qml对象:

1)  从qml端直接传QOBject * 到C++端;

2)  通过设置objectName,利用findChild()找到对应的对象;

第一种方案就不说了,很简单实现,这里简略的讲解下第二种方案,  看下面的例子:

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.3
Window {id: windows;visible: truewidth: 640height: 480title: qsTr("Hello World")Button{id: test;width: 70;height: 30;onClicked: test1.open();}Test1{id: test1;visible: false;onShowTest:{}}function  test(){console.log("test ok!");}}

Test1.qml

import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.3
Window {id: test;width: 300;height: 200;visible:false;signal  showTest();Button{id: testButton;objectName:"testButton"      //这里设置了对象名称,用于findChild()获取对象;text:"click me";onClicked:{showTest();}}function open(){test.visible = true;}function close(){test.visible = false;}}

  

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QObject>
int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/main.qml")));QObject *pRoot = engine.rootObjects().first();QObject *pButton = pRoot->findChild<QObject *>("testButton");if( pButton ){QObject::connect(pButton,SIGNAL(clicked()),pRoot,SLOT(test()));}if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

转载于:https://www.cnblogs.com/yinwei-space/p/9013119.html

qml: C++调用qml函数相关推荐

  1. QML使用Python的函数

    有2种方法: 一. QML中定义一个信号,连接Python里的函数: 这里的函数不用特意指明为槽函数,普通函数即可. QML的信号连接Python的函数 QML: 首先在QML中定义一个信号,这里的信 ...

  2. QML笔记:QML基本概念及使用

    QML笔记:QML基本概念及使用 Qt5中的Qt Qml和Qt Quick架构 Qt Qml模块本身并没有涉及图形显示,所有的图形处理都由Qt Quick模块完成. Qt Quick 以QPA(Qt ...

  3. 如何在sqlite3连接中创建并调用自定义函数

    #!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...

  4. Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]

    1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...

  5. Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...

    我在硬故障处理程序中有一些程序集.程序集基本上是为了传递当前堆栈指针作为参数(在R0中).它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数? __asm(&quo ...

  6. mybatis可以用oracle,使用MyBatis调用oracle函数(基于注释)

    我需要使用注解在MyBatis中调用Oracle函数.使用MyBatis调用oracle函数(基于注释) 我的映射: @Select("{ CALL #{outParam, jdbcType ...

  7. C语言中连续调用rand函数,返回值不变

    C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...

  8. 读书笔记 effective c++ Item 5 了解c++默认生成并调用的函数

    1 编译器会默认生成哪些函数  什么时候空类不再是一个空类?答案是用c++处理的空类.如果你自己不声明,编译器会为你声明它们自己版本的拷贝构造函数,拷贝赋值运算符和析构函数,如果你一个构造函数都没有声 ...

  9. C#编码实践:使用委托和特性调用指定函数

    2019独角兽企业重金招聘Python工程师标准>>> 建立一个C#控制台应用程序AttributeTest. 建立一个类Operations,代码如下: namespace Att ...

最新文章

  1. pde lec 6 part 2
  2. 到底要不要拯救地球?真·逻辑鬼才!| 今日最佳
  3. 前端学习(3094):vue+element今日头条管理-反馈
  4. 【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
  5. linux make命令实现,Linux make命令主要参数详解
  6. php 处理二维数组(去除重复项,排序,转换,去空白等)
  7. opencv摄像头速度慢_c++ - 从OpenCV 3切换到OpenCV 4会导致网络摄像头以最高5帧的速度记录,而不是通常的30帧。 - SO中文参考 - www.soinside.com...
  8. 只能由中文、字母、数字、下划线组成的字符串
  9. 虚拟主机 webdav php,ubuntu 搭建 webdav 文件服务器 及客户端配置 详解
  10. Vue+flvjs 实现视频播放
  11. win10系统office2010每次打开总是出现配置进度
  12. ObjectBox的探究
  13. 【下载工具】哔哩哔哩视频下载器——(Downkyi)下载姬v1.3.3
  14. “5g+工业互联网”,工业生产制造迎来新突破
  15. C语言实现根据考试成绩等级,打印百分制分数段
  16. 蓝桥杯 C++ 算法训练 藏匿的刺客 贪心
  17. git更换主分支master
  18. 算法mips与mcps 的分析
  19. Informatica任务卡在timeout based commit point
  20. 项目经理解决冲突的模式

热门文章

  1. python各种包安装顺序_史上最全的Python包管理工具:Anaconda教程
  2. global.min.css,css3-媒体查询样式不覆盖原始样式
  3. 华北科技学院计算机期末考试,华北科技学院 专业计算机 考试专用
  4. 计算机网络按信息传输介质的性能来划分,大学计算机基础练习题网络技术.doc...
  5. stm32 薄膜键盘原理_市面上的笔记本键盘优缺点解析,看完秒懂
  6. MongoDB学习2——Windows 使用mongo连接数据库
  7. 一个程序员的爱情表白书
  8. linux ls 命令排序,如何在Linux中使用ls命令按大小对所有文件进行排序
  9. kettle7.1 右上角不显示connect
  10. PHP checkdate()函数与示例