2015-03-25 2 views
2

J'ai l'élément de délégué personnalisé défini pour une colonne pour QTableView. Dans certains cas, je dois le supprimer (c'est-à-dire définir un délégué par défaut). Mais il semble que QT ne le permet pas. L'ancien délégué est utilisé même après avoir défini le nouveau. Selon la documentation QT pour QItemDelegate, toute manipulation doit être effectuée dans le même délégué, mais cela peut entraîner des problèmes de performances. Existe-t-il un moyen de supprimer/réinitialiser le délégué d'élément par défaut pour QTableView.Supprimer le QItemDelegate de QTableView

+0

Avez-vous essayé d'appeler setItemDelegate avec 0 comme argument? ou peut-être stocker le par défaut itemDelegate() et que le définir à nouveau? Les docs déclarent qu'en réglant le délégué, l'ancien n'est pas supprimé. – nayana

+0

Plus 1 pour la jaquette Pink Floyd. – Iuliu

+0

Oui, j'ai essayé de paramétrer l'élément délégué à 0; cela n'a aucun effet, puisque QTableView utilise toujours l'ancien. Aussi, j'ai essayé de supprimer le jeu de délégués avant, il apporte à planter (même en utilisant la méthode deleteLater()) –

Répondre

1

Je l'ai essayé dans PyQt5 (désolé, je ne suis pas capable d'écrire en C++). Je pourrais placer le itemGelegate standard à la vue, puis définir un itemDelegate personnalisé à une colonne. En utilisant le "clicked" -signal je pourrais remplacer le délégué personnalisé par le itemDelegate standard pour cette colonne et vice versa.

custom delegate for column 0

changed to standard delegate

Ceci est mon code, peut-être aide:

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

Merci pour la réponse, malheureusement, je ne peux pas utiliser python.La seule option est C++ –

+0

Mais peut-être vous pouvez trouver des différences importantes entre votre et mon code en utilisant des méthodes ou des attributs et les traduire en C++. –