2012-02-21 119 views
3

我有一個qdialog,底部有一個buttonbox;爲什麼當一個「信號」發生時,這個插槽不會被觸發?代碼如下所示:qt,信號插槽沒有連接?

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(); 

其中MW :: GenStd是一個對話框(和ui.ChoicButtons一個buttonbox)。模式對話框正確顯示 - 但它似乎根本沒有互動。按下按鈕不會觸發事件。插槽聲明如下所示:

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

}; 

(我知道這是可怕的,在這裏做這樣的字符串比較,但它只是作爲快速模擬測試以驗證按鈕)。但調試顯示該功能還沒有達到!

編輯:作爲建議要在輸出端表現出了罪魁禍首: Object::connect: No such signal QDialogButtonBox::clicked(QPushButton*) in AskGUISupport.cpp:150 然而,隨着QDialogBu​​ttonBox確實有點擊信號,似乎全然陌生? documentation

+0

「ChoiceButtons」的類型是什麼?此外,當連接失敗時,'Qt'將警告輸出到控制檯/調試器,這將非常有用。 – Lol4t0 2012-02-21 15:49:46

+0

@ Lol4t0:這個錯誤彈出'對象::連接:沒有這樣的信號QDialogBu​​ttonBox ::點擊(QPushButton *)在AskGUISupport.cpp:150' - 但手動真正的狀態點擊qt是一個信號? – paul23 2012-02-21 15:50:33

+0

爲什麼不直接將QPushButton clicked()信號連接到您的插槽?你不能爲ButtonBox類定義自己的自定義信號(這是一個Qt widget類嗎?),並期望事件循環知道這個信號並自動激發它。 – ksming 2012-02-21 15:53:52

回答

1

QDialogBu​​ttonBox具有信號clicked (QAbstractButton * button)所以你需要定義一個槽void OnClick(QAbstractButton* b)並連接到它。使用QAbstractButton,而不是QPushButton。

2

不要在連接使用的變量名:

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

QDialogButtonBox類不具有信號

clicked(QPushButton*)

它有clicked (QAbstractButton*) insted。

使用信號/插槽機制時,您應該對簽名非常精確。因爲Qt在內部使用字符串來檢查簽名,所以不允許任何投射。

您應該使用clicked (QAbstractButton*)簽名並調整您的插槽以應對QAbstractButton*。製作插槽

void OnClick(QAbstractButton* b);