2011-04-19 284 views
15

我創建了很多QPushButtons,添加了點擊信號和一個插槽名稱'deneme()',所有按鈕都使用了QT DESIGNER並且我想要做的事情是;當我點擊任何按鈕時,應該做一些操作,最後應該禁用按鈕,但我們不知道哪個按鈕被點擊。我知道我可以禁用與setEnabled()isEnabled()按鈕,但我不知道如何禁用它們。如何使一個QPushButton被禁用

回答

21

如果我理解正確你連接各種QPushButtons到同一個插槽。插槽deneme()裏面你想知道哪個按鈕被點擊了。 你可以這樣做:

void deneme() { 
    QPushButton * b = qobject_cast<QPushButton *>(sender()); 
    if (b) { 
     if (b == button1) { //button1 clicked 
      //doSomethin(); 
     } 
     else { 
      if (b == button2) { 
      //doSomething(); 
      } 
     } 
     b->setEnabled(false); 
    } 
    } 
+0

我認爲這是正確的,但它提供了錯誤,「qobject_cast沒有在此範圍內聲明」,即使我包含「qobject.h」 – Cengaver 2011-04-19 12:31:30

6

爲什麼setEnabled無法正常工作呢? The reference

所以一個簡單的setEnabled(false);足夠。

QPushButton* button = new QPushButton(someParent); 
button->setEnabled(false); 

如果一個事件處理程序的按鈕的Click事件連接也許你應該看看Qt文檔: Signal and slots

+0

問題是我創建了Gui並添加了與Qt設計器的所有按鈕。當我點擊任何按鈕後,將會執行一些操作,最後該按鈕應該被禁用。 – Cengaver 2011-04-19 10:07:40

2

你的意思是按鈕點擊後立即被禁用?我想在這種情況下,你可能想要做這樣的事情:

class MyWidget : public QWidget 
{ 
Q_OBJECT 

// ... 

private slots: 
    void disableButton(); 

private: 
    QPushButton *myButton; 

// ... 
}; 

MyWidget::MyWidget(QWidget *parent = NULL) : QWidget(parent) 
{ 

///... 
myButton = new QPushButton("click me", this); 
connect(myButton, SIGNAL(clicked), this, SLOT(disableButton)); 
// ... 
} 

void MyWidget::disableButton() 
{ 
myButton->setEnabled(false); 
} 
+0

你的答案可能是正確的,但問題是我創建了Gui並添加了與Qt設計器的所有按鈕。當我點擊任何按鈕後,會執行一些操作,最後該按鈕應該被禁用,並且我在這個編程中很新穎:( – Cengaver 2011-04-19 10:08:27

+1

你的意思是你的問題是在這個方法中你不能定義哪個按鈕被按下了?你可以使用QSignalMapper,它允許你將非參數信號(如QPushButton中的clicked()信號)映射到接受一個參數的插槽,因此你可以在上面的代碼示例中修改disableButton()方法來接收指示哪個按鈕被點擊 – beduin 2011-04-19 12:09:53

+0

非常感謝你 – Cengaver 2011-04-19 15:00:51

0

布魯諾的答案是正確的。

sender(); 

返回QObject* 可以使用它轉換爲一個QPushButton* 任 空調風格投即QPushButton* clickedButton = (QPushButton*)(sender())QPushButton* clickedButton = static_cast<QPushButton*>(sender()) 或 QPushButton * clickedButton = qobject_cast(發送者()); 據我所知,qobject_cast在C++中的作用類似於dynamic_cast <>。但是,如果你有編譯問題,上面給出的任何解決方案都應該正常工作。

+0

非常感謝 – Cengaver 2011-04-19 15:01:27

相關問題