Qt UI Slot 不被从基类继承的信号调用
Posted
技术标签:
【中文标题】Qt UI Slot 不被从基类继承的信号调用【英文标题】:Qt UI Slot isn't called by a signal inherited from a base class 【发布时间】:2013-12-03 13:33:29 【问题描述】:我遇到了一个愚蠢的问题,而且我对 Qt 还是很陌生。
我有一个类 (SoundSampler) 从基类 (BaseSampler) 继承信号,并且该信号在 UI 构造函数 (MainWindow) 到 UI 中的插槽 (sampleAvailable())。
问题:
即使认为连接正确发生(connect() 在 UI 类中返回 true,isSignalconnected 在 SoundSampler 类中也返回 true) , 该插槽永远不会被调用。 ..................................................... ....................
这是我的代码(精简到基本部分):
BaseSampler
class BaseSampler : public QObject
Q_OBJECT
public:
explicit BaseSampler(QObject *parent = 0);
void getSample();
signals:
void sampleAvailable(QByteArray *returnSample);
public slots:
virtual void getSample() = 0;
protected:
QByteArray *mSample;
;
声音采样器
class SoundSampler : public BaseSampler
Q_OBJECT
public:
SoundSampler();
signals:
public slots:
void stopRecording();
void getSample();
private:
QAudioInput *mAudioInput;
QBuffer *mBuffer;
;
.................................................. ....................................
void SoundSampler::stopRecording()
...
mSample->append("test");
emit sampleAvailable(mSample);
qDebug() << "Signal emmited"; //this get properly displayed in output
主窗口
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
public slots:
void sampleHandler(QByteArray*);
private:
QWidget *window;
SoundSampler *ss;
;
.................................................. ....................................
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
window = new QWidget();
ss = new SoundSampler();
boutonStart = new QPushButton(tr("&Start"));
layout = new QHBoxLayout;
layout->addWidget(boutonStart);
window->setLayout(layout);
window->show();
connect(boutonStart, SIGNAL(clicked()),
ss, SLOT(getSample())); //This connection works
//The getSample() starts a Timer witch successfully calls the stopRecording slot
connect(ss, SIGNAL(sampleAvailable(QByteArray*)),
this, SLOT(sampleHandler(QByteArray*))); //This connection should work
//The connect returns true, indicating the connection happend.
//This slot is never called.
void MainWindow::sampleHandler(QByteArray *sample)
qDebug() << "Passed Value: " << *sample;
【问题讨论】:
如果你将指针存储到基类而不是派生类,即BaseSampler *ss;
而不是SoundSampler *ss;
没有改变,也没有调用插槽。我还尝试将另一个信号连接到插槽:connect(boutonStart, SIGNAL(clicked()), this, SLOT(sampleHandler()));
但它也不起作用......仍在调查中。 (我将 sampleHandler 更改为当然不需要参数)
是否生成了 MainWindow 的 moc 文件?您是否尝试过清理并再次运行 qmake?
【参考方案1】:
好的,我解决了。
问题不在于 MainWindow 类,而在于调用它的类... 我的同事实施得很糟糕(MainWindow 实例化的对象仅在构造函数中,而不是类的成员)。
因此,一旦构造函数完成,插槽就会被取消注册。
(抱歉弄得一团糟,无论如何谢谢你 vahancho ;))
【讨论】:
以上是关于Qt UI Slot 不被从基类继承的信号调用的主要内容,如果未能解决你的问题,请参考以下文章
使用纯多态性和继承从基类调用派生类上的函数而不进行强制转换?