Как установить ширину столбца в QTreeView?

Потерпите меня, я все еще новичок в QT, и мне трудно понять, как он работает.

Я создал и заполнил QTreeView двумя столбцами:

class AppForm(QMainWindow):
    def __init__(self, parent = None):
        super(AppForm, self).__init__(parent)
        self.model = QStandardItemModel()
        self.view = QTreeView()
        self.view.setColumnWidth(0, 800)
        self.view.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.view.setModel(self.model)
        self.setCentralWidget(self.view)

Все отлично работает, только столбцы очень узкие. Я надеялся, что setColumnWidth(0, 800) расширит первый столбец, но, похоже, это не имеет никакого эффекта. Каков правильный метод установки ширины столбцов?


person ashground    schedule 02.12.2011    source источник


Ответы (2)


Когда вы вызываете setColumnWidth, Qt выполнит эквивалент:

self.view.header().resizeSection(column, width)

Затем, когда вы вызываете setModel, Qt (среди прочего) выполнит эквивалент:

self.view.header().setModel(model)

Таким образом, ширина столбца действительно устанавливается - просто не в модели, с которой заканчивается древовидное представление.

tl;dr: установите ширину столбца после установки модели.

ИЗМЕНИТЬ

Вот простой демонстрационный скрипт на основе вашего примера:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.model = QtGui.QStandardItemModel()
        self.view = QtGui.QTreeView()
        self.view.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.view.setModel(self.model)
        self.setCentralWidget(self.view)
        parent = self.model.invisibleRootItem()
        for item in 'One Two Three Four'.split():
            parent.appendRow([
                QtGui.QStandardItem(item),
                QtGui.QStandardItem(),
                QtGui.QStandardItem(),
                ])
        self.view.setColumnWidth(0, 800)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
person ekhumoro    schedule 03.12.2011
comment
Я переместил setColumnWidth ниже setModel, но, похоже, это все еще не имеет никакого эффекта. Проблема в том, что я еще не заполнил его или не установил количество столбцов? - person ashground; 05.12.2011
comment
@эшграунд. Я добавил в свой ответ демо-скрипт, который работает для меня. - person ekhumoro; 05.12.2011
comment
Круто — я переместил setColumnWidth в другую функцию, чтобы она вызывалась после заполнения дерева. Теперь все работает, как и ожидалось. Спасибо за вашу помощь! - person ashground; 05.12.2011

self.view.resizeColumnToContents(0)

Это гарантирует, что заданная ширина и высота столбца соответствуют содержание.

person galactor88    schedule 09.06.2012
comment
Объект QTreeView не имеет атрибута resizeColumnsToContents. - person Sophus; 02.05.2017
comment
resizeColumnToContents(), а не столбцы - person Liao Zhuodi; 07.05.2017