问题描述
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 我得到了一个损坏的布局:
布局截图:
更新:
它看起来像是 MacOS 的 pyside2 和 PySide6 中的错误。 我提交了一个错误报告: https://bugreports.qt.io/browse/PYSIDE-1464
解决方法
感谢您的帮助 eyllanesc。 它看起来像是 PySide2 和 PySide6 以及 MacOS 的 PyQt5 中的错误。我已提交错误报告:https://bugreports.qt.io/browse/PYSIDE-1464
截至目前,我没有任何可行的方法来实现 QProgressBar 委托。