1、QAbstractSpinBox只读设置,原来的文本编辑器的只读指无法应用鼠标键盘等操作,改变文本框中的内容。
此处指:只允许用户通过步长调节器调节,不能使用键盘输入。
asb.setReadOnly(True)
2、设置获取内容:创建提示符,单行文本编辑器的所有功能,获取单行文本编辑器之后都可以使用。
from PyQt5.Qt import *
# 子类化控件类别
class MyASB(QAbstractSpinBox):
# 定义值,不传值的情况下就指默认值
def __init__(self, parent=None, num=0, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.lineEdit().setText(num)
def stepEnabled(self):
return QAbstractSpinBox.StepDownEnabled | QAbstractSpinBox.StepUpEnabled
def stepBy(self, p_int):
#print(p_int)
current_num = int(self.text()) + p_int
# 步长调节器包含几个子控件,其中一个就是单行文本调节器
self.lineEdit().setText(str(current_num))
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QAbstractSpinButton的学习")
self.resize(500, 500)
self.setup_ui()
def setup_ui(self):
asb = MyASB(self, "6")
self.asb = asb
asb.resize(100, 30)
asb.move(100, 100)
# 设置加速
# asb.setAccelerated(True)
# asb.setReadOnly(True)
test_btn = QPushButton(self)
test_btn.move(200, 200)
test_btn.setText("测试按钮")
test_btn.clicked.connect(self.btn_test)
def btn_test(self):
print(self.asb.text())
self.asb.lineEdit().setText("88")
# 获取单行文本编辑器
# 创建提示框
cl = QCompleter(["sz", "123", "18"], self.asb)
# 单行文本编辑器的很多操作都可以使用
self.asb.lineEdit().setCompleter(cl)
self.asb.lineEdit().setAlignment(Qt.AlignRight)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.resize(500, 500)
window.show()
sys.exit(app.exec_())
3、对齐框架清空标识:
# 对齐
self.asb.setAlignment(Qt.AlignCenter)
清空文本框内容:self.asb.clear()
QAbstractSpinBox类中的buttonSymbols可以设置button的样式:
# 设置右侧按钮格式,可以通过键盘上的上下键改变文本
self.asb.setButtonSymbols(QAbstractSpinBox.NoButtons)
4、内容验证:直接在文本框内部编辑内容,是不会调用stepEnable和stepBy方法的。
方案一可以直接将文本呢框设为只读。
方案二保证用户输入的同时又可以验证文本。
输入内容之后会自动调用验证方法(QLineEdit中的案例),有效果就接收输入进来,没有结果就拒绝,还有一个修复方法可以修复。与之前的验证器大致相同。
# 输入为内容与当前光标所在位置。
未做容错处理,可以通过try except进行处理。
from PyQt5.Qt import *
# 子类化控件类别
class MyASB(QAbstractSpinBox):
# 定义值,不传值的情况下就指默认值
def __init__(self, parent=None, num=0, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.lineEdit().setText(num)
def stepEnabled(self):
return QAbstractSpinBox.StepDownEnabled | QAbstractSpinBox.StepUpEnabled
def stepBy(self, p_int):
#print(p_int)
current_num = int(self.text()) + p_int
# 步长调节器包含几个子控件,其中一个就是单行文本调节器
self.lineEdit().setText(str(current_num))
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QAbstractSpinButton的学习")
self.resize(500, 500)
self.setup_ui()
def setup_ui(self):
asb = MyASB(self, "6")
self.asb = asb
asb.resize(100, 30)
asb.move(100, 100)
# 设置加速
# asb.setAccelerated(True)
# asb.setReadOnly(True)
test_btn = QPushButton(self)
test_btn.move(200, 200)
test_btn.setText("测试按钮")
test_btn.clicked.connect(self.btn_test)
def btn_test(self):
# 设置右侧按钮格式,可以通过键盘上的上下键改变文本
self.asb.setButtonSymbols(QAbstractSpinBox.NoButtons)
# 验证器
def validate(self, p_str, p_int):
# 18-180
num = int(p_str)
if num < 18:
return (QValidator.Intermediate, p_str,p_int)
elif num < 180:
return (QValidator.Acceptable, p_str,p_int)
else:
return (QValidator.Invalid, p_str,p_int)
# 修复功能
def fixup(self, p_str):
print(p_str)
return "18"
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.resize(500, 500)
window.show()
sys.exit(app.exec_())
5、信号:
self.asb.editingFinished.connect(lambda: print("结束编辑"))