Qt - может ли QTable иметь метки столбцов, повернутые на 90 градусов? - PullRequest
2 голосов
/ 06 сентября 2010

У меня много узких столбцов с очень длинными надписями. Я хочу повернуть метки на 90 градусов. Возможно ли это?

Ответы [ 3 ]

3 голосов
/ 06 сентября 2010

Возможно, вам придется создать подкласс QTableWidgetItem и реализовать собственное рисование вертикального текста.Затем используйте setHorizontalHeaderItem() на своей таблице, чтобы указать на экземпляр вашего нового виджета.

2 голосов
/ 11 февраля 2014

При поиске ответа на этот вопрос я нашел много подсказок, но реального ответа не нашел. Подсказки говорят о создании подкласса QHeaderView и повторной реализации paintSection. Когда я попытался сделать это в PyQt4 и попытался реализовать paintSection с нуля, следуя источнику QHeaderView, я не добился успеха. Однако простое вращение экземпляра Painter и настройка всех подсказок по размеру были успешными. Код работает только для горизонтальных заголовков и очень компактен:

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 голос
/ 11 марта 2016

Я создал собственный скрипт, который отлично работает на основе предыдущего ответа.

скопируйте и вставьте следующий код в файл 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

затем импортируйте из вашего файла main.py этот класс, используя следующую строку:

from rotated import RotatedHeaderView

и выполните действия с этой строкой:

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

надежда того стоит!

...