gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:24:51 24 4
gpt4 key购买 nike

假设我有一个抽象基类 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 &)));

调试显示连接返回 true

最佳答案

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&)));

关于c++ - 如何在 Qt 信号中使用对抽象类的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4851692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com