如何使 QSlider 只读?
Posted
技术标签:
【中文标题】如何使 QSlider 只读?【英文标题】:How to make a QSlider read-only? 【发布时间】:2015-05-27 15:33:20 【问题描述】:使用 Qt 5.2.1
是否可以将 QSlider(无论是水平还是垂直)设置为只读,即用户无法更改滑块的值,而只能将其用作某种指示器?我在 Qt 文档或 Qt Designer 中找不到任何内容。
应用示例:在 GUI 中显示某种二进制状态(在我的例子中是紧急停止打开或关闭)。
【问题讨论】:
禁用它。slider->setEnable(false);
查看@m.s 下方的评论。的答案。
【参考方案1】:
AFAIK 此类功能在 QSlider
实现中不可用。
但是,您可以创建自己的派生自 QSlider
的类,并通过覆盖 mousePressEvent
、mouseReleaseEvent
、mouseMoveEvent
、keyPressEvent
和 keyReleaseEvent
来实现所需的行为,并且仅在以下情况下调用相应的父实现readOnly
属性设置为 false
。
幸运的是,kalarm
中已经提供了这样的实现,所以请看一下:http://api.kde.org/4.6-api/kdepim-apidocs/kalarm/lib/html/slider_8cpp_source.html
【讨论】:
这是正确的答案,但在我的情况下,我(遗憾地)仅限于使用 UI 文件,我只能使用 Qt 通常提供的内容,因此这是不可能的。禁用 QSlider(如 @t3ft3l--i 所建议的那样)起到了作用,尽管我确实认为禁用不是“正确”的解决方案,因为这里我们确实在谈论向组件添加新功能,因此创建一个新类是做正确的事。 通过阅读 Qt 文档, disable 基本上所做的就是停用该组件的所有信号......至少在用户交互方面。在内部,状态仍然可以更改。 @rbaleksandar 您仍然可以使用带有自定义小部件实现的 UI 文件,请查看 doc.qt.io/qt-4.8/designer-using-custom-widgets.html 链接如果不再有效。【参考方案2】:也许QProgressBar
会更合适,因为用户知道它是“只读的”并且“显示已完成的工作量”。
【讨论】:
【参考方案3】:遵循 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);
【讨论】:
【参考方案4】:一个简单的解决方案是在滑块上安装一个事件过滤器,以消耗所有鼠标、焦点和键盘事件。您还需要使滑块具有Qt::NoFocus
策略。这样的事件过滤器将是通用的,并且可以与任何控件小部件一起使用。
另一种方法是禁用小部件,并设置样式以使禁用和启用的调色板相同。不过,这可能不适用于某些平台样式,并且在您提交之前需要进行实验验证。
【讨论】:
以上是关于如何使 QSlider 只读?的主要内容,如果未能解决你的问题,请参考以下文章