2015-03-25 53 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