问题描述
我有一个使用 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):
# ...