Domanda

Ho molte colonne strette con molto lunghe etichette. Voglio ruotare le etichette di 90 gradi. E 'possibile?

È stato utile?

Soluzione

Si dovrà probabilmente sottoclasse QTableWidgetItem e implementare il proprio testo verticale pittura. Quindi utilizzare setHorizontalHeaderItem() sul vostro tavolo per punto a un'istanza del nuovo widget.

Altri suggerimenti

Durante la ricerca di una risposta a questa domanda ho trovato molti suggerimenti, ma nessuna vera risposta. I suggerimenti raccontano una sottoclasse QHeaderView e re-implementare paintSection. Quando ho provato a farlo in PyQt4 e cercato di attuare paintSection da zero, a seguito della fonte di QHeaderView, non ero riuscito. Tuttavia, semplicemente ruotando l'istanza pittore e regolando tutti i suggerimenti per le dimensioni avuto successo. Il codice funziona solo per le intestazioni orizzontali ed è ben compatta:

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

Ho fatto uno script personalizzato che funziona bene in base alla risposta precedente ..

copia e incolla il codice seguente in un file rotated.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

quindi importare dal file main.py questa classe secondo questa linea:

from rotated import RotatedHeaderView

e completare le azioni con questa linea:

self.YourTableName.setHorizontalHeader(RotatedHeaderView(self.YourTableName))

speranza vale la pena!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top