PyQt5 QSpinBox – 当鼠标悬停在它上面时添加边框

  • Post category:Python

下面是关于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()))

在上述例子中我们新建了一个继承自QSpinBoxHoverSpinBox类,将它的初始化方法设置成和父类初始化一样的,紧接着我们用setStyleSheet方法为class设置了一段CSS样式,表示当鼠标悬停在HoverSpinBox上时边框为2个像素宽度的solid蓝色。最后在initUI方法中我们调用的不是QSpinBox而是HoverSpinBox,这样当鼠标悬停在这个HoverSpinBox对象上时候就会自动添加边框。在实际开发中,我们可以对多个QSpinBox对象进行类似操作,同时也可以将CSS样式进行自定义。