QMetaObject::invokeMethod实现案例
时间: 2024-11-29 10:14:55 浏览: 1
QMetaObject是Qt库中的一个核心组件,它允许在运行时查询和操作对象的方法。`QMetaObject::invokeMethod`用于动态地在对象上调用指定的方法。下面是一个简单的使用案例:
```cpp
#include <QObject>
#include <QMetaObject>
#include <QDebug>
class MyQObject : public QObject
{
Q_OBJECT
public:
explicit MyQObject(QObject *parent = nullptr) : QObject(parent) {}
void regularMethod() {
qDebug() << "Regular method called.";
}
// 添加一个信号
void emitSignal() {
qDebug() << "Signal emitted.";
emit mySignal(); // 这里可以发射自定义的信号
}
signals:
void mySignal();
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyQObject object;
// 使用QMetaObject查找并调用方法
QMetaObject::Connection conn = QMetaObject::invokeMethod(&object, "regularMethod", Qt::QueuedConnection); // 使用异步连接
if (conn.isValid()) {
qDebug() << "Connected to regularMethod";
delete &conn; // 确保删除连接,避免内存泄漏
}
// 发送信号并通过invokeMethod间接调用槽
conn = QMetaObject::invokeMethod(&object, "emitSignal");
if (conn.isValid()) {
qDebug() << "Connected to emitSignal";
delete &conn; // 同样释放连接
}
return app.exec();
}
```
在这个例子中,`QMetaObject::invokeMethod`首先查找`MyQObject`的`regularMethod`方法,并建立了一个异步连接,当`regularMethod`被调用时,会打印相应的消息。然后,我们调用`emitSignal`,这个信号会被自动映射到声明的槽函数(未显示),因为`Q_OBJECT`宏启用了Qt的元对象系统。
阅读全文