2015-03-25 103 views
2

我爲QTableView中的一列設置了自定義項代理。在某些情況下,我需要刪除它(即設置默認項目委託)。但似乎QT不允許這樣做。即使在設置新代表之後,也可以使用舊代表。 根據QItemDelegate的QT文檔,所有處理都應在同一代表中完成,但這可能會導致性能問題。有沒有辦法將QTableView的項目代理移除/重置爲默認值。從QTableView中刪除QItemDelegate

+0

你試圖調用setItemDelegate以0作爲參數?或者可能存儲默認的itemDelegate()並重新設置它? 文檔狀態,通過設置代表舊的不刪除。 – nayana 2015-03-25 07:52:04

+0

加上1爲Pink Floyd封面。 – Iuliu 2015-03-25 08:11:04

+0

是的,我已經嘗試將項目代理設置爲0;它沒有效果,因爲QTableView仍然使用舊版本。我還試着刪除之前設置的委託,它會導致崩潰(即使使用deleteLater()方法) – 2015-03-25 08:32:55

回答

1

我在PyQt5中試過它(抱歉,我不能編寫C++)。我可以將標準itemGategate設置爲視圖,然後將自定義itemDelegate設置爲一列。通過使用「clicked」信號,我可以用標準itemDelegate代替這個列的自定義委託,反之亦然。

custom delegate for column 0

changed to standard delegate

這是我的代碼,也許它可以幫助:

import sys 
from PyQt5 import QtGui, QtCore, QtWidgets 

class MyDelegate(QtWidgets.QStyledItemDelegate): 
    def __init__(self): 
     QtWidgets.QStyledItemDelegate.__init__(self) 
     self.AlignmentFlag = QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter 
     self.abstand = 2 

    def paint(self, painter, item, index): 
     rahmen = item.rect.adjusted(self.abstand, self.abstand, -self.abstand, -self.abstand) 
     eintrag = index.data() 
     painter.save() 
     painter.drawText(rahmen,self.AlignmentFlag, eintrag) 
     painter.restore() 

class MyModel(QtCore.QAbstractTableModel): 
    def __init__(self,): 
     QtCore.QAbstractTableModel.__init__(self) 
     self.items = [['a0','a1','a2','a3','a4'],['b0','b1','b2','b3','b4'],['c0','c1','c2','c3','c4']] 

    def columnCount(self,items): 
     cc = len(self.items[0]) 
     return cc 

    def rowCount(self,items): 
     rc = len(self.items) 
     return rc 

    def data(self, index, role=2): 
     return self.items[index.row()][index.column()] 

class MyWidget(QtWidgets.QTableView): 
    def __init__(self): 
     QtWidgets.QTableView.__init__(self) 
     self.setModel(MyModel()) 
     self.setGeometry(200,200,530,120) 
     self.delegate_1 = MyDelegate() 
     self.delegate_2 = QtWidgets.QStyledItemDelegate() 
     self.setItemDelegate(self.delegate_2) 
     self.setItemDelegateForColumn(0,self.delegate_1)   
     self.clicked.connect(self.changeDelegate) 

    def changeDelegate(self,index): 
     if index.column() == 0: 
      delegate_new = self.delegate_2 if self.itemDelegateForColumn(index.column()) == self.delegate_1 else self.delegate_1 
      self.setItemDelegateForColumn(index.column(),delegate_new) 
     else: 
      pass 

app = QtWidgets.QApplication(sys.argv) 
widget = MyWidget() 
widget.show() 
sys.exit(app.exec_()) 
+0

感謝您的答案。不幸的是,我不能使用python。唯一的選擇是C++。 – 2015-03-30 11:51:58

+0

但是也許你可以發現你和我的代碼之間使用方法或屬性的重要區別並將它們轉換爲C++。 – 2015-03-30 14:11:00