下面是关于PyQt5 QSpinBox的使用攻略以及添加鼠标悬停时边框的实现方法。
PyQ5 QSpinBox之基本使用
1. 新建一个Qt应用程序
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QSpinBox, QVBoxLayout
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'PyQt5 QSpinBox Example'
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(100, 100, 300, 200)
self.spinBox = QSpinBox()
self.spinBox.setMinimum(1)
self.spinBox.setMaximum(10)
self.spinBox.setValue(5)
vbox = QVBoxLayout()
vbox.addWidget(self.spinBox)
self.setLayout(vbox)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
在这个例子中我们通过新建一个App
类继承QWidget
类,重写该类的initUI
方法,之后我们设置窗口标题,窗口长宽、位置等相关属性,创建一个QSpinBox
对象并设置其数值范围、初始值等属性,接着通过QVBoxLayout
类创建一个垂直布局对象vbox
,并将spinBox
放进该布局中。最后将该布局应用到窗口中,利用show()
方法显示该窗口。
2. 添加信号与槽
...
from PyQt5.QtCore import Qt
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'PyQt5 QSpinBox Example'
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(100, 100, 300, 200)
self.spinBox = QSpinBox()
self.spinBox.setMinimum(1)
self.spinBox.setMaximum(10)
self.spinBox.setValue(5)
self.spinBox.setSingleStep(1)
self.spinBox.setWrapping(True)
self.spinBox.valueChanged.connect(self.printValue)
self.spinBox.setPrefix('Value: ')
vbox = QVBoxLayout()
vbox.addWidget(self.spinBox)
self.setLayout(vbox)
self.show()
def printValue(self):
print('Current value: ' + str(self.spinBox.value()))
在原来我们已经新增了几个特性,例如设置步长(setSingleStep
)、当溢出时候选择是否换行(setWrapping
)、设置前缀(setPrefix
)等等。更重要的是我们在spinBox
对象的valueChanged
信号上连接一个槽函数printValue
来打印当前spinBox
的数值。
添加鼠标悬停时添加边框
...
class HoverSpinBox(QSpinBox):
def __init__(self, parent=None):
super().__init__(parent)
self.setStyleSheet('''
QSpinBox:hover{
border: 2px solid blue;
}
''')
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'PyQt5 QSpinBox Example'
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(100, 100, 300, 200)
self.spinBox = HoverSpinBox()
self.spinBox.setMinimum(1)
self.spinBox.setMaximum(10)
self.spinBox.setValue(5)
self.spinBox.setSingleStep(1)
self.spinBox.setWrapping(True)
self.spinBox.valueChanged.connect(self.printValue)
self.spinBox.setPrefix('Value: ')
vbox = QVBoxLayout()
vbox.addWidget(self.spinBox)
self.setLayout(vbox)
self.show()
def printValue(self):
print('Current value: ' + str(self.spinBox.value()))
在上述例子中我们新建了一个继承自QSpinBox
的HoverSpinBox
类,将它的初始化方法设置成和父类初始化一样的,紧接着我们用setStyleSheet
方法为class设置了一段CSS样式,表示当鼠标悬停在HoverSpinBox
上时边框为2个像素宽度的solid蓝色。最后在initUI
方法中我们调用的不是QSpinBox
而是HoverSpinBox
,这样当鼠标悬停在这个HoverSpinBox
对象上时候就会自动添加边框。在实际开发中,我们可以对多个QSpinBox
对象进行类似操作,同时也可以将CSS样式进行自定义。