2015-03-25 3 views
2

У меня есть настраиваемый делегат элемента для одного столбца для QTableView. В некоторых случаях мне нужно удалить его (т. Е. Установить делегат по умолчанию). Но, похоже, QT этого не позволяет. Старый делегат используется даже после установки нового. Согласно документации QT для QItemDelegate вся обработка должна выполняться в том же делетете, но это может привести к проблемам с производительностью. Есть ли способ удалить/сбросить значение по умолчанию делегата элемента для QTableView.Удалите QItemDelegate из QTableView

+0

вы пытались вызвать setItemDelegate с 0 в качестве аргумента? или, возможно, сохранить элемент itemDelegate() по умолчанию, а затем снова установить его? Документы заявляют, что, установив делегат, старый не удаляется. – nayana

+0

Plus 1 для крышки Pink Floyd. – Iuliu

+0

Да, я пробовал установить делегат пункта в 0; это не имеет никакого эффекта, поскольку QTableView все еще использует старый. Кроме того, я пытался удалить набор делегатов раньше, он приводит к сбою (даже с использованием метода deleteLater()) –

ответ

1

Я попробовал это в PyQt5 (извините, им не удалось написать C++). Я мог бы установить стандартное itemGelegate в представление, а затем установить пользовательский элемент itemDelegate в один столбец. Используя «clicked» -signal, я могу заменить пользовательский делегат стандартным 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++. –

+0

Но, возможно, вы можете найти важные различия между вашим и моим кодом при использовании методов или атрибутов и перевести их на C++. –

Смежные вопросы