可以在 QTableView 中的委托小部件后面看到文本

问题描述

我有一个使用 QItemDelegate 和 QAbstractTableModel 的 QTableView。一行包含 QPushButton、QCheckBox、QComboBox 和 QTimeEdit。我的问题是文本出现在小部件后面。当包含 QPushButton 和 QCheckBox 的单元格被选中,然后取消选中 true 或 false 出现在小部件后面时。为 QComboBox 和 QTimeEdit 提供的文本也在小部件后面可见。

最小示例:

import sys
from pyside2.QtWidgets import QApplication,QMainWindow,QWidget,QVBoxLayout,QPushButton,QItemDelegate,QTimeEdit,\
    QCheckBox,QComboBox,QTableView
from pyside2.QtCore import QAbstractTableModel,Qt,QTime
from pyside2.QtGui import QIcon


class Delegate(QItemDelegate):

    def __init__(self):
        QItemDelegate.__init__(self)

        self.type_items = ["Job","Activity"]

    def createEditor(self,parent,option,index):

        # CHECKBox,COMBOBox,LINEEDIT,TIMEDIT
        if index.column() == 0:
            pushButton = QPushButton(parent)
            # icon = QIcon("Images/cross.png")
            # pushButton.setIcon(icon)
            return pushButton
        elif index.column() == 1:
            checkBox = QCheckBox(parent)
            return checkBox
        elif index.column() == 2:
            comboBox = QComboBox(parent)
            for text in self.type_items:
                comboBox.addItem(text,(index.row(),index.column()))
            return comboBox
        elif index.column() == 3:
            timeEdit = QTimeEdit(parent)
            timeEdit.setdisplayFormat('HH:mm')
            return timeEdit
        return super().createEditor(parent,index)


class TableModel(QAbstractTableModel):
    def __init__(self,data):
        super(TableModel,self).__init__()
        self._data = data

    def data(self,index,role):
        if role in (Qt.displayRole,Qt.EditRole):
            return self._data[index.row()][index.column()]

    def rowCount(self,index=None):
        return len(self._data)

    def columnCount(self,index=None):
        return len(self._data[0])

    def flags(self,index):
        return super().flags(index) | Qt.ItemIsEditable

    def setData(self,value,role=Qt.EditRole):
        if role == Qt.EditRole:
            self._data[index.row()][index.column()] = value
            self.dataChanged.emit(index,index)
            return True
        return False


class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)

        # PARENT WIDGET
        localWidget = QWidget()

        self.table = QTableView(localWidget)

        data = [["",Qt.CheckState.Checked,"Job",QTime(2,1)],["",Qt.CheckState.Unchecked,"Activity",QTime(3,0)]]

        self.model = TableModel(data)
        self.table.setModel(self.model)
        self.table.setItemDelegate(Delegate())

        # VERTICAL LAYOUT
        layout_v = QVBoxLayout()
        layout_v.addWidget(self.table)
        localWidget.setLayout(layout_v)

        for row in range(self.model.rowCount()):
            for column in range(self.model.columnCount()):
                index = self.model.index(row,column)
                self.table.openPersistentEditor(index)

        col_widths = [40,40,90,65]
        for col in range(self.model.columnCount()):
            self.table.setColumnWidth(col,col_widths[col])

        self.setCentralWidget(localWidget)
        self.show()


app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

如何停止显示小部件后面的文本?

解决方法

一个可能的解决方案是绘制的文本是一个空字符串。

class Delegate(QItemDelegate):
    def __init__(self):
        QItemDelegate.__init__(self)

        self.type_items = ["Job","Activity"]

    def drawDisplay(self,painter,option,rect,text):
        super().drawDisplay(painter,"")

    def createEditor(self,parent,index):
        # ...