2012-02-21 18 views
3

私はqdialogを持っています。下部にボタンボックスがあります。 「信号」が発生したときに、このスロットが起動しないのはなぜですか?次のようなコードを見て:qt、信号スロットが接続されていませんか?

MW :: GenStdダイアログボックス(およびui.ChoicButtons buttonboxを)です
std::unique_ptr<MW::GenStd> box(new MW::GenStd(&tOut, &tIn)); 
    box->ui.ChoiceButtons->addButton ("Ask", 
     QDialogButtonBox::AcceptRole); 
    box->ui.ChoiceButtons->addButton ("OverWrite", 
     QDialogButtonBox::AcceptRole); 
    box->ui.ChoiceButtons->addButton ("merge", 
     QDialogButtonBox::AcceptRole); 
    box->ui.ChoiceButtons->addButton ("Skip", 
     QDialogButtonBox::RejectRole); 

    QObject::connect(box->ui.ChoiceButtons, SIGNAL(clicked(QPushButton* b)), box.get(), SLOT(OnClick(QPushButton* b))); 

    return box->exec(); 

。モーダルダイアログは正しく表示されますが、相互作用していないようです。ボタンを押してもイベントは発生しません。スロットは、次のように宣言されています

public slots: 
    void OnClick(QPushButton* b) { 
     auto s(b->text()); 
     if (s == "Merge") { 
      setResult(2); 
     } else if (s == "Overwrite") { 
      setResult(1); 
     } else if (s == "Skip") { 
      setResult(0); 
     } else if (s == "Ask") { 
      setResult(3); 
     } 
    } 

}; 

(私はそれがここでは、このような文字列比較を行うためにひどく知っているが、それは、ボタンを検証するだけで簡単にモックアップ試験としてもです)。しかし、デバッグでは、その機能に到達していないことがわかります!

EDIT: Object::connect: No such signal QDialogButtonBox::clicked(QPushButton*) in AskGUISupport.cpp:150 しかしQDialogBu​​ttonBoxがクリックされた信号を持っていないと全く奇妙なよう:出力を見て提案されているように犯人を示しましたか?

+0

'ChoiceButtons'のタイプは何ですか?また、接続に失敗した場合、 'Qt'はconsole/debuggerに警告を出力します。これは非常に便利です。 – Lol4t0

+0

@ Lol4t0:よくこのエラーは 'オブジェクト::接続:AskGUISupport.cpp:150'のQDialogBu​​ttonBox :: clicked(QPushButton *)シグナルをポップアップします。 – paul23

+0

QPushButtonのclicked()シグナルをスロットに直接接続しないのはなぜですか? ButtonBoxクラスに独自のカスタム信号を定義することはできません(これはQtウィジェットクラスですか?)、イベントループがこの信号を知り、それを自動的に発生させることを期待します。 – ksming

答えて

1

QDialogBu​​ttonBoxは信号clicked (QAbstractButton * button)を持っているので、あなたがスロットvoid OnClick(QAbstractButton* b)を定義し、それに接続する必要があります。 QPushButtonではなく、QAbstractButtonを使用します。

2

documentationは、接続中の変数名を使用しないでください:

QObject::connect(box->ui.ChoiceButtons, SIGNAL(clicked(QPushButton*)), 
       box.get(), SLOT(OnClick(QPushButton*))); 
0

QDialogButtonBoxクラスは、信号

clicked(QPushButton*)を持っていません。

clicked (QAbstractButton*)です。

シグナル/スロットメカニズムを使用する場合は、シグネチャで非常に正確でなければなりません。 Qtは文字列を内部的に使用して署名をチェックするため、キャストは許可されません。

clicked (QAbstractButton*)の署名を使用し、スロットをアロフトQAbstractButton*に調整する必要があります。スロットを作る

void OnClick(QAbstractButton* b); 
関連する問題