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,isSignalconnectedSoundSampler 类中也返回 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 不被从基类继承的信号调用的主要内容,如果未能解决你的问题,请参考以下文章

QT 中 关键字讲解(emit,signal,slot)

如何从基类中的函数调用重载函数?

使用纯多态性和继承从基类调用派生类上的函数而不进行强制转换?

派生类不从基类继承重载方法

Razor Pages - 在所有 OnGet 处理程序之后从基类调用方法

错误:与 'operator=' 不匹配。试图从基类继承并从基类初始化?