如何使 QSlider 只读?
How to make a QSlider read-only?
使用 Qt 5.2.1
是否可以将 QSlider(不管它是水平的还是垂直的)设置为只读,即用户不能更改滑块的值而只能将其用作某种指示器?我无法在 Qt 文档或 Qt Designer 中找到任何内容。
应用示例:在 GUI 中显示某种二进制状态(在我的例子中是紧急停止打开或关闭)。
据我所知,此功能在 QSlider
实现中不可用。
但是,您可以从 QSlider
创建自己的 class 并通过覆盖 mousePressEvent
、mouseReleaseEvent
、mouseMoveEvent
、keyPressEvent
和 keyReleaseEvent
并且仅在 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 的第二种方法 -
假设您的滑块的对象名称是 horizontalSlider。那么代码应该是
// 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);
使用 Qt 5.2.1
是否可以将 QSlider(不管它是水平的还是垂直的)设置为只读,即用户不能更改滑块的值而只能将其用作某种指示器?我无法在 Qt 文档或 Qt Designer 中找到任何内容。
应用示例:在 GUI 中显示某种二进制状态(在我的例子中是紧急停止打开或关闭)。
据我所知,此功能在 QSlider
实现中不可用。
但是,您可以从 QSlider
创建自己的 class 并通过覆盖 mousePressEvent
、mouseReleaseEvent
、mouseMoveEvent
、keyPressEvent
和 keyReleaseEvent
并且仅在 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 的第二种方法 -
假设您的滑块的对象名称是 horizontalSlider。那么代码应该是
// 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);