PyQt5 – 当鼠标悬停在未选中的单选按钮上时的皮肤

  • Post category:Python

首先,需要在Python中安装PyQt5库。

使用鼠标悬停在未选中的单选按钮上时的皮肤,可以通过使用QGroupBox来实现。QGroupBox是用于组合不同控件的容器,可以划分不同的区域。可以将QGroupBox作为单选按钮的容器,在鼠标悬停在未选中的单选按钮上时,改变QGroupBox的背景色来达到改变皮肤的效果。

下面是Python使用PyQt5实现当鼠标悬停在未选中单选按钮上时的皮肤的示例代码:

import sys
from PyQt5.QtWidgets import QApplication, QGroupBox, QRadioButton, QVBoxLayout, QWidget

class Window(QWidget):

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

        self.initUI()

    def initUI(self):

        vbox = QVBoxLayout()

        # 创建QGroupBox
        groupbox = QGroupBox('选择语言', self)

        btn1 = QRadioButton('Python', self)
        btn1.toggled.connect(self.onClicked)
        vbox.addWidget(btn1)

        btn2 = QRadioButton('JavaScript', self)
        btn2.toggled.connect(self.onClicked)
        vbox.addWidget(btn2)

        btn3 = QRadioButton('Java', self)
        btn3.toggled.connect(self.onClicked)
        vbox.addWidget(btn3)

        # 添加单选按钮到QGroupBox
        groupbox.setLayout(vbox)

        # 添加QGroupBox到窗口
        vbox.addWidget(groupbox)
        self.setLayout(vbox)

        self.setGeometry(300, 300, 350, 200)
        self.setWindowTitle('当鼠标悬停在未选中的单选按钮上时的皮肤')
        self.show()

    def onClicked(self):
        # 循环遍历所有单选按钮,如果未选中且鼠标在上面,则改变背景色
        for btn in self.findChildren(QRadioButton):
            if not btn.isChecked() and btn.underMouse():
                btn.setStyleSheet('background-color: #BEBEBE')

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())

在上面的示例代码中,我们创建了一个QGroupBox来容纳三个单选按钮,然后通过调用setLayout()方法将QGroupBox添加到QWidget上,这样我们就可以让单选按钮在QGroupBox里面进行布局。

接下来,我们通过绑定toggled信号到同一个槽上来检测单选按钮的状态,并将它们添加到竖直的布局内,并将QGroupBox添加到QWidget中。在onClicked方法中,我们循环遍历所有的单选按钮,检查它们的isChecked()和underMouse()方法来检查它们的状态和鼠标是否在上面。如果条件成立,我们会通过setStyleSheet方法改变单选按钮的背景色。

下面是另外一种实现方式的示例代码:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QApplication, QHBoxLayout, QRadioButton, QVBoxLayout, QWidget

class HoverButton(QRadioButton):

    def __init__(self, text, parent=None):
        super().__init__(text, parent)
        self.setStyleSheet('QRadioButton {background-color: #F0F0F0; padding: 10px; margin-top: 5px; margin-bottom: 5px}')

    def enterEvent(self, event):
        super().enterEvent(event)
        if not self.isChecked():
            self.setStyleSheet('QRadioButton {background-color: #BEBEBE; padding: 10px; margin-top: 5px; margin-bottom: 5px}')

    def leaveEvent(self, event):
        super().leaveEvent(event)
        if not self.isChecked():
            self.setStyleSheet('QRadioButton {background-color: #F0F0F0; padding: 10px; margin-top: 5px; margin-bottom: 5px}')

    def mousePressEvent(self, event):
        super().mousePressEvent(event)
        self.setCursor(QCursor(Qt.PointingHandCursor))

class Window(QWidget):

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

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        # 添加单选按钮到横行布局中
        btn1 = HoverButton('Python', self)
        btn1.toggled.connect(self.onClicked)
        hbox.addWidget(btn1)

        btn2 = HoverButton('JavaScript', self)
        btn2.toggled.connect(self.onClicked)
        hbox.addWidget(btn2)

        btn3 = HoverButton('Java', self)
        btn3.toggled.connect(self.onClicked)
        hbox.addWidget(btn3)

        vbox = QVBoxLayout()
        vbox.addLayout(hbox)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 350, 200)
        self.setWindowTitle('当鼠标悬停在未选中的单选按钮上时的皮肤')
        self.show()

    def onClicked(self):
        pass

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())

在上面的示例代码中,我们创建了一个HoverButton类,该类继承自QRadioButton。在HoverButton类中,我们重写了enterEvent()、leaveEvent()和mousePressEvent()方法,以响应鼠标进入单选按钮、离开单选按钮和单击单选按钮的事件。我们还设置了选中和未选中状态下的背景颜色和光标样式。

最后,我们创建三个HoverButton实例并将它们添加到一个水平布局中,在onClicked()空方法中不做任何操作,但可以用于实现一些其他功能。