2017-05-22 18 views
1

スロットで信号を受信して​​別の信号を送信しようとするまで、すべてがうまく動作するテストQtアプリケーションを作成しています(MyWidget :: setValueはMyWidget :: valueChangedのエミッションを発生させません)。私は間違って何をしていますか?Qt信号転送 - 何が間違っていますか?

#include <QApplication> 
#include <QVBoxLayout> 
#include <QSpinBox> 
#include <QSlider> 

class MyWidget: public QWidget { 
    Q_OBJECT 
signals: 
    void valueChanged(int value); 
public slots: 
    void setValue(int value){ 
     emit valueChanged(value); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MyWidget* win = new MyWidget; 
    QVBoxLayout* layout = new QVBoxLayout(win); 
    QSpinBox* spin =new QSpinBox(); 
    QSlider* slider = new QSlider(Qt::Horizontal); 

    spin->setMinimum(-100); 
    spin->setMaximum(100); 

    slider->setMinimum(-100); 
    slider->setMaximum(100); 

    layout->addWidget(spin); 
    layout->addWidget(slider); 

    QObject::connect(spin, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); 
    QObject::connect(slider, SIGNAL(valueChanged(int)), win, SLOT(setValue(int))); 
    QObject::connect(win, SIGNAL(valueChanged(int)), spin, SLOT(setValue(int))); 

    win->show(); 
    return app.exec(); 
} 
+0

放出が起こらないことをどのように知っていますか? – Angew

+0

Qt5を使用している場合、実行時にエラーを報告するだけの古い 'SIGNAL()'と 'SLOT()'マクロではなく、新しいコンパイル時にチェックされた 'connect()'構文を使うことをお勧めします。 –

+0

ここで循環依存関係を作成していませんか? スピンの値を変更すると、スライダの値が変更されます。 スライダの値を変更すると、ウィンドウの値が変更されます。 Windowsの値を変更すると、スピンの値が変更されます。 – Geek

答えて

1

私が間違って何をしているのですか?

Qtがループを強制的に切断して自分自身を保護しなかった場合、スタックをオーバーフローさせてしまいます。これは唯一の保護メカニズムなので、その唯一の仕事はフリーズとクラッシュを防ぐことです。あなたのアプリケーションを機能させるものではありません。

最初にループを作成しないでください。

あなたはそうすることができます。元のウィジェットのsetValueスロットを起動しないでください。setValueスロットがvalueChanged信号の本体内から呼び出されたことを思い出してください。

関連する問題