QComboBox 项目背景的过渡动画

问题描述 投票:0回答:1

我的目标是在将鼠标悬停在 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。

python qt pyqt
1个回答
0
投票

您可以使用

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())
...
© www.soinside.com 2019 - 2024. All rights reserved.