QStyledItemDelegate内的自定义QPushButton

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

问题:

我能够将QPushButton添加到QStyledItemDelegate中。我在伪造委托人的editorEvent方法内的按钮,因此当您按该按钮时会发生操作。 虽然我无法使QPushButton的样式表正常工作-它仅读取第一个背景参数,即“红色”,并且在鼠标悬停或按下时不会更改]。

尚不清楚我应该如何设置按钮单击和悬停检测,以使该按钮像委托中的真实按钮一样起作用。我需要设置一个eventFilter吗?我应该在视图级别执行此操作吗?我是否在委托人的绘画方法中执行此操作?一切结合在一起?

目标:

  • 将鼠标悬停在列表时间上将显示按钮按钮的图标。
  • 将鼠标悬停在按钮上将更改其背景颜色。
  • 在按钮上的鼠标单击将使背景颜色变暗,以表明发生了单击。
  • 如果可能的话,我想在样式表中设置这些参数,但是我也不介意在paint函数中完成所有这些操作。无论如何!
  • 示例:

enter image description here

谢谢!

[到目前为止,我已经将它们放在一起:

import sys

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets


class DelegateButton(QtWidgets.QPushButton):
    def __init__(self, parent=None):
        super(DelegateButton, self).__init__(parent)

        # self.setLayout(QHBoxLayout())
        size = 50
        self.setFixedSize(size, size)
        self.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogOpenButton))
        self.setStyleSheet("""
            QPushButton{
                background:red;
                height: 30px;
                font: 12px "Roboto Thin";
                border-radius: 25
            }
            QPushButton:hover{
                background: green;
            }
            QPushButton:hover:pressed{
                background: blue;
            }
            QPushButton:pressed{
                background:  yellow;
            }
            """)


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.resize(300, 300)

        # Model/View
        entries = ['one', 'two', 'three']
        model = QtGui.QStandardItemModel()
        delegate = ListItemDelegate()
        self.listView = QtWidgets.QListView(self)
        self.listView.setModel(model)
        self.listView.setItemDelegate(delegate)

        for i in entries:
            item = QtGui.QStandardItem(i)
            model.appendRow(item)

        # Layout
        main_layout = QtWidgets.QVBoxLayout()
        main_layout.addWidget(self.listView)
        self.setLayout(main_layout)

        # Connections
        delegate.delegateButtonPressed.connect(self.on_delegate_button_pressed)

    def on_delegate_button_pressed(self, index):

        print('"{}" delegate button pressed'.format(index.data(QtCore.Qt.DisplayRole)))


class ListItemDelegate(QtWidgets.QStyledItemDelegate):
    delegateButtonPressed = QtCore.Signal(QtCore.QModelIndex)

    def __init__(self):
        super(ListItemDelegate, self).__init__()

        self.button = DelegateButton()

    def sizeHint(self, option, index):
        size = super(ListItemDelegate, self).sizeHint(option, index)
        size.setHeight(50)
        return size

    def editorEvent(self, event, model, option, index):

        # Launch app when launch button clicked
        if event.type() == QtCore.QEvent.MouseButtonRelease:
            click_pos = event.pos()
            rect_button = self.rect_button

            if rect_button.contains(click_pos):
                self.delegateButtonPressed.emit(index)
                return True
            else:
                return False
        else:
            return False

    def paint(self, painter, option, index):
        spacing = 10
        icon_size = 40

        # BG #########################################
        painter.save()
        if option.state & QtWidgets.QStyle.State_Selected:
            painter.setBrush(QtGui.QColor('orange'))
        elif option.state & QtWidgets.QStyle.State_MouseOver:
            painter.setBrush(QtGui.QColor('black'))
        else:
            painter.setBrush(QtGui.QColor('purple'))
        painter.drawRect(option.rect)
        painter.restore()

        # Text ########################################
        rect_text = option.rect
        QtWidgets.QApplication.style().drawItemText(painter, rect_text, QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft, QtWidgets.QApplication.palette(), True, index.data(QtCore.Qt.DisplayRole))

        # Button ######################################
        self.rect_button = QtCore.QRect(
            option.rect.right() - icon_size - spacing,
            option.rect.bottom() - int(option.rect.height() / 2) - int(icon_size / 2),
            icon_size,
            icon_size
        )

        option = QtWidgets.QStyleOptionButton()
        option.initFrom(self.button)
        option.rect = self.rect_button
        # Logic
        if self.button.isDown():
            option.state = QtWidgets.QStyle.State_Sunken
        else:
            pass
        if self.button.isDefault():
            option.features = option.features or QtWidgets.QStyleOptionButton.DefaultButton
        option.icon = self.button.icon()
        option.iconSize = QtCore.QSize(30, 30)

        painter.save()
        self.button.style().drawControl(QtWidgets.QStyle.CE_PushButton, option, painter, self.button)
        painter.restore()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

问题:我可以将QPushButton添加到QStyledItemDelegate中。我在伪造委托人的editorEvent方法内的按钮,因此当您按该按钮时会发生操作。我正在...

python pyside2 qtstylesheets qpushbutton qstyleditemdelegate
1个回答
0
投票

尝试:

© www.soinside.com 2019 - 2024. All rights reserved.