2016-04-28 154 views
0

以下代碼創建一個單獨的QTableView。然後創建一個QAbstractTableModel的實例並將其作爲其模型分配給它。最後,QItemDelegate被分配給QTableView如何將文本設置爲與QTableView一起用作QItemDelegate的QLineEdit

第0列正在填充QLineEdit。雖然列1填入QComboBox。 但即使爲QLineEdit分配了自定義文本值,QLineEdit仍然爲空。 QComboBox沒有發生,它正確地得到三個項目:'某處','超過','彩虹'。

enter image description here

應該怎樣做,以預填充柱0 QLineEdits與文本?

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

class Delegate(QtGui.QItemDelegate): 
    def __init__(self): 
     QtGui.QItemDelegate.__init__(self) 

    def createEditor(self, parent, option, index): 
     if index.column()==0: 
      lineedit=QtGui.QLineEdit(parent) 
      lineedit.setText('Somewhere over the rainbow') 
      return lineedit 
     elif index.column()==1: 
      combo=QtGui.QComboBox(parent) 
      combo.addItems(['Somewhere','Over','The Rainbow']) 
      combo.setCurrentIndex(index.row()) 
      return combo 

class Model(QtCore.QAbstractTableModel): 
    def __init__(self): 
     QtCore.QAbstractTableModel.__init__(self) 
     self.items = [[1, 'one', None], [2, 'two', None], [3, 'three', None]] 

    def rowCount(self, parent=QtCore.QModelIndex()): 
     return 3 
    def columnCount(self, parent=QtCore.QModelIndex()): 
     return 3 

    def data(self, index, role): 
     if not index.isValid(): return 
     row = index.row() 
     column = index.column() 
     if role == QtCore.Qt.DisplayRole: 
      return self.items[row][column] 

tableModel=Model() 
tableView=QtGui.QTableView() 
tableView.setModel(tableModel) 
tableView.setItemDelegate(Delegate()) 

for row in range(tableModel.rowCount()): 
    for column in range(tableModel.columnCount()): 
     index=tableModel.index(row, column) 
     tableView.openPersistentEditor(index) 

tableView.show() 
app.exec_() 

日後進行編輯:

非常感謝法比奧爲招。

工作代碼發佈在下方。

取而代之的是處理Delegate.createEditor()方法中的值賦值,我們應該實現Delegate.setEditorData(editor, index)。 裏面的setEditorData我們可以得到兩個:index.column()index.row()以及使用index參數value = index.model().items[row][column]

enter image description here

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

class Delegate(QtGui.QItemDelegate): 
    def __init__(self): 
     QtGui.QItemDelegate.__init__(self) 

    def createEditor(self, parent, option, index): 
     if index.column()==0: 
      lineedit=QtGui.QLineEdit(parent) 
      return lineedit 

     elif index.column()==1: 
      combo=QtGui.QComboBox(parent) 
      return combo 

    def setEditorData(self, editor, index): 
     row = index.row() 
     column = index.column() 
     value = index.model().items[row][column] 
     if isinstance(editor, QtGui.QComboBox): 
      editor.addItems(['Somewhere','Over','The Rainbow']) 
      editor.setCurrentIndex(index.row()) 
     if isinstance(editor, QtGui.QLineEdit): 
      editor.setText('Somewhere over the rainbow') 

class Model(QtCore.QAbstractTableModel): 
    def __init__(self): 
     QtCore.QAbstractTableModel.__init__(self) 
     self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']] 

    def flags(self, index): 
     return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable 
    def rowCount(self, parent=QtCore.QModelIndex()): 
     return 3 
    def columnCount(self, parent=QtCore.QModelIndex()): 
     return 3 

    def data(self, index, role): 
     if not index.isValid(): return 
     row = index.row() 
     column = index.column() 
     if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole: 
      return self.items[row][column] 

tableModel=Model() 
tableView=QtGui.QTableView() 
tableView.setModel(tableModel) 
tableView.setItemDelegate(Delegate()) 

for row in range(tableModel.rowCount()): 
    for column in range(tableModel.columnCount()): 
     index=tableModel.index(row, column) 
     tableView.openPersistentEditor(index) 

tableView.show() 
app.exec_() 

回答

1

該項目委託由setEditorData法編輯器設置數據訪問由模型所使用self.items變量,獲取模型數據並將其設置爲編輯器。在這種情況下,項目委託會獲取模型數據(可能爲空)並將其設置爲QLineEdit,因此它會設置一個空字符串。

如果要在編輯器中初始化數據,則必須重新執行setEditorData或初始化模型中的數據。

對於QComboBox,因爲setEditorData不會更改組合框的項目,所以項目會正確顯示。一般來說,必須重新實現setEditorData以根據模型數據設置組合框的當前索引。

我建議閱讀文檔:Model/View ProgrammingDelegate Classes

相關問題