Qt5 代表另一个对象发出信号

Len*_*and 1 signals-slots qt5

是否有可能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)