PyQt5 – 如何在鼠标悬停时为未选中的RadioButton指标设置皮肤

  • Post category:Python

首先需要安装PyQt5库,可以通过以下命令在终端中进行安装:

pip install PyQt5

在安装完毕之后,可以通过以下代码实现在鼠标悬停时为未选中的RadioButton指标设置皮肤:

from PyQt5.QtWidgets import QApplication, QDialog, QRadioButton, QVBoxLayout

app = QApplication([])
dialog = QDialog()
layout = QVBoxLayout()

radio = QRadioButton("Test Radio")
layout.addWidget(radio)

def set_hovered_stylesheet():
    if not radio.isChecked():
        radio.setStyleSheet("QRadioButton:hover { background-color: #E0E0E0 }")

radio.enterEvent = set_hovered_stylesheet
radio.leaveEvent = lambda event: radio.setStyleSheet("")

dialog.setLayout(layout)
dialog.show()
app.exec_()

上述代码中,首先导入了必要的模块和类,然后创建了一个QDialog和QVBoxLayout,并创建了一个QRadioButton并添加到布局中。接着通过lambda表达式和匿名函数的方式为QRadioButton添加了两个事件:当鼠标进入时调用set_hovered_stylesheet函数,当鼠标离开时恢复原样式。

在set_hovered_stylesheet函数中,通过判断QRadioButton是否已选中来设置样式表,当未选中时使用自定义的样式表并将其应用于QRadioButton的hover状态,从而实现了在鼠标悬停时为未选中的RadioButton指标设置皮肤的效果。

除此之外,还可以使用CSS样式表来实现类似的效果。以下是另一种实现方法,使用了CSS样式表:

from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
    QApplication, QDialog, QRadioButton, QVBoxLayout
)

app = QApplication([])
dialog = QDialog()
layout = QVBoxLayout()

radio = QRadioButton("Test Radio")
layout.addWidget(radio)

def set_style_sheet():
    radio.style().unpolish(radio)
    radio.style().polish(radio)

radio.toggled.connect(set_style_sheet)

palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.black)
palette.setColor(QPalette.Button, Qt.white)
radio.setPalette(palette)

dialog.setStyleSheet("""
QRadioButton {
    color: black;
    padding-left: 20px;
}
QRadioButton:hover {
    background-color: #E0E0E0;
}
QRadioButton:checked {
    background-color: #C8C8C8;
}
""")

dialog.setLayout(layout)
dialog.show()
app.exec_()

该实现方式使用了QRadioButton的toggled信号来触发set_style_sheet函数,该函数通过Qt的颜色系统来设置QRadioButton的样式表。其余部分使用CSS样式表来设置QRadioButton的样式,从而实现了相应的皮肤设置效果。