我使用QT DESIGNER
创建了许多QPushButtons,并为所有按钮添加了clicked信号和一个名为´deneme()´的插槽。现在我想做的事情是:当我点击任何一个按钮时,需要执行某些操作,并且最后该按钮应该被禁用,但我们不知道哪个按钮被点击了。我知道我可以使用setEnabled()
和isEnabled()
来禁用这些按钮,但我不知道如何禁用它们。
我使用QT DESIGNER
创建了许多QPushButtons,并为所有按钮添加了clicked信号和一个名为´deneme()´的插槽。现在我想做的事情是:当我点击任何一个按钮时,需要执行某些操作,并且最后该按钮应该被禁用,但我们不知道哪个按钮被点击了。我知道我可以使用setEnabled()
和isEnabled()
来禁用这些按钮,但我不知道如何禁用它们。
如果我理解正确,您将各种 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);
}
}
为什么setEnabled无效呢?参考文献。
所以简单的setEnabled(false);就足够了。
QPushButton* button = new QPushButton(someParent);
button->setEnabled(false);
如果在单击按钮时连接事件处理程序,也许您应该查看QT文档:Signal and slots您的意思是在单击按钮后必须将其禁用?我猜,如果是这种情况,您可能想要像这样做:
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);
}
sender();
返回一个 QObject*
,你可以将其转换为 QPushButton*
,使用以下任一方式进行转换:
C风格转换,即 QPushButton* clickedButton = (QPushButton*)(sender())
或
QPushButton* clickedButton = static_cast<QPushButton*>(sender())
或
QPushButton * clickedButton = qobject_cast(sender());
据我所知,qobject_cast 的工作方式类似于 C++ 中的 dynamic_cast<>。但如果您遇到编译问题,上述任何解决方案都应该可以正常工作。
qobject_cast
在此范围内未声明”的错误。 - Cengaver