更改 QTableView 中的文本方向 header

Changing text direction in QTableView header

我想在 Qt 中有一个 table 视图,其中 header 文本将沿垂直方向显示:

喜欢绿色方块还是喜欢红色方块?

您可以通过提供自己的 QHeaderView 实现来实现这一点。这是一个示例实现,它覆盖了 paintSection 垂直绘制文本的方法。

class MyHeaderView(QtWidgets.QHeaderView):

    def __init__(self, parent=None):
        super().__init__(Qt.Horizontal, parent)
        self._font = QtGui.QFont("helvetica", 15)
        self._metrics = QtGui.QFontMetrics(self._font)
        self._descent = self._metrics.descent()
        self._margin = 10

    def paintSection(self, painter, rect, index):
        data = self._get_data(index)
        painter.rotate(-90)
        painter.setFont(self._font)
        painter.drawText(- rect.height() + self._margin,
                         rect.left() + (rect.width() + self._descent) / 2, data)

    def sizeHint(self):
        return QtCore.QSize(0, self._get_text_width() + 2 * self._margin)

    def _get_text_width(self):
        return max([self._metrics.width(self._get_data(i))
                    for i in range(0, self.model().columnCount())])

    def _get_data(self, index):
        return self.model().headerData(index, self.orientation())

您可以在您的视图中使用此 class,如下所示:

headerView = MyHeaderView()
tableView.setHorizontalHeader(headerView)

它会产生以下视图:

作为旁注,我想为常规项目添加一点,您宁愿提供自己的项目委托。但是,如 Qt documentation:

中所述

Each header renders the data for each section itself, and does not rely on a delegate. As a result, calling a header's setItemDelegate() function will have no effect.