PyQt5 – 当鼠标悬停在单选按钮上时,选中的指示灯的背景颜色

  • Post category:Python

在PyQt5中,可以使用QButtonGroup与QToolTip来实现当鼠标悬停在单选按钮上时,选中的指示灯的背景颜色。

首先,在PyQt5中,可以使用以下代码创建单选按钮:

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

app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()

bg = QButtonGroup()

radioButton1 = QRadioButton("RadioButton 1")
bg.addButton(radioButton1)
layout.addWidget(radioButton1)

radioButton2 = QRadioButton("RadioButton 2")
bg.addButton(radioButton2)
layout.addWidget(radioButton2)

window.setLayout(layout)
window.show()
sys.exit(app.exec_())

以上代码创建了两个单选按钮,并将它们添加到布局中,并通过QButtonGroup类来管理他们。

然后,我们可以创建一个自定义的QWidget类,重绘选中的指示灯的背景颜色。代码如下:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette, QColor
from PyQt5.QtWidgets import QWidget, QToolTip

class RadioButton(QWidget):
    def __init__(self, button, parent=None):
        super().__init__(parent)

        self.button = button
        self.button.clicked.connect(self.on_button_clicked)

        self.setAutoFillBackground(True)
        self.palette = self.palette()
        self.normal_bg = self.palette.color(QPalette.Background)

    def on_button_clicked(self, checked):
        if checked:
            self.palette.setColor(QPalette.Background, QColor(0, 255, 0))
        else:
            self.palette.setColor(QPalette.Background, self.normal_bg)
        self.setPalette(self.palette)

    def enterEvent(self, event):
        QToolTip.showText(self.mapToGlobal(event.pos()), self.button.text(), self)

以上代码创建了一个自定义的RadioButton类,并在其中重写了on_button_clicked方法和enterEvent方法,以实现选中的指示灯的背景颜色重绘和鼠标悬停时弹出提示框的功能。

最后,在主程序中,将自定义的RadioButton类应用到两个单选按钮上。代码如下:

from PyQt5.QtWidgets import QApplication, QButtonGroup, QVBoxLayout, QWidget
import sys

from RadioButton import RadioButton

app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()

bg = QButtonGroup()

radioButton1 = RadioButton(QRadioButton("RadioButton 1"))
bg.addButton(radioButton1.button)
layout.addWidget(radioButton1)

radioButton2 = RadioButton(QRadioButton("RadioButton 2"))
bg.addButton(radioButton2.button)
layout.addWidget(radioButton2)

window.setLayout(layout)
window.show()
sys.exit(app.exec_())

在运行程序后,当选中单选按钮时,选中的指示灯的背景颜色会变为绿色;当鼠标悬停在单选按钮上时,弹出提示框显示按钮的文本。

示例1:在单选按钮中添加图标

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QButtonGroup, QRadioButton, QVBoxLayout, QWidget
import sys

from RadioButton import RadioButton

app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()

bg = QButtonGroup()

radioButton1 = RadioButton(QRadioButton(QIcon("icon1.png"), "RadioButton 1"))
bg.addButton(radioButton1.button)
layout.addWidget(radioButton1)

radioButton2 = RadioButton(QRadioButton(QIcon("icon2.png"), "RadioButton 2"))
bg.addButton(radioButton2.button)
layout.addWidget(radioButton2)

window.setLayout(layout)
window.show()
sys.exit(app.exec_())

以上代码在第一个单选按钮中添加了一个名为icon1.png的图标,并在第二个单选按钮中添加了一个名为icon2.png的图标。

示例2:使用滑动条改变指示灯颜色

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette, QColor
from PyQt5.QtWidgets import QApplication, QButtonGroup, QLabel, QRadioButton, QSlider, QVBoxLayout, QWidget
import sys

from RadioButton import RadioButton

app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()

bg = QButtonGroup()

radioButton1 = RadioButton(QRadioButton("RadioButton 1"))
bg.addButton(radioButton1.button)
layout.addWidget(radioButton1)

radioButton2 = RadioButton(QRadioButton("RadioButton 2"))
bg.addButton(radioButton2.button)
layout.addWidget(radioButton2)

slider = QSlider(Qt.Horizontal)
layout.addWidget(slider)

label = QLabel("Adjust color")
layout.addWidget(label)

def on_slider_value_changed(value):
    color_value = int(value / 100 * 255)
    color = QColor(color_value, 255 - color_value, 0)
    radioButton1.set_checked_color(color)
    radioButton2.set_checked_color(color)

slider.valueChanged.connect(on_slider_value_changed)

window.setLayout(layout)
window.show()
sys.exit(app.exec_())

以上代码创建了一个滑动条,通过滑动条调整指示灯的颜色。在滑动条数值变化时,调用set_checked_color方法设置选中指示灯的颜色。

在这两个示例中,我们依然使用了第一个示例中的RadioButton类来实现选中指示灯的背景颜色改变。