我有一个显示自定义模型数据的QTableView
。我在每个单元格上都有QItemDelegate
版本。该视图的一列包含由QLineEdit
和QCheckBox
组成的自定义窗口小部件。当我单击此列的单元格时,将显示编辑器并且它可以正常工作,但它不适合表格单元格。此外,当我放大一行并单击单元格时,我可以看到窗口小部件后面的单元格数据。
我的窗口小部件是否有一种方式可以像视图中QItemDelegate
的普通编辑窗口小部件一样?即在创建时它使用了单元格的所有垂直空间?
这是我的小部件(简化):
class MyWidget(QtGui.QWidget):
def __init__(self, parent = None):
super(MyWidget, self).__init__(parent)
self.lineEdit = QtGui.QLineEdit(parent)
self.checkBox = QtGui.QCheckBox(parent)
self.checkBox.setChecked(False)
self.gridLayout = QtGui.QGridLayout(self)
self.gridLayout.setSpacing(3)
self.gridLayout.addWidget(self.lineEdit, 0, 0)
self.gridLayout.addWidget(self.checkBox, 0, 1)
我的代表(简化):
class MyDelegate(QtGui.QItemDelegate):
def __init__(self, parent = None):
super(MyDelegate, self).__init__(parent)
def createEditor(self, parent, option, index):
return MyWidget(parent)
def setModelData(self, editor, model, index):
pass
def setEditorData(self, editor, model, index):
pass
答案 0 :(得分:2)
有许多不同的问题:
QLineEdit
的垂直尺寸政策默认是固定的,因此不会展开以填充可用空间。
布局具有默认内容边距(即填充),这可能会限制所包含小部件的大小。
默认情况下,QWidget
不会自动绘制自己的背景,因此单元格的数据可能会显示在下方。
如果窗口小部件占用单元格中的空格全部,则无法再显示该单元格已被选中。
所有这些问题都可以解决如下:
class MyWidget(QtGui.QWidget):
def __init__(self, parent = None):
super(MyWidget, self).__init__(parent)
# create an inner widget
widget = QtGui.QWidget(self)
# disable widget transparency
widget.setAutoFillBackground(True)
# allow the line-edit to fully expand
self.lineEdit = QtGui.QLineEdit(widget)
self.lineEdit.setSizePolicy(QtGui.QSizePolicy(
QtGui.QSizePolicy.MinimumExpanding,
QtGui.QSizePolicy.MinimumExpanding))
self.checkBox = QtGui.QCheckBox(widget)
self.checkBox.setChecked(False)
# trim space on right side of checkbox
self.checkBox.setText('')
hbox = QtGui.QHBoxLayout(widget)
# remove the inner margin
hbox.setContentsMargins(0, 0, 0, 0)
hbox.setSpacing(3)
hbox.addWidget(self.lineEdit)
hbox.addWidget(self.checkBox)
layout = QtGui.QVBoxLayout(self)
# set the selection rectangle width
layout.setContentsMargins(2, 2, 2, 2)
layout.addWidget(widget)
看起来像这样: