Существуют различные решения для вашей проблемы.Самый простой и эффективный способ - использовать общий делегат элемента для столбца, для которого требуется «фиксированный» размер, а затем установить для его 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 * () всегда будет создавать проблемы, когда вы устанавливаете более одного делегата в представлении.