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

时间:2014-03-24 00:46:21

标签: qt5 signals-slots

是否可以emit signal代表另一个QObject?我想这样做的原因是,在编写模拟/测试代码并且只是想模拟某个对象发出信号时它会非常有用。

我尝试使用

QMetaObject::invokeMethod(otherObject, "mySignal", Q_ARG(QString, myArg));

因为documentation说:

  

[...]在对象obj上调用成员(信号或插槽名称)。[...]

但这对我不起作用。信号根本不会发出。

1 个答案:

答案 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