1

私はばかげた問題に出くわしています.Qtは初めてです。

基本クラス ( BaseSampler )からシグナルを継承するクラス ( SoundSampler )があり、このシグナルは UI コンストラクター ( MainWindow ) で UI のスロット ( sampleAvailable() ) に接続ます

問題:

接続が適切に行われたとしても ( UI クラスでconnect()が true を返し、 SoundSamplerクラスでisSignalconnectedも true を返す)、スロットが呼び出されることはありません。................................................................... ................................................

これが私のコードです(要点に合わせてトリミングされています):

ベースサンプラー

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

1 に答える 1

1

わかりました、解決しました。

問題は MainWindow クラスではなく、それを呼び出すクラスにありました...これは私の同僚によってひどく実装されていました (MainWindow のインスタンス化されたオブジェクトはコンストラクターのみにあり、クラスのメンバーとしてではありませんでした)。

したがって、コンストラクターが完了すると、スロットは登録解除されました。

(混乱して申し訳ありませんが、とにかくvahanchoに感謝します;))

于 2013-12-03T15:16:39.067 に答える