2010-09-06 5 views

Répondre

3

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.

2

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 
1

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!

Questions connexes