Слот пользовательского интерфейса Qt не вызывается сигналом, унаследованным от базового класса

Я натыкаюсь на глупую проблему, и я совершенно новичок в Qt.

У меня есть класс (SoundSampler), который наследует сигнал от базового класса (BaseSampler), и этот сигнал подключается в конструкторе пользовательского интерфейса (MainWindow ) в слот пользовательского интерфейса (sampleAvailable()).

Эта проблема:

Даже если соединение установлено правильно (connect() возвращает true в классе пользовательского интерфейса, а isSignalconnected также возвращает true в классе SoundSampler), слот никогда не называется. ................................................. ..............................

Вот мой код (урезанный до необходимого):

Базовый сэмплер

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;
}

person Thomas    schedule 03.12.2013    source источник
comment
Что, если вы сохраните указатель на базовый класс, а не на производный, то есть BaseSampler *ss; вместо SoundSampler *ss;   -  person vahancho    schedule 03.12.2013
comment
Ничего не изменилось, слот тоже не вызывается. Я также пытался подключить другой сигнал к слоту: connect(boutonStart, SIGNAL(clicked()), this, SLOT(sampleHandler())); Но он тоже не работает ... все еще исследую. (Конечно, я изменил sampleHandler, чтобы он не требовал никаких параметров)   -  person Thomas    schedule 03.12.2013
comment
Генерируются ли файлы moc для MainWindow? Вы пытались очистить и снова запустить qmake?   -  person vahancho    schedule 03.12.2013


Ответы (1)


Хорошо, я решил это.

Проблема была не в классе MainWindow, а в вызывающем его классе... Что было плохо реализовано моим коллегой (экземпляр объекта MainWindow был только в конструкторе, а не как член класса).

Таким образом, после завершения конструктора регистрация слота была отменена.

(Извините за беспорядок и все равно спасибо ваханчо ;))

person Thomas    schedule 03.12.2013