QDoubleSpinBox:停止发射中间值
Posted
技术标签:
【中文标题】QDoubleSpinBox:停止发射中间值【英文标题】:QDoubleSpinBox: Stop emitting intermediate values 【发布时间】:2013-10-04 19:54:19 【问题描述】:我将 QDoubleSpinBox 子类化以添加一些功能(例如根据 lineedit 中光标的位置递增值)并更改一些我觉得烦人的功能。后者之一是发出中间值:例如如果您想输入值 323,它将发出 3,然后是 32,最后是 323。我想将其设置为仅在输入时发出(即仅在输入时实际更改值)。
无论如何,我不知道如何捕捉这些中间编辑。我覆盖了 setValue 以查看是否可以以某种方式将其停止,但显然没有调用它(或者至少没有调用我的覆盖)。我不确定在行编辑中如何实际设置该值。
更一般地说,这个盒子的逻辑让我无法理解。是否有一些文档可以解释,例如“如果你在lineedit中输入一个数字,那么这一系列的例程就会被调用……而如果你点击向上箭头,这一系列的例程就会被调用?”
如果重要的话,我使用的是 PyQt5
编辑:这是另一个重要的情况。假设我想为盒子实现一个撤消/重做结构。我能想到的访问更改值的唯一方法是连接到 valueChanged 信号。但是,如果我对盒子进行子类化,那么收听信号而不是仅仅观察“内部”的值变化似乎有点令人费解,或者我在这里遗漏了什么?
【问题讨论】:
setValue()
不是虚函数,所以在你覆盖它的时候它没有被调用也就不足为奇了
我不确定它有什么“错误”,这不是我想要的盒子的工作方式。假设我正在控制一个仪器,如果发送给它的值小于 10,它将出现严重问题。所以我输入“20”,它在发送 20 之前发送 2。是的,在这种特定情况下,我应该在仪器方面做一些检查等,但这只是一种不太方便发出中间值的情况。
不要使用valueChanged
信号,使用editingFinished
。仅当值发生更改并且组件失去焦点或按下返回时才会发出该信号。
"是否有一些文档可以解释例如"如果你在 lineedit 中输入一个数字,那么这一系列的例程被调用......而如果你点击向上箭头,这一系列的例程被调用? "" 恐怕这个文档叫做源代码。
【参考方案1】:
您可以使用以下信号:
void QAbstractSpinBox::editingFinished() [signal]
此信号已发出,编辑已完成。当旋转框失去焦点并按下回车键时会发生这种情况。
基于QAbstractSpinBox
的文档:
http://qt-project.org/doc/qt-5.1/qtwidgets/qabstractspinbox.html#editingFinished
没有什么可以结合基于箭头的更改和editingFinished更改。
【讨论】:
【参考方案2】:我的用例是让用户输入值而不在每个新数字上获取信号,同时仍然使 ↑、↓、Page Up、Page Down 键和箭头按钮照常工作,在每次激活时发出信号。
QAbstractSpinBox::editingFinished
信号不提供此功能:仅当焦点丢失或按下 Return/Enter 时才会发出。
完全符合我需要的是QAbstractSpinBox
的keyboardTracking
属性。如果是true
(默认值),则旋转框会在每个键入的数字上发出valueChanged
。如果您将其设置为false
,它的行为与我在此答案开头所描述的完全一样。
【讨论】:
以上是关于QDoubleSpinBox:停止发射中间值的主要内容,如果未能解决你的问题,请参考以下文章
QListWidget 中的 setSelectionModel 停止发射 itemSelectionChanged 信号