J'ai beaucoup de colonnes étroites avec des étiquettes très longues. Je veux faire pivoter les étiquettes de 90 degrés. C'est possible?Qt - Can QTable peut-il faire pivoter les étiquettes de colonne de 90 degrés?
Répondre
Vous devrez probablement sous-classer QTableWidgetItem et implémenter votre propre peinture de texte verticale. Ensuite, utilisez setHorizontalHeaderItem()
sur votre table pour pointer vers une instance de votre nouveau widget.
Lorsque vous cherchez une réponse à cette question, j'ai trouvé de nombreux indices, mais aucune vraie réponse. Les indices indiquent que vous devez sous-classer QHeaderView et ré-implémenter paintSection. Quand j'ai essayé de le faire dans PyQt4 et que j'ai essayé d'implémenter paintSection à partir de zéro, suite à la source de QHeaderView, je n'ai pas réussi. Cependant, il suffit de faire pivoter l'instance de peintre et d'ajuster toutes les indications de taille. Le code fonctionne pour les en-têtes horizontales seulement et est bien compact:
from PyQt4 import QtGui, QtCore
class RotatedHeaderView(QtGui.QHeaderView):
def __init__(self, orientation, parent=None):
super(RotatedHeaderView, self).__init__(orientation, parent)
self.setMinimumSectionSize(20)
def paintSection(self, painter, rect, logicalIndex):
painter.save()
# translate the painter such that rotate will rotate around the correct point
painter.translate(rect.x()+rect.width(), rect.y())
painter.rotate(90)
# and have parent code paint at this location
newrect = QtCore.QRect(0,0,rect.height(),rect.width())
super(RotatedHeaderView, self).paintSection(painter, newrect, logicalIndex)
painter.restore()
def minimumSizeHint(self):
size = super(RotatedHeaderView, self).minimumSizeHint()
size.transpose()
return size
def sectionSizeFromContents(self, logicalIndex):
size = super(RotatedHeaderView, self).sectionSizeFromContents(logicalIndex)
size.transpose()
return size
J'ai fait un script personnalisé qui fonctionne très bien fonction de la réponse précédente ..
copier et coller le code suivant dans une rotation. py
#!/usr/bin/env python
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class RotatedHeaderView(QHeaderView):
def __init__(self, parent=None):
super(RotatedHeaderView, self).__init__(Qt.Horizontal, parent)
self.setMinimumSectionSize(20)
def paintSection(self, painter, rect, logicalIndex):
painter.save()
# translate the painter such that rotate will rotate around the correct point
painter.translate(rect.x()+rect.width(), rect.y())
painter.rotate(90)
# and have parent code paint at this location
newrect = QRect(0,0,rect.height(),rect.width())
super(RotatedHeaderView, self).paintSection(painter, newrect, logicalIndex)
painter.restore()
def minimumSizeHint(self):
size = super(RotatedHeaderView, self).minimumSizeHint()
size.transpose()
return size
def sectionSizeFromContents(self, logicalIndex):
size = super(RotatedHeaderView, self).sectionSizeFromContents(logicalIndex)
size.transpose()
return size
puis importer à partir de votre fichier main.py cette classe en utilisant cette ligne:
from rotated import RotatedHeaderView
et compléter les actions avec cette ligne:
self.YourTableName.setHorizontalHeader(RotatedHeaderView(self.YourTableName))
espoir vaut le coup!