假设我有一个抽象基类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
。
答案 0 :(得分:0)
SIGNAL
和SLOT
宏不需要引用符号(&
)。我不确定这是不是绊倒了,但下面使用对抽象类的引用的例子对我有用:
#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"