Как изменить цвет svg иконки при наведении?
Мой код
import sys
from PyQt5.QtWidgets import (QRadioButton, QHBoxLayout, QButtonGroup,
QApplication, QWidget)
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import QSize, Qt
from PyQt5 import QtCore, QtGui, QtWidgets
class RadioButton(QRadioButton):
def __init__(self, icon, parent=None):
super(RadioButton, self).__init__(parent)
self.pixmap = QPixmap(icon[0])
try:
self.pixmap_pressed = QPixmap(icon[1])
except IndexError:
print('no icon')
self.pixmap_pressed = QPixmap(icon[0])
self.setText('rb0')
def paintEvent(self, event):
if self.isChecked():
pix = self.pixmap_pressed
else:
pix = self.pixmap
painter = QtGui.QPainter(self)
painter.drawPixmap(event.rect(), pix)
def sizeHint(self):
return QtCore.QSize(30, 30)
class Window(QWidget):
def __init__(self):
super().__init__()
self._dictRB = {
'rb0': False,
'rb1': False,
'rb2': False,
'rb3': False,
}
self.main_layout = QHBoxLayout(self)
self.buttonGroup = QButtonGroup()
self.attr_layout = QHBoxLayout()
self.main_layout.addLayout(self.attr_layout)
self.rb0 = RadioButton(["2.svg","3.svg"]) #QRadioButton() # 'rb0'
self.attr_layout.addWidget(self.rb0)
self.buttonGroup.addButton(self.rb0)
self.rb1 = QRadioButton('rb1')
self.attr_layout.addWidget(self.rb1)
self.buttonGroup.addButton(self.rb1)
self.rb2 = QRadioButton('rb2')
self.attr_layout.addWidget(self.rb2)
self.buttonGroup.addButton(self.rb2)
self.rb3 = QRadioButton('rb3')
self.buttonGroup.addButton(self.rb3)
self.buttonGroup.buttonClicked.connect(self.check_button)
def check_button(self, radioButton):
if self._dictRB[radioButton.text()]:
self._dictRB[radioButton.text()] = False
self._dictRB['rb3'] = True
self.rb3.setChecked(True)
else:
for b in self._dictRB:
self._dictRB[b] = False
self._dictRB[radioButton.text()] = True
print("Нажата кнопка -> `{} - {}`".format(radioButton.text(), radioButton.isChecked()))
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
Я хочу при наведении мыши постепенно изменить цвет svg иконки.
Но проблема в том что setStyleSheet() не реагирует на
fill:red;
stroke:red;
color:red;
transition-duration: 0.5s;
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант
import sys
from PyQt5.QtWidgets import (QRadioButton, QHBoxLayout, QButtonGroup,
QApplication, QWidget)
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import QSize, Qt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtSvg import QSvgWidget, QSvgRenderer
from base64 import b64encode
def iconFromBase64(base_64):
pixmap = QtGui.QPixmap()
pixmap.loadFromData(QtCore.QByteArray.fromBase64(base_64), "SVG")
icon = QtGui.QIcon(pixmap)
return icon
class RadioButton(QRadioButton):
def __init__(self, icon, parent=None):
super(RadioButton, self).__init__(parent)
# print(icon)
self._pixmap = QtGui.QPixmap()
self.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
self.setText('rb0')
self.setIcon(icon[1])
self.setIconSize(QSize(50, 50))
@QtCore.pyqtProperty(QtGui.QPixmap)
def pixmap(self):
return self._pixmap
@pixmap.setter
def pixmap(self, pixmapPath):
self._pixmap = QtGui.QPixmap(pixmapPath)
def paintEvent(self, event):
opt = QtWidgets.QStyleOptionButton()
self.initStyleOption(opt)
qp = QtGui.QPainter(self)
# нарисовать основную кнопку
self.style().drawControl(QtWidgets.QStyle.CE_PushButtonLabel, opt, qp, self)
if self._pixmap.isNull():
return
def enterEvent(self, e):
self.setText("red!")
self.window().svgColor("#f00")
svg_base64_str = b64encode(self.window().svg_str.encode('utf-8'))
self.icon = iconFromBase64(svg_base64_str)
self.setIcon(self.icon)
super().enterEvent(e)
def leaveEvent(self, e):
self.setText("blue")
self.window().svgColor("#00f")
svg_base64_str = b64encode(self.window().svg_str.encode('utf-8'))
self.icon = iconFromBase64(svg_base64_str)
self.setIcon(self.icon)
super().enterEvent(e)
class Window(QWidget):
def __init__(self):
super().__init__()
self._dictRB = {
'rb0': False,
'rb1': False,
'rb2': False,
'rb3': False,
}
self.main_layout = QHBoxLayout(self)
self.buttonGroup = QButtonGroup()
self.attr_layout = QHBoxLayout()
self.main_layout.addLayout(self.attr_layout)
# ++
self.svgColor("#00f")
svg_base64_str = b64encode(self.svg_str.encode('utf-8'))
self.icon = iconFromBase64(svg_base64_str)
self.rb0 = RadioButton(["2.svg", self.icon], self)
# ++
self.attr_layout.addWidget(self.rb0)
self.buttonGroup.addButton(self.rb0)
self.rb1 = QRadioButton('rb1')
self.attr_layout.addWidget(self.rb1)
self.buttonGroup.addButton(self.rb1)
self.rb2 = QRadioButton('rb2')
self.attr_layout.addWidget(self.rb2)
self.buttonGroup.addButton(self.rb2)
self.rb3 = QRadioButton('rb3')
self.buttonGroup.addButton(self.rb3)
self.buttonGroup.buttonClicked.connect(self.check_button)
def check_button(self, radioButton):
'''
if self._dictRB[radioButton.text()]:
self._dictRB[radioButton.text()] = False
self._dictRB['rb3'] = True
self.rb3.setChecked(True)
else:
for b in self._dictRB:
self._dictRB[b] = False
self._dictRB[radioButton.text()] = True
'''
print("Нажата кнопка -> `{} - {}`".format(radioButton.text(), radioButton.isChecked()))
# ++
def svgColor(self, color):
self.svg_str = """
<svg width="141.111mm" height="141.111mm"
viewBox="0 0 400 400"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt SVG Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="%s" fill-opacity="1" stroke="none" transform="matrix(1,0,0,1,0,0)"
font-family="MS Shell Dlg 2" font-size="8.25" font-weight="400" font-style="normal"
>
<rect x="0" y="0" width="400" height="400"/>
</g>
<g fill="#808080" fill-opacity="1" stroke="#ffffff" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="MS Shell Dlg 2" font-size="8.25" font-weight="400" font-style="normal"
>
<rect x="100" y="100" width="200" height="200"/>
<text fill="#ffffff" fill-opacity="1" stroke="none" xml:space="preserve" x="193" y="203" font-family="MS Shell Dlg 2" font-size="8.25" font-weight="400" font-style="normal"
>test</text>
</g>
</g>
</svg>
""" % color
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())

