PyQt5 QSpinBox – 如何设置遮罩

  • Post category:Python

PyQt5是一个非常流行的Python GUI框架,包含了许多不同的部件,能够协助我们快速构建出美观而高效的用户界面。其中QSpinBox是一种常用的数字选择框件,它允许用户通过鼠标或键盘输入来选择固定范围内的数字值。而在实际开发中,我们可能需要对QSpinBox的输入格式进行限制或遮罩,以保证用户的输入符合特定的要求。下面我们将详细讲解PyQt5中如何设置QSpinBox的遮罩,帮助你更好地掌握这项技术。

1. 什么是QSpinBox的遮罩?

QSpinBox的遮罩是指对用户输入进行掩码限制的功能。例如,我们可以针对数字输入框件,对其只允许输入整数或小数等特定的格式,从而保证用户输入的内容符合预期。

因此,QSpinBox的遮罩对于我们进行数据输入和校验时非常有用。它可以让我们在用户输入时自动进行格式判断和限制处理,从而简化我们的输入检测逻辑和代码量。

2. 如何在PyQt5中设置QSpinBox的遮罩?

设置QSpinBox的遮罩需要使用Qt框架中的QRegExp类和QValidator类。QRegExp表示正则表达式,它用于匹配用户输入的内容;而QValidator则是对用户输入的内容进行验证和校验的工具类。下面我们来看一下如何在PyQt5中使用这两个类来设置QSpinBox的遮罩。

2.1 整数输入框件的遮罩

我们先来看一下如何设置一个只允许输入整数的QSpinBox。以下是代码示例:

from PyQt5.QtGui import QRegExpValidator, QRegExp
from PyQt5.QtWidgets import QApplication, QMainWindow, QSpinBox

class MySpinBox(QSpinBox):
    def __init__(self):
        super().__init__()

        reg = QRegExp('^\\d+$') # 匹配正整数
        validator = QRegExpValidator(self)
        validator.setRegExp(reg)
        self.setValidator(validator)

以上代码中,我们继承了QSpinBox类,并在其__init__方法中调用了父类方法,并进行以下几个操作:

  1. 声明一个QRegExp类型实例,用于匹配输入的正整数数值;
  2. 声明一个QRegExpValidator实例,用于将QRegExp的正则表达式与QSpinBox进行绑定,从而对用户输入进行校验;
  3. 调用self.setValidator方法将QRegExpValidator与当前的QSpinBox关联起来,从而达到遮罩的效果。

2.2 小数输入框件的遮罩

在实际开发中,我们有时需要对QSpinBox进行小数输入的校验。对于这种情况,我们可以采用类似的方法来对QSpinBox进行遮罩。以下是代码示例:

from PyQt5.QtGui import QRegExpValidator, QRegExp
from PyQt5.QtWidgets import QApplication, QMainWindow, QDoubleSpinBox

class MyDoubleSpinBox(QDoubleSpinBox):
    def __init__(self):
        super().__init__()

        reg = QRegExp('^\\d+(\\.\\d+)?$') # 匹配小数
        validator = QRegExpValidator(self)
        validator.setRegExp(reg)
        self.setValidator(validator)

以上代码中,我们继承了QDoubleSpinBox类,并在其__init__方法中调用了父类方法,并进行以下几个操作:

  1. 声明一个QRegExp类型实例,用于匹配输入的小数数值;
  2. 声明一个QRegExpValidator实例,用于将QRegExp的正则表达式与QSpinBox进行绑定,从而对用户输入进行校验;
  3. 调用self.setValidator方法将QRegExpValidator与当前的QSpinBox关联起来,从而达到遮罩的效果。

2.3 示例说明

接下来,我们将创建两个QSpinBox的子类,分别用于输入整数和小数。我们将在这两个子类中增加一些方法和信号,用于在用户输入发生变化时,输出相关的信息。

代码如下:

from PyQt5.QtGui import QRegExpValidator, QRegExp
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QSpinBox, QDoubleSpinBox

class MySpinBox(QSpinBox):
    valueChangedSignal = pyqtSignal(int)

    def __init__(self):
        super().__init__()

        reg = QRegExp('^\\d+$') # 匹配正整数
        validator = QRegExpValidator(self)
        validator.setRegExp(reg)
        self.setValidator(validator)

    def valueFromText(self, text):
        value = super().valueFromText(text)
        self.valueChangedSignal.emit(value)
        return value

    def textFromValue(self, value):
        text = super().textFromValue(value)
        self.valueChangedSignal.emit(value)
        return text

class MyDoubleSpinBox(QDoubleSpinBox):
    valueChangedSignal = pyqtSignal(float)

    def __init__(self):
        super().__init__()

        reg = QRegExp('^\\d+(\\.\\d+)?$') # 匹配小数
        validator = QRegExpValidator(self)
        validator.setRegExp(reg)
        self.setValidator(validator)

    def valueFromText(self, text):
        value = super().valueFromText(text)
        self.valueChangedSignal.emit(value)
        return value

    def textFromValue(self, value):
        text = super().textFromValue(value)
        self.valueChangedSignal.emit(value)
        return text

以上代码中,我们分别继承了QSpinBox和QDoubleSpinBox,并增加了以下几个方法和信号:

  • valueChangedSignal:自定义的数值变化信号;
  • valueFromText方法:在用户输入数值时触发,将输入的文本转换为数值,并发送valueChangedSignal信号;
  • textFromValue方法:在数值变化时触发,将当前数值转换为文本,并发送valueChangedSignal信号。

我们可以通过连接该信号来获取当前的数值变化信息,例如:

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget
import sys

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QWidget(self)
        self.setCentralWidget(self.centralWidget)
        self.layout = QVBoxLayout(self.centralWidget)
        self.label = QLabel('0')
        self.layout.addWidget(self.label)

        self.spinBox = MySpinBox()
        self.layout.addWidget(self.spinBox)
        self.spinBox.valueChangedSignal.connect(self.on_spinBox_valueChanged)

        self.doubleSpinBox = MyDoubleSpinBox()
        self.layout.addWidget(self.doubleSpinBox)
        self.doubleSpinBox.valueChangedSignal.connect(self.on_doubleSpinBox_valueChanged)

    def on_spinBox_valueChanged(self, value):
        self.label.setText(str(value))

    def on_doubleSpinBox_valueChanged(self, value):
        self.label.setText(str(value))

app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())

以上代码创建了一个带有一个标签、一个整数输入框件和一个小数输入框件的主窗口。当用户输入数值时,会自动触发数值变化信号,并在标签上显示当前的数值。

3. 总结

通过本文的介绍,我们可以了解到QSpinBox的遮罩是一种非常实用的输入格式限制和校验方法。我们可以使用QRegExp和QValidator类来对QSpinBox进行遮罩和正则匹配,从而实现输入格式的约束和保护。希望本文的内容对你在实际开发中的工作和学习有所帮助。