2017-06-06 212 views
1

我有一个QTableView显示来自自定义模型的数据。我在每个单元格上都有一个QItemDelegate版本。视图的一列有一个由QLineEditQCheckBox组成的自定义小部件。当我点击这个列的单元格时,编辑器会显示出来,它可以工作,但它不适合表格单元格。而且,当我放大一行并单击单元格时,我可以看到小部件后面单元格的数据。为QTableView QItemDelegate编辑器上的自定义小部件

有没有一种方法可以让我的小部件在视图上像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 

回答

1

有许多不同的问题:

  1. 垂直尺寸 - 政策QLineEdit默认情况下是固定的,所以它不会扩展到填充空间。

  2. 该布局具有可以约束所包含小部件的大小的默认内容余量(即填充)。

  3. 默认情况下,QWidget不会自动绘制自己的背景,因此单元格的数据可能在下方可见。

  4. 如果小部件占用全部单元格中的空间,将不再可能显示单元格被选中。

所有这些问题都可以固定如下:

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) 

,并期待这样的:

enter image description here

+0

谢谢!它按预期工作。 – user20679