关于qt:如何禁用QPushButton


How to make a QPushButton disabled

我创建了许多QPushButton,并使用QT DESIGNER向所有按钮添加了点击信号和插槽名称deneme(),而我要做的是; 当我单击任何按钮时,应执行一些操作,最后应禁用该按钮,但我们不知道单击了哪个按钮。 我知道我可以使用setEnabled()isEnabled()禁用按钮,但是我不知道如何禁用它们。


如果我正确理解,您会将各种QPushButtons连接到同一插槽。 您想知道插槽deneme()中的哪个按钮是clicked
您可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  void deneme() {
    QPushButton * b = qobject_cast<QPushButton *>(sender());
    if (b) {
       if (b == button1) { //button1 clicked
           //doSomething();
       }
       else {
          if (b == button2) {
             //doSomething();
          }
       }
       b->setEnabled(false);
    }
  }


为什么setEnabled不起作用? 参考资料。

所以一个简单的setEnabled(false); 足够。

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

如果在按钮的click事件上连接事件处理程序,则应该查看QT文档:
信号和插槽


您是说要在单击按钮后立即禁用按钮? 我想在这种情况下,您可能想要执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
}


布鲁诺的答案是正确的。

1
sender();

返回QObject*
您可以将其转换为QPushButton*
使用任一
C样式强制转换,即QPushButton* clickedButton = (QPushButton*)(sender())
要么
QPushButton* clickedButton = static_cast(sender())
要么
QPushButton * clickedButton = qobject_cast(sender());
据我所知,qobject_cast的工作方式与C ++中的dynamic_cast <>相似。 但是,如果您遇到编译问题,则上面给出的任何解决方案都可以正常工作。