委托在 QTableView 中显示不正确

问题描述

我正在尝试实现 pyside2 文档中列出的示例代码

https://doc.qt.io/qtforpython-5.12/PySide2/QtWidgets/QAbstractItemDelegate.html#PySide2.QtWidgets.QAbstractItemDelegate

import sys
import os

from pyside2.QtWidgets import (
    QApplication,QMainWindow,QTableView,QVBoxLayout,QWidget,qstyleOptionProgressBar,qstyledItemDelegate,qstyle
)

from pyside2.QtCore import QAbstractTableModel,QModelIndex,QSortFilterProxyModel
from pyside2.QtGui import Qt

data = [
    ['123','456','789'],['456','123',['789','789','123'],]

class WidgetDelegate(qstyledItemDelegate):
    def __init__(self):
        super(WidgetDelegate,self).__init__()

    def paint(self,painter,option,index):
        if index.column() == 2:
            progress = 50
            self.progressBarOption = qstyleOptionProgressBar()
            self.progressBarOption.rect = option.rect
            self.progressBarOption.minimum = 0
            self.progressBarOption.minimum = 100
            QApplication.style().drawControl(qstyle.CE_ProgressBar,self.progressBarOption,painter)
        
        else:
            qstyledItemDelegate.paint(self,index)


class TableModel(QAbstractTableModel):
    headerLabels = ['Header1','Header2','Header3']
    def __init__(self,input_data = None):
        super(TableModel,self).__init__()
        self.tableData = input_data
        if self.tableData is None:
            self.tableData = list()

    def rowCount(self,parent = QModelIndex):
        try:
            row_count = len(self.tableData)
            return row_count
        except:
            return 0

    def columnCount(self,parent = QModelIndex):
        try:
            column_count = len(self.tableData[0])
            return column_count
        except:
            return 0

    def headerData(self,section,orientation,role=Qt.displayRole):
        if role == Qt.displayRole and orientation == Qt.Horizontal:
            return self.headerLabels[section]

        return QAbstractTableModel.headerData(self,role)

    def data(self,index,role = Qt.displayRole):
        if role == Qt.displayRole or role == Qt.EditRole:
            return self.tableData[index.row()][index.column()]
        

class TableView(QTableView):
    def __init__(self):
        super(TableView,self).__init__()
        self.setSelectionBehavior(self.SelectRows)


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow,self).__init__()
        self.tableView = TableView()
        self.delegate = WidgetDelegate()
        self.tableView.setItemDelegate(self.delegate)
        self.initUi()
        self.tableModel = TableModel(data)
        self.tableView.setModel(self.tableModel)

        
    def initUi(self):
        #----- Init UI -----
        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.tableView)
        mainWidget = QWidget()
        mainWidget.setLayout(mainLayout)
        self.setCentralWidget(mainWidget)
        self.resize(650,350)

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

而不是最后一列中的 ProgressBars 我得到了一个损坏的布局: 布局截图:

Layout screenshot

更新:

它看起来像是 MacOS 的 pyside2 和 PySide6 中的错误。 我提交了一个错误报告: https://bugreports.qt.io/browse/PYSIDE-1464

解决方法

感谢您的帮助 eyllanesc。 它看起来像是 PySide2 和 PySide6 以及 MacOS 的 PyQt5 中的错误。我已提交错误报告:https://bugreports.qt.io/browse/PYSIDE-1464

截至目前,我没有任何可行的方法来实现 QProgressBar 委托。