在QTableView标题中更改文本方向

时间:2015-06-04 00:26:06

标签: qt qtableview qtreeview

我想在Qt中有一个表格视图,标题文本将在垂直方向:

like this table in excel

要么像绿色方块一样,要么像红色一样?

1 个答案:

答案 0 :(得分:2)

您可以通过提供自己的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())

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

headerView = MyHeaderView()
tableView.setHorizontalHeader(headerView)

它将产生以下视图:

enter image description here

作为附注,我想补充一点,对于常规项目,您宁愿提供自己的项目委托。但是,正如Qt documentation

中所述
  

每个标题呈现每个部分本身的数据,并且确实如此   不依赖代表。结果,调用标题   setItemDelegate()函数将无效。