这是一篇关于使用QPushButton时,设置setEnable(false)后,按钮未置灰,而是显示非置灰样式的解决方案。
原因
在对某工业控制软件进行设计及实现时,需要对按钮状态进行同步更新。即当按钮不能操作时,要设置按钮为置灰状态;当按钮可操作时,设置按钮为使能状态。
实现也比较简单:
// 设置不可操作
ui->btn->setEnable(false);
// 设置使能
ui->btn->setEnable(true);
当点击‘置灰’按钮后,应该显示为以下效果:
但实际显示是:
虽说不影响功能,但感观上确实不好。
‘伪’解决方案
这种情况应该是页面未及时刷新导致的。以下是一些可能的解决方案。
一、手动触发重绘
在设置 setEnabled(false)
之后,手动触发按钮所在的容器或者整个窗口的重绘。
如:按钮在一个 QWidget
中,可以按以下实现:
button->setEnabled(false);
widget->update(); // widget 是按钮所在的窗口
二、检查事件过滤器或信号槽连接
可能有事件过滤器或者信号槽连接影响了按钮的外观更新。检查是否有其他组件向按钮发送了意外的事件或者信号,导致按钮的外观更新出现问题。如果有,可以考虑去除或调整这些事件过滤器和信号槽连接。
三、使用不同的方法禁用按钮
可以尝试使用其他方法来禁用按钮,例如通过设置按钮的 blockSignals(true)
和 setDisabled(true)
来禁用按钮的信号发射和交互,看看是否能正确显示为置灰状态。
四、检查布局问题
如果按钮在布局中,布局的某些特性可能会影响按钮的显示。确保布局正确设置,并且没有干扰按钮的外观更新。可以尝试调整布局或者重新设置布局来解决问题。
‘真’解决方案
经过以上尝试,会发现,问题并未得到解决。
因为,可以尝试使用样式表
来解决此问题。
// css
QPushButton#btn_greyOut{
background-color: #e1e1e1;
color: black;
border: 1px solid #adadad;
width: 75px;
height: 19px;
}
QPushButton#btn_greyOut:hover {
background-color: #e5f1fb;
border: 1px solid #0078d7;
}
QPushButton#btn_greyOut:pressed {
background-color: #cce4f6;
}
QPushButton#btn_greyOut:leave {
/* 鼠标移开时的样式 */
background-color: #4CAF50;
}
QPushButton#btn_greyOut:disabled {
/* 按钮被禁用时的样式 */
background-color: #cccccc;
color: #787878;
}
// code
ui->btn_greyOut->setStyleSheet("QPushButton{background-color: #e1e1e1; color: black; border: 1px solid #adadad; width: 75px;height: 19px;}"
"QPushButton:hover {background-color: #e5f1fb; border: 1px solid #0078d7;}"
"QPushButton:pressed {background-color: #cce4f6;}"
"QPushButton:leave {background-color: #4CAF50;}"
"QPushButton:disabled {background-color: #cccccc; color: #787878;}");
以上颜色,边框,宽,高等属性都是根据按钮的系统样式进行调试的。
经过以上设置,发现,问题完美解决。