C++ 从QTableView中删除QItemDelegate
我为C++ 从QTableView中删除QItemDelegate,c++,qt,qtableview,C++,Qt,Qtableview,我为QTableView的一列设置了自定义项委托。在某些情况下,我需要删除它(即设置默认项委托)。但QT似乎不允许这样做。即使设置了新代理,也会使用旧代理。 根据QT文档中的QItemDelegate所有处理都应该在同一个委托中完成,但这可能会带来性能问题。是否有任何方法可以删除/重置QTableView的默认项委托?我在PyQt5中尝试过它(很抱歉,我无法编写C++)。我可以将标准itemGelegate设置为视图,然后将自定义itemDelegate设置为一列。通过使用“单击”信号,我可以将
QTableView
的一列设置了自定义项委托。在某些情况下,我需要删除它(即设置默认项委托)。但QT似乎不允许这样做。即使设置了新代理,也会使用旧代理。
根据QT文档中的QItemDelegate
所有处理都应该在同一个委托中完成,但这可能会带来性能问题。是否有任何方法可以删除/重置QTableView
的默认项委托?我在PyQt5中尝试过它(很抱歉,我无法编写C++)。我可以将标准itemGelegate设置为视图,然后将自定义itemDelegate设置为一列。通过使用“单击”信号,我可以将此列的自定义代表替换为标准itemDelegate,反之亦然
这是我的代码,可能有帮助:
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作为参数调用setItemDelegate?或者可能存储默认itemDelegate()然后再次设置它?文档声明,通过设置委托,旧的委托不会被删除。.粉色Floyd封面加1。是的,我尝试将item delegate设置为0;它没有效果,因为QTableView仍然使用旧的委托。此外,我以前也尝试过删除委托集,它会导致崩溃(甚至使用deleteLater()方法)我记得遇到了一个问题,很遗憾,你可以尝试多个QTable视图对象:(谢谢你的回答。不幸的是我不能使用Python。唯一的选择是C++。但是你也许可以在使用方法或属性时找到你和我的代码之间的重要区别,并将它们转换成C++。