如何使QPushButton变为禁用状态

35

我使用QT DESIGNER创建了许多QPushButtons,并为所有按钮添加了clicked信号和一个名为´deneme()´的插槽。现在我想做的事情是:当我点击任何一个按钮时,需要执行某些操作,并且最后该按钮应该被禁用,但我们不知道哪个按钮被点击了。我知道我可以使用setEnabled()isEnabled()来禁用这些按钮,但我不知道如何禁用它们。

4个回答

45

如果我理解正确,您将各种 QPushButtons 连接到同一槽中。在 deneme() 槽内,您想知道哪个按钮被 clicked。 您可以这样做:

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

我认为代码是正确的,但是即使我包含了“qobject.h”文件,它仍然会出现“qobject_cast在此范围内未声明”的错误。 - Cengaver

13

为什么setEnabled无效呢?参考文献

所以简单的setEnabled(false);就足够了。

QPushButton* button = new QPushButton(someParent);
button->setEnabled(false);
如果在单击按钮时连接事件处理程序,也许您应该查看QT文档:Signal and slots

问题在于我使用Qt Designer创建了Gui并为所有的按钮添加了槽。当我点击任何一个按钮时都会进行一些操作,最后按钮应该被禁用。 - Cengaver

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

你的答案可能是正确的,但我的问题是我创建了Gui并使用Qt Designer为所有按钮添加了槽。当我点击任何按钮时,会执行一些操作,最后按钮应该被禁用,而我对这个编程非常陌生 :( - Cengaver
1
你的问题是在这个方法中你无法定义哪个按钮被按下了?这个问题也是可以解决的。你只需要使用QSignalMapper。它允许你将无参数信号(如QPushButton中的clicked()信号)映射到接受一个参数的槽中。因此,你可以修改上面代码示例中的disableButton()方法,以接收指示哪个按钮被点击的参数。 - beduin

1
Bruno的回答是正确的。
sender();

返回一个 QObject*,你可以将其转换为 QPushButton*,使用以下任一方式进行转换: C风格转换,即 QPushButton* clickedButton = (QPushButton*)(sender())QPushButton* clickedButton = static_cast<QPushButton*>(sender()) 或 QPushButton * clickedButton = qobject_cast(sender()); 据我所知,qobject_cast 的工作方式类似于 C++ 中的 dynamic_cast<>。但如果您遇到编译问题,上述任何解决方案都应该可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接