是否有可能emit一个signal由他人代QObject?我想这样做的原因是它在编写模拟/测试代码时非常有用,并且只是想模拟某个对象发出信号。
我试着用
QMetaObject::invokeMethod(otherObject, "mySignal", Q_ARG(QString, myArg));
Run Code Online (Sandbox Code Playgroud)
因为文档说:
[...] 调用对象 obj上的成员(信号或插槽名称)。[...]
但这对我不起作用。信号根本没有发出。
小智 5
您可以简单地通过类调用信号,如下所示:
otherObject.mySignal("Testing!");
Run Code Online (Sandbox Code Playgroud)
关于线程安全问题的好观点。通过显式设置连接类型,我让它与 invokeMethod 解决方案一起工作。如果您的对象在不同的线程中,则需要使用 QueuedConnection 而不是 DirectConnection。这是我的简单测试用例:
主程序
#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;
}
Run Code Online (Sandbox Code Playgroud)
存根.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
Run Code Online (Sandbox Code Playgroud)