Qt - QTable能否将列标签旋转90度?

3

我有许多很窄的列,带有非常长的标签。我想将标签旋转90度。这是可能的吗?

3个回答

3
您可能需要子类化QTableWidgetItem并实现自己的垂直文本绘制。然后在表格上使用setHorizontalHeaderItem()来指向您的新小部件的实例。

2
我已经根据上一篇答案制作了一个自定义脚本,它能够正常工作。请将以下代码复制并粘贴到一个名为 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))

希望这是值得的!


2
当我搜索这个问题的答案时,我发现了很多提示,但没有真正的答案。提示告诉我们要子类化QHeaderView并重新实现paintSection。当我尝试在PyQt4中从头开始实现paintSection,并遵循QHeaderView的源代码时,我没有成功。然而,只需旋转绘图器实例并调整所有大小提示就可以成功了。该代码仅适用于水平标题,且非常简洁:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接