是否可以emit
signal
代表另一个QObject
?我想这样做的原因是,在编写模拟/测试代码并且只是想模拟某个对象发出信号时它会非常有用。
我尝试使用
QMetaObject::invokeMethod(otherObject, "mySignal", Q_ARG(QString, myArg));
因为documentation说:
[...]在对象obj上调用成员(信号或插槽名称)。[...]
但这对我不起作用。信号根本不会发出。
答案 0 :(得分:3)
您可以像这样简单地通过类调用信号:
otherObject.mySignal("Testing!");
关于线程安全问题的好点。通过显式设置连接类型,我可以使用invokeMethod解决方案。如果您的对象位于不同的线程中,则需要使用QueuedConnection而不是DirectConnection。这是我的简单测试用例:
<强>的main.cpp 强>
#include <QObject>
#include "Stub.h"
int main()
{
Stub stub;
Stub2 stub2;
QObject::connect(&stub, &Stub::TestSignal, &stub2, &Stub2::TestReceiver);
QMetaObject::invokeMethod(&stub,
"TestSignal",
Qt::DirectConnection,
Q_ARG(QString, "myArg"));
return 0;
}
Stub.h
#ifndef STUB_H
#define STUB_H
#include <QObject>
#include <QDebug>
class Stub : public QObject
{
Q_OBJECT
signals:
void TestSignal(QString s);
};
class Stub2 : public QObject
{
Q_OBJECT
public:
void TestReceiver(QString s) {qDebug() << "Got s:" << s;}
};
#endif // STUB_H