我的目标是在将鼠标悬停在 QComboBox 项目上时创建一个缓慢的过渡动画 - 我希望它在超过 300 毫秒的时间内从灰色 (
QColor(198, 198, 198)
) 缓慢过渡到白色 (QColor(255, 255, 255)
),这就是我的代码到目前为止看起来:
from PySide6.QtCore import *
from PySide6.QtWidgets import *
from PySide6.QtGui import *
import sys
class ComboBoxDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
if option.state & QStyle.State_MouseOver: # if hover
background_color = QColor(255, 255, 255)
else: # leaving hover
background_color = QColor(198, 198, 198)
painter.fillRect(option.rect, background_color)
painter.drawText(option.rect, index.data())
class MainWidget(QWidget):
def __init__(self):
super(MainWidget, self).__init__()
self.combo_box = QComboBox(self)
self.combo_box.addItems(['Item 1','Item 2', 'Item 3'])
self.main_layout = QVBoxLayout()
self.main_layout.addWidget(self.combo_box)
self.setLayout(self.main_layout)
delegate = ComboBoxDelegate(self.combo_box)
self.combo_box.setItemDelegate(delegate)
app = QApplication(sys.argv)
window = MainWidget()
window.show()
sys.exit(app.exec())
目前,这让我可以将鼠标悬停在 QComboBox 中的项目上并更改其背景颜色,但没有我想要的平滑过渡。
我尝试过使用
.highlighted.connect()
并用它抓取项目,然后尝试通过 QVariantAnimation
对其进行动画处理,但是它不允许我使用它对 QStandardItem
进行动画处理,然后我尝试使用 QStyledItemDelegate
,现在我一直在想如何部署这个转换,因为我相信不可能从 QComboBox 中获取项目作为 QObject。
您可以使用
QColor
插入 QVariantAnimation
值,并使用 QAbstractItemView.update()
重绘弹出窗口的项目,如以下示例所示。
...
class ComboBoxDelegate(QStyledItemDelegate):
def __init__(self, combo_box):
super().__init__(combo_box)
self.selected_index = None
self.anim = anim = QVariantAnimation()
anim.setStartValue(QColor(Qt.gray))
anim.setEndValue(QColor(Qt.red))
anim.setDuration(1000)
anim.valueChanged.connect(lambda _:
combo_box.view().update(self.selected_index))
def paint(self, painter, option, index):
anim = self.anim
if option.state & QStyle.State_Selected:
if index != self.selected_index:
self.selected_index = index
anim.stop()
anim.start()
background_color = anim.currentValue()
else:
background_color = anim.startValue()
painter.fillRect(option.rect, background_color)
painter.drawText(option.rect, index.data())
...