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::AutoConnectionQt::DirectConnectionQt::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);



相关推荐