如何在Qt信号中使用对抽象类的引用?

时间:2011-01-31 13:59:13

标签: c++ qt signals-slots

假设我有一个抽象基类Foo,我想在信号中使用对它的引用:

void FooUpdated(Foo &);

这不起作用,永远不会调用匹配的槽。有没有办法实现这一点,或者我必须使用指针(它使用指针)。

修改 - 代码

信号(IDecodedFrame是抽象的):

void ShowFrameSignal( IDecodedFrame & DecodedFrame );

插槽:

virtual void ShowFrame( IDecodedFrame & DecodedFrame );

连接:

connect(this, SIGNAL(ShowFrameSignal(libCommon::IDecodedFrame &)),
        sink, SLOT(ShowFrame(libCommon::IDecodedFrame &)));

调试显示connect返回true

2 个答案:

答案 0 :(得分:0)

SIGNALSLOT宏不需要引用符号(&)。我不确定这是不是绊倒了,但下面使用对抽象类的引用的例子对我有用:

#include <QtCore>
#include <QtDebug>

class ISignalable {
public:
  virtual void Go() const = 0;
};

class Signalable : public ISignalable {
public:
  void Go() const { qDebug() << "Go!"; }
};

class Caller : public QObject {
  Q_OBJECT
public:
  void CallSignal(const ISignalable &obj) const { RunSignal(obj); }
signals:
  void RunSignal(const ISignalable &obj) const;
};

class Sink : public QObject {
  Q_OBJECT
public slots:
  void HandleSignal(const ISignalable &obj) const {
    obj.Go();
  }
};

int main (int argc, char ** argv)
{
  QCoreApplication app(argc, argv);
  Caller c;
  Sink s;
  QObject::connect(&c, SIGNAL(RunSignal(ISignalable)),
                   &s, SLOT(HandleSignal(ISignalable)));
  Signalable obj;
  c.CallSignal(obj);
  return app.exec();
}

#include "main.moc"

这也有效:

QObject::connect(&c, SIGNAL(RunSignal(const ISignalable&)),
                 &s, SLOT(HandleSignal(const ISignalable&)));

但这不起作用:

QObject::connect(&c, SIGNAL(RunSignal(ISignalable&)),
                 &s, SLOT(HandleSignal(ISignalable&)));

答案 1 :(得分:0)

如果发送方和接收方位于不同的线程中,则连接将排队,并且使用此类连接时,您无法使用引用,因为它们无法复制。当您调用connect()连接的类型设置为Qt::AutoConnection时,您没有提供连接的类型,并且在connect()时,未知信号的传递(读取呼叫时隙)是否成功调用。

顺便说一句,这对我有用:

#include <QtCore/QCoreApplication>
#include <QDebug>


class Abstract : public QObject {
    Q_OBJECT
public:
    virtual ~Abstract() {};
    virtual void abstract() = 0;
};


class Test : public QObject {
    Q_OBJECT
public:
    Test() {
        connect(this, SIGNAL(aSignal(Abstract &)),
                this, SLOT(aSlot(Abstract &)));
    };
    void test() {
        emit aSignal(*static_cast<Abstract*>(0));
    }

signals:
    void aSignal(Abstract & abstract);

public slots:
    virtual void aSlot(Abstract & abstract) {
        qDebug() << "slot was called";
    };
};


int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    Test aTest;
    aTest.test();

    return app.exec();
}

#include "main.moc"