Qt QMetaObject::invokeMethod

简介

QMetaObject::invokeMethod是一个静态函数,用于在Qt信号槽机制之外,异步调用QObject子类的公开槽函数或者调用任意可调用对象。主要处理不同线程异步调用或延时操作。


参数

复制代码
bool QMetaObject::invokeMethod(QObject *obj, 
                              const char *member,
                              Qt::ConnectionType type = Qt::AutoConnection,
                              QGenericReturnArgument ret = QGenericReturnArgument(),
                              QGenericArgument val0 = QGenericArgument(),
                              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());
  • obj:调用槽函数的对象指针。
  • member:槽函数的名字,以字符串的方式。
  • type:连接类型,默认为 Qt::AutoConnection,可以根据需要选择 Qt::DirectConnection(直接连接,同步调用)或 Qt::QueuedConnection(队列连接,异步调用)
  • ret:返回值,需要用QGenericReturnArgument包装。
  • val:槽函数的参数,需要用QGenericArgument包装。

示例:

void test(); //无参数

bool testSlot(int value); //带参数

复制代码
//异步执行test函数
QMetaObject::invokeMethod(this, "test", Qt::QueuedConnection);

int arg = 666;
QGenericArgument  argVa1("value", &arg);
QGenericReturnArgument ret("result", &returnValue);
QMetaObject::invokeMethod(myObject,"testSlot",Qt::QueuedConnection,ret,argVa1);

注意:

调用槽函数时,必须确保被调用的对象存在且它所在的线程已经进入了事件循环(GUI线程就是事件循环线程)。如果不在GUI现场,则需要保证对象的生命周期足够长,知道参函数被调用完成为止。

相关推荐
HAPPY酷3 分钟前
C++ 和 Python 的“容器”对决:从万金油到核武器
开发语言·c++·python
大鹏说大话4 分钟前
告别 MSBuild 脚本混乱:用 C# 和 Nuke 构建清晰、可维护的现代化构建系统
开发语言·c#
Mr_sun.25 分钟前
Day09——入退管理-入住-2
android·java·开发语言
MAGICIAN...36 分钟前
【java-软件设计原则】
java·开发语言
gpfyyds66644 分钟前
Python代码练习
开发语言·python
CodeKwang1 小时前
Qt实战:简易Excel表格 | 附完整源码
qt·excel·qtabwidget·qt控件
盐真卿1 小时前
python第八部分:高级特性(二)
java·开发语言
茉莉玫瑰花茶1 小时前
C++ 17 详细特性解析(5)
开发语言·c++·算法
lly2024061 小时前
《堆的 shift down》
开发语言
黎雁·泠崖1 小时前
【魔法森林冒险】2/14 抽象层设计:Figure/Person类(所有角色的基石)
java·开发语言