PyQt 如何使用 QTreeView 设置表头标签

2 投票
1 回答
7102 浏览
提问于 2025-04-18 02:33

在定制 QTreeView 这个小部件时,我遇到了一个问题。这个小部件里的每个项目都是由不同的小部件组成的,比如 combo box(下拉框)、line edit(文本框)等等,它们都是排成一行的。但是我发现我无法自定义表头的标签(也就是列的名称)。如果是用 QTreeWidget() 的话,可以通过 setHeaderLabels([]) 来设置...

import sys, os
from PyQt4 import QtCore,QtGui

class TreeWidgetsItems(QtGui.QTreeView):
    def __init__(self):
        super(TreeWidgetsItems, self).__init__()

        self.itemModel = QtGui.QStandardItemModel(0, 2)
        self.setModel(self.itemModel)

        item0 = QtGui.QStandardItem('Item 0')
        self.itemModel.setItem(0, 0, item0)
        item0.setCheckable(True)

        item1 = QtGui.QStandardItem('Item 1')
        self.itemModel.setItem(0, 1, item1)

        item2 = QtGui.QStandardItem('Item 2')
        self.itemModel.setItem(0, 2, item2)

        item3 = QtGui.QStandardItem('Item 3')
        self.itemModel.setItem(0, 3, item3)

        lineedit1 = QtGui.QLineEdit()
        itemIndex1 = self.itemModel.index(0, 1, QtCore.QModelIndex())
        self.setIndexWidget(itemIndex1, lineedit1)

        self.combo2 = QtGui.QComboBox() 
        itemIndex2 = self.itemModel.index(0, 2, QtCore.QModelIndex())
        self.setIndexWidget(itemIndex2, self.combo2)
        for i in range(5):
            self.combo2.addItem('Item'+str(i))

        self.dateEdit = QtGui.QDateEdit()
        self.dateEdit.setDateTime(QtCore.QDateTime.currentDateTime())
        self.dateEdit.setMaximumDate(QtCore.QDate(7999, 12, 28))
        self.dateEdit.setMaximumTime(QtCore.QTime(23, 59, 59))
        self.dateEdit.setCalendarPopup(True)

        itemIndex3 = self.itemModel.index(0, 3, QtCore.QModelIndex())
        self.setIndexWidget(itemIndex3, self.dateEdit)

        self.setColumnWidth(0, 60)
        for i in range(1, 7):
            self.setColumnWidth(i, 200)

        self.show()


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = TreeWidgetsItems()
    window.resize(960, 240)
    sys.exit(app.exec_())

1 个回答

3

把你的 for i in range(1, 7): 循环改成这样:

for i in range(1, 7):
    self.setColumnWidth(i, 200)
    self.itemModel.setHeaderData(i, QtCore.Qt.Horizontal, 'Column {}'.format(i))
self.itemModel.setHeaderData(0, QtCore.Qt.Horizontal, 'Column {}'.format("0"))

最后那一行应该放在你的 for 循环外面。它是在设置你的第一个列标题(从0开始的索引)。其他的标题会在你从1到7的循环中逐个设置。

输出的效果是这样的:

Headers are set


撰写回答