Почему ширина столбцов в tableView не меняется - PullRequest
0 голосов
/ 17 июня 2019

Я пишу первую модель.

Я не могу изменить ширину заголовков столбцов, но высота меняется!

Ширина заголовка не работает.Высота заголовка работает.

enter image description here

минимальный воспроизводимый пример

import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets


class QModelTable(QtCore.QAbstractTableModel):

    def __init__(self, data_list):
        super().__init__()
        self.data_list = data_list

    def columnCount(self, parent=None, *args, **kwargs):
        return len(self.data_list[0])

    def rowCount(self, parent=None, *args, **kwargs):
        return len(self.data_list)

    def data(self, index, role=None):
        if not index.isValid():
            return None

        row = index.row()
        col = index.column()

        if role == QtCore.Qt.DisplayRole:
            return self.data_list[row][col]

    def headerData(self, section, orientation, role=None):

        if role == QtCore.Qt.SizeHintRole:
            if orientation == QtCore.Qt.Horizontal:
                # I want a column width of 40px
                return QtCore.QSize(40, 40)  # The problem is here


test_data = (
    ('row 1 col 1', 'row 1 col 2', 'row 1 col 3'),
    ('row 2 col 1', 'row 2 col 2', 'row 2 col 3'),
    ('row 3 col 1', 'row 3 col 2', 'row 3 col 3'),
)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    model = QModelTable(test_data)
    table = QtWidgets.QTableView()
    table.setModel(model)

    table.show()

    sys.exit(app.exec_())

Вот что получаетсяоб этом: enter image description here

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Если вы посмотрите на эту проблему и ее решение, вы можете по-другому взглянуть на нее, возможно, вы сможете получить некоторые подсказки о том, что делать, что вы, возможно, не рассматривали

Как автоматически растягивать столбцы QTableView и сохранять их регулируемыми

1 голос
/ 18 июня 2019

Существуют различные решения для вашей проблемы.Самый простой и эффективный способ - использовать общий делегат элемента для столбца, для которого требуется «фиксированный» размер, а затем установить для его resizeMode значение ResizeToContents.

class FixedColumnDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, defaultWidth=None, parent=None):
        QtWidgets.QStyledItemDelegate.__init__(self, parent)
        self.defaultWidth = defaultWidth

    def sizeHint(self, option, index):
        hint = QtWidgets.QStyledItemDelegate.sizeHint(self, option, index)
        if self.defaultWidth is not None:
            hint.setWidth(self.defaultWidth)
        return hint

    [...]

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    model = QModelTable(test_data)
    table = QtWidgets.QTableView()
    table.setModel(model)
    table.setItemDelegateForColumn(2, FixedColumnDelegate(40, table))
    table.horizontalHeader().setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)

    table.show()

    sys.exit(app.exec_())

Просто запомните, что по крайней мередля PyQt, если вам требуется больше, чем делегат элемента для представления элемента, вам всегда нужно установить его родительский элемент или убедиться, что экземпляр делегата остается постоянным как атрибут объекта (независимо от того, что это за объект, просто убедитесь, что он не 'не попадет на сборщик мусора в конце объявления основного класса или всякий раз, когда вы его объявляете), в противном случае вы столкнетесь с неожиданным и, возможно, трудным для отладки поведением: установка делегатов элемента «на лету» (как в случае объявления экземпляра вфункция setItemDelegate * () всегда будет создавать проблемы, когда вы устанавливаете более одного делегата в представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...