2011-04-19 287 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

相关问题