这是一篇关于使用QPushButton时,设置setEnable(false)后,按钮未置灰,而是显示非置灰样式的解决方案。

原因

在对某工业控制软件进行设计及实现时,需要对按钮状态进行同步更新。即当按钮不能操作时,要设置按钮为置灰状态;当按钮可操作时,设置按钮为使能状态。
实现也比较简单:

// 设置不可操作
ui->btn->setEnable(false);
// 设置使能
ui->btn->setEnable(true);

当点击‘置灰’按钮后,应该显示为以下效果:

QPushButton设置setEnable(false)后,按钮未置灰,而是显示非置灰样式解决方案_windows


但实际显示是:

QPushButton设置setEnable(false)后,按钮未置灰,而是显示非置灰样式解决方案_windows_02


虽说不影响功能,但感观上确实不好。

‘伪’解决方案

这种情况应该是页面未及时刷新导致的。以下是一些可能的解决方案。

一、手动触发重绘

在设置 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;}");

以上颜色,边框,宽,高等属性都是根据按钮的系统样式进行调试的。

经过以上设置,发现,问题完美解决。

QPushButton设置setEnable(false)后,按钮未置灰,而是显示非置灰样式解决方案_windows_03