如何使 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 的类,并通过覆盖 mousePressEventmouseReleaseEventmouseMoveEventkeyPressEventkeyReleaseEvent 来实现所需的行为,并且仅在以下情况下调用相应的父实现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 的第二种方法 -

假设您的滑块的对象名称是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);

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何使 QSlider 只读?的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5如何使复选框将两个Qslider锁定在一起[关闭]

如何使用样式表更改 QSlider 句柄宽度

如何正确更改 QSlider 的元素

如何在 Qslider 上的自定义位置放置刻度?

如何获得 QSlider-handle 的大小?

如何获取QSlider控件滑块的宽度和位置