QMetaObject::invokeMethod
阅读数:15 评论数:0
跳转到新版页面分类
C/C++
正文
一、基本作用
QMetaObject::invokeMethod
的主要用途是在目标对象的线程中调用方法,而不是当前线程中。
1、函数签名
static bool QMetaObject::invokeMethod(QObject *obj, const QString &method, Qt::ConnectionType type = Qt::AutoConnection);
obj
:你要调用方法的对象。method
:方法名,以字符串的形式传递。可以是槽函数或普通成员函数。type
:指定连接类型(例如:Qt::AutoConnection
、Qt::DirectConnection
、Qt::QueuedConnection
等)。
2、连接类型
(1)Qt::AutoConnection
默认方式,自动选择合适的连接方式。如果信号和槽在同一线程,使用 Qt::DirectConnection
,否则使用 Qt::QueuedConnection
。
(2)Qt::DirectConnection
信号发射者和接收者在同一线程时,方法会被直接调用。如果在不同线程中,QMetaObject::invokeMethod
会失败。
(3)Qt::QueuedConnection
方法的调用会被排入目标线程的事件队列中异步执行。适用于跨线程操作,确保在目标线程中执行。
(4)Qt::BlockingQueuedConnection
类似于 Qt::QueuedConnection
,但是会阻塞信号发射者,直到接收者处理完信号。适用于需要同步的操作。
二、调用方法
1、调用对象的槽函数
QMetaObject::invokeMethod(obj, "methodName", Qt::QueuedConnection);
在这个例子中,methodName
是你想要调用的槽函数名。Qt::QueuedConnection
确保该槽函数的执行会被排入事件队列,并在正确的线程中执行(通常是主线程)。
2、传递参数给槽函数
QMetaObject::invokeMethod(obj, "methodName", Qt::QueuedConnection, Q_ARG(int, 42), Q_ARG(QString, "hello"));
3、调用普通成员函数
QMetaObject::invokeMethod(obj, "methodName", Qt::QueuedConnection);