PyQt5是Python下的GUI编程工具箱,其中的QDoubleSpinBox控件是用于输入浮点数的小部件。获得QDoubleSpinBox控件完成编辑的信号,其实就是获取用户输入的完成信号,可以通过信号与槽机制来实现。下面是完整的使用攻略,包含实现原理和示例说明。
QDoubleSpinBox的简介
QDoubleSpinBox控件是PyQt5中的一个小部件,用户可以通过QDoubleSpinBox输入一个浮点数。常常用于需要精确输入刻度值的应用程序和需要通过表单填写数据的应用程序。例如在3D建模软件中,需要对三维模型的长、宽、高等参数进行精确输入,此时可以用QDoubleSpinBox来实现。
QDoubleSpinBox编辑完成信号的使用
通过PyQt5可以实现QDoubleSpinBox编辑完成信号的监听,可以实现输入框的实时监听,获取用户输入的完成信号。QDoubleSpinBox编辑完成信号的实现过程如下:
from PyQt5.QtWidgets import QDoubleSpinBox
from PyQt5.QtCore import pyqtSignal
class MyDoubleSpinBox(QDoubleSpinBox):
editingFinishedSignal = pyqtSignal()
def __init__(self):
super(MyDoubleSpinBox, self).__init__()
self.valueChanged.connect(self.emitEditing)
def emitEditing(self):
self.editingFinishedSignal.emit()
widget = MyDoubleSpinBox()
widget.editingFinishedSignal.connect(lambda: print(f"value:{widget.text()}"))
QDoubleSpinBox继承自QAbstractSpinBox,对于QAbstractSpinBox控件而言,它会在软键盘确认、按下Enter键、离开输入框等情况触发editingFinished信号,而QDoubleSpinBox则额外支持了失去焦点、改变值上下限等多种触发情况。因此,我们需要自定义一个子类MyDoubleSpinBox,来监听并发出editingFinished信号。
在自定义的MyDoubleSpinBox控件中,首先定义了一个editingFinishedSignal信号,用来在值发生变化的时候触发。在初始化的时候,将valueChanged信号连接到emitEditing函数。emitEditing函数在接到valueChanged信号后,就会发出editingFinishedSignal信号,表示正在编辑的完成。最后,在界面中创建一个MyDoubleSpinBox对象,并将该对象的编辑完成信号与回调函数进行连接,当用户输入完成时,即可触发editingFinishedSignal信号,从而回调函数就可以获取用户输入完成的值了。
示例1:实现控件自动计算
下面通过一个简单的示例来了解QDoubleSpinBox编辑完成信号的用法。在这个实例中,我们通过自定义QDoubleSpinBox子类,实现两个QDoubleSpinBox控件的数值相加,并将结果显示在一个QLineEdit中。
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QDoubleSpinBox
class MyDoubleSpinBox(QDoubleSpinBox):
editingFinished = pyqtSignal()
def __init__(self):
super(MyDoubleSpinBox, self).__init__()
self.setObjectName("MyDoubleSpinBox")
self.setMaximum(100)
self.setMinimum(-100)
self.editingFinished.connect(self.slotEditingFinished)
def slotEditingFinished(self):
self.editingFinished.emit()
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.sb1 = MyDoubleSpinBox()
self.sb2 = MyDoubleSpinBox()
self.leResult = QLineEdit()
vbox = QVBoxLayout()
vbox.addWidget(self.sb1)
vbox.addWidget(self.sb2)
vbox.addWidget(self.leResult)
self.setLayout(vbox)
self.show()
self.sb1.editingFinished.connect(self.calculatorResult)
self.sb2.editingFinished.connect(self.calculatorResult)
def calculatorResult(self):
result = self.sb1.value() + self.sb2.value()
self.leResult.setText(str(result))
if __name__ == '__main__':
app = QApplication([])
win = MainWindow()
win.show()
app.exec_()
这个示例中,我们通过自定义QDoubleSpinBox子类MyDoubleSpinBox,来监听编辑完成的信号。在MyDoubleSpinBox控件初始化结束后,将编辑完成的信号连接到slotEditingFinished函数中。在MainWindow窗口中,将两个MyDoubleSpinBox控件的编辑完成信号分别连接到calculatorResult函数中。
当用户编辑完成MyDoubleSpinBox中的任意一个值之后,就会触发对应的editingFinished信号。由于我们已经通过信号与槽机制将这个信号转发到了MainWindow的calculatorResult函数中,因此每当一个值被编辑完成后,就会调用calculatorResult函数,计算两个MyDoubleSpinBox控件的值的和,并将其显示在leResult控件中。
示例2:实现输入阈值检测
下面通过第二个示例,来介绍如何使用QDoubleSpinBox的编辑完成信号来实现输入阈值检测的功能。在这个示例中,我们定义了一个自定义的SpinBox,当用户输入的值小于10时,自动将其限制为10。
from PyQt5.QtGui import QDoubleValidator
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtWidgets import QDoubleSpinBox
class LowerSpinBox(QDoubleSpinBox):
def __init__(self):
super(LowerSpinBox, self).__init__()
self.setMaximum(100)
self.setMinimum(0)
self.valueChanged.connect(self.checkThreshold)
self.setButtonSymbols(QDoubleSpinBox.NoButtons)
self.setKeyboardTracking(False)
def checkThreshold(self):
if self.value() < 10:
self.setValue(10)
在这个示例中,我们自定义了一个LowerSpinBox控件,其继承自QDoubleSpinBox。当用户编辑完成当前的内容时,会触发checkThreshold函数,这个函数会检查当前的Value是否小于阈值10。若小于阈值,则通过setValue函数将其强制设置为10。从而实现了阈值检测功能。
需要注意的是,由于QDoubleSpinBox的编辑信号有很多种触发方式,若需要仅在编辑完成的时候才进行阈值检测,需要关闭自定义SpinBox的按钮显示,即setButtonSymbols(QDoubleSpinBox.NoButtons),并且设置键盘跟踪为False,即setKeyboardTracking(False),这样只有当用户完成输入并确认后,才会触发编辑完成信号。
总之,QDoubleSpinBox控件提供了编辑完成信号,可以通过PyQt5自定义子类来监听和发射这个信号,从而完成更多的自定义功能。在实际开发中,我们可以通过这个信号实现输入的检测、限制、计算等功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 QDoubleSpinBox – 获得编辑完成的信号 - Python技术站