如何使 QSlider 只读?

How to make a QSlider read-only?

使用 Qt 5.2.1

是否可以将 QSlider(不管它是水平的还是垂直的)设置为只读,即用户不能更改滑块的值而只能将其用作某种指示器?我无法在 Qt 文档或 Qt Designer 中找到任何内容。

应用示例:在 GUI 中显示某种二进制状态(在我的例子中是紧急停止打开或关闭)。

据我所知,此功能在 QSlider 实现中不可用。

但是,您可以从 QSlider 创建自己的 class 并通过覆盖 mousePressEventmouseReleaseEventmouseMoveEventkeyPressEventkeyReleaseEvent 并且仅在 readOnly 属性 设置为 false.

时才调用相应的父实现

幸运的是,这样的实现在 kalarm 中已经可用,所以看看它:http://api.kde.org/4.6-api/kdepim-apidocs/kalarm/lib/html/slider_8cpp_source.html

也许 QProgressBar 更合适,因为用户知道它是 "read only" 和 "shows how much has been done"。

一个简单的解决方案是在消耗所有鼠标、焦点和键盘事件的滑块上安装事件过滤器。您还需要使滑块具有 Qt::NoFocus 策略。这样的事件过滤器将是通用的,可以与任何控件小部件一起使用。

另一种方法是禁用该小部件,并对其设置样式,使禁用和启用的调色板相同。不过,这可能不适用于某些平台样式,并且在您提交之前需要进行实验验证。

遵循 kuba ubar 的第二种方法 -

假设您的滑块的对象名称是 horizo​​ntalSlider。那么代码应该是

// getting the palette of the slider
QPalette _sliderPalette = ui->horizontalSlider->palette();

// changing the colorGroup of that palette
_sliderPalette.setCurrentColorGroup(QPalette::Active);

// setting the changed palette to the slider 
ui->horizontalSlider->setPalette(_sliderPalette);