在 Qt 中,普通类使用 connect 需要满足以下前置条件:
- 普通类必须继承自 QObject 或其子类,以便能够使用信号和槽机制。
- 必须将该普通类实例化为 QObject 的子类对象,并通过 registerObject() 注册到 Qt 元对象系统中。
- 连接信号和槽时,需要指定发送信号的对象和接收槽的对象。如果发送信号的是一个单独的普通类,则需要先将其封装为一个 QObject 的子类对象。
例如,有如下示例代码:
class MyObject : public QObject {
Q_OBJECT
public:
MyObject(QObject *parent = nullptr) : QObject(parent) {}
signals:
void mySignal(int value);
};
class MyNormalClass {
public:
void mySlot(int value) {
qDebug() << "Received signal: " << value;
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyObject obj;
MyNormalClass normalObj;
// 将普通类包装成 QObject 的子类对象
auto wrapper = new QObject(&obj);
wrapper->setObjectName("MyNormalClassWrapper");
// 注册到元对象系统中
qRegisterMetaType<MyNormalClass*>("MyNormalClass*");
// 连接信号和槽
bool ok = false;
ok = QObject::connect(&obj, &MyObject::mySignal,
wrapper, [=, &normalObj]() { normalObj.mySlot(value); });
if (ok) {
qDebug() << "Connect successful!";
} else {
qDebug() << "Connect failed!";
}
return app.exec();
}
在这个例子中,MyNormalClass 是一个普通类,它的对象 normalObj 通过 QObject 的子类对象 wrapper 进行了封装,并注册到元对象系统中。然后使用 connect 函数连接 MyObject 的信号和 MyNormalClass 的槽函数。