Python QItemDelegate编辑器上用于QTableView的自定义小部件

Python QItemDelegate编辑器上用于QTableView的自定义小部件,python,layout,pyqt4,pyside,qitemdelegate,Python,Layout,Pyqt4,Pyside,Qitemdelegate,我有一个QTableView显示来自自定义模型的数据。我在每个单元格上都有一个用于编辑的QItemDelegate。视图的一列有一个自定义小部件,由QLineEdit和QCheckBox组成。当我点击该列的单元格时,会显示编辑器,它可以工作,但它不适合表格单元格。此外,当我放大一行并单击单元格时,我可以看到小部件后面的单元格数据 是否有一种方式使我的小部件的行为类似于视图上的QItemDelegate的普通编辑小部件?i、 e创建时,它使用单元格的所有垂直空间 这是我的小部件(简化): 我的代表

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

是否有一种方式使我的小部件的行为类似于视图上的
QItemDelegate
的普通编辑小部件?i、 e创建时,它使用单元格的所有垂直空间

这是我的小部件(简化):

我的代表(简体):


有许多不同的问题:

  • 默认情况下,
    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)
    
    看起来是这样的:

    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
    
    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)