2009-05-02 8 views
0

私は、Qtの信号とスロットのメカニズムを理解しようとしています。私は、QPushButtonとQSpinBoxを持つアプリを持っています。ボタンをクリックすると、スピンボックスを20に変更します。どの信号とスロットを設定する必要がありますか?Qtでスピンボックスを一定の値に設定するにはどうすればいいですか?

次のコードはアプリを示しています。接続機能は問題があります。 QPushButtonのclicked()シグナルが異なるシグネチャを持つため、QSpinBoxのsetValue(int)スロットはここでは機能しません。とにかく、値20をスピンボックスにどのように渡すのですか?私は、spinbox-> setValue(20)を呼び出すスロットとして機能するために何らかの補助関数を書く必要がありますか?もしそうなら、それはどのような形ですか?

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QWidget *window = new QWidget; 
    QSpinBox *spinbox = new QSpinBox; 
    QPushButton *button = new QPushButton("Set to 20"); 

    spinbox->setRange(0, 100); 

    // What should I put below? 
    QObject::connect(button, SIGNAL(clicked()), spinbox, SLOT(???????)); 

    QLayout *layout = new QHBoxLayout; 
    layout->addWidget(spinbox); 
    layout->addWidget(button); 
    window->setLayout(layout); 

    window->show(); 

    return app.exec(); 

} 
+1

ドキュメントには必要なものすべてが含まれています。私はこれで始めることをお勧めします:http://doc.trolltech.com/4.5/signalsandslots.html – Anonymous

+0

そこには私が知る必要があることが分かりません。 – PowerApp101

+0

本当ですか? 信号とスロットのメカニズムはタイプセーフです。信号のシグネチャは、受信スロットのシグネチャと一致する必要があります。 あなたの質問をカバーするいくつかの簡単な例があります。 – Anonymous

答えて

3

あなたが行うことができ、次のいずれか

class AuxSignals : public QObject 
{ 
    Q_OBJECT 
    ... 
    signals: 
     void valueChanged(int); 
    public slots: 
     void buttonClicked() { emit valueChanged(20); } 
}; 

... 

// On main.cpp 
AuxSignals *auxSignals = new AuxSignals; 

QObject::connect(button, SIGNAL(clicked()), auxSignal, SLOT(buttonClicked)); 
QObject::connect(auxSignals, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int))); 

または

class AuxSignals : public QObject 
{ 
    Q_OBJECT 
    ... 
    QSpinBox *m_spinBox; 
    public: 
     AuxSignals(QSpinBox *spinBox) : m_spinBox(spinBox) {} 
    public slots: 
     void buttonClicked() { m_spinBox->setValue(20); } 
}; 

... 

// On main.cpp 
AuxSignals *auxSignals = new AuxSignals(spinBox); 

QObject::connect(button, SIGNAL(clicked()), auxSignals, SLOT(buttonClicked())); 

を、それが特定のQWidgetへのポインタを持っているAuxSignalsクラスを必要としないので、私は最初のオプションを好みます。

+0

パーフェクト!私は実際には1つだけの接続を使用するので、第2版を好む。小さな補正 - それはm_spinBox-> setValue(20)である必要があります。再度、感謝します。 – PowerApp101

+0

ようこそ。私はm_spinBox-> setValue(20)を修正しました。命令。 – Gaston

1

ここでカスタムSLOTを見ていると思います。 QPushButton::clicked信号はブール値(true|false)のイベントを与えます。あなたがQSpinBox::setValueを使ってそれを捕まえれば、遠くに行かないでしょう。 QSpinBox::setValueはintを想定しており、入力ブール値を大文字と小文字の違いで0または1に変換し、スピンボックスは1単位だけ増加します。カスタムSLOTを書く場合は、実際のスライダの値をより詳細に制御することができます。

+0

カスタムスロットを定義するためにQt Designerを使う必要があるようです。生のコードにはもっと簡単な方法があると思っていました。 QSpinBoxをサブクラス化し、setValue(20)を行う新しいスロットを定義するとどうでしょうか?それがベストプラクティスですか? – PowerApp101

+0

ラッパー(サブクラス化/合成)は確実に機能します。 – dirkgently

関連する問題