QMetaObject::invokeMethod 是 Qt 中的一个静态函数,它可以在运行时动态地调用一个对象的成员函数
用于在线程之间调用某个对象的槽函数。它可以在不同线程之间调用槽函数,而不会引发死锁。
它的使用方式是:
QMetaObject::invokeMethod(obj, member, type, ret, val0, val1, …):这是最常用的一种形式,它接受以下参数:
QMetaObject::invokeMethod(obj, member, type):这是一种简化的形式,只有三个参数,表示调用没有返回值和参数的成员函数。
QMetaObject::invokeMethod(obj, member):这是一种更简化的形式,只有两个参数,表示调用没有返回值和参数的成员函数,并且使用默认的连接类型 Qt::AutoConnection。
示例如下:
QMetaObject::invokeMethod(object, "slotName", Qt::QueuedConnection, Q_ARG(int, arg1), Q_ARG(QString, arg2));
// 假设有一个类 C,定义了一个信号 sigC 和一个槽函数 slotCclass C : public QObject {Q_OBJECT
public:C(QObject *parent = nullptr) : QObject(parent) {}
signals:void sigC(int x); // 定义一个带有 int 参数的信号
public slots:int slotC(int y); // 定义一个带有 int 参数和返回值的槽函数
};// 在 main 函数中创建一个对象 c,并使用 invokeMethod 函数调用它int main(int argc, char *argv[]) {QApplication app(argc, argv);C c;// 使用第一种形式调用 c 的 slotC 槽函数,并传递 10 作为参数// 并将返回值存储在 result 变量中int result;QMetaObject::invokeMethod(&c,"slotC",Qt::DirectConnection,Q_RETURN_ARG(int,result),Q_ARG(int,10));// 使用第二种形式调用 c 的 sigC 信号,并传递 20 作为参数// 这相当于直接 emit c.sigC(20)QMetaObject::invokeMethod(&c,"sigC",Qt::DirectConnection,Q_ARG(int,20));// 使用第三种形式调用 c 的 slotC 槽函数,并传递 30 作为参数// 并将返回值存储在 result 变量中// 这相当于直接 result = c.slotC(30)int result;QMetaObject::invokeMethod(&c,"slotC",Q_RETURN_ARG(int,result),Q_ARG(int,30));return app.exec();
}
参考资料:
c++ - Why using QMetaObject::invokeMethod when executing method from thread - Stack Overflow
Qt信号槽调用方式(emit与QMetaObject::invokeMethod)_Scarlett_OHara的博客-CSDN博客