2017-06-06 222 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