Вы можете л имитируйте размер вертикального заголовка с помощью setMaximWidth и используйте setTextElideMode, чтобы отрегулировать, как обрезается текст.
Однако, нет встроенного метода для создания вертикальной ширины заголовка, изменяемой пользователем. Таким образом, вы можете использовать resize-event для настройки ширины вертикального заголовка в процентах от общей ширины. Таким образом, изменение размера окна также изменит ширину вертикального заголовка.
Вот демонстрационный скрипт, который реализует все, что:
import sys
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self, rows, columns):
super(Window, self).__init__()
self.table = QtGui.QTableView(self)
self.table.installEventFilter(self)
self.table.verticalHeader().setTextElideMode(QtCore.Qt.ElideRight)
model = QtGui.QStandardItemModel(rows, columns, self.table)
for row in range(rows):
item = QtGui.QStandardItem('FOO_BAR_123_AB_CD_%s' % row)
model.setVerticalHeaderItem(row, item)
for column in range(columns):
item = QtGui.QStandardItem('(%d, %d)' % (row, column))
item.setTextAlignment(QtCore.Qt.AlignCenter)
model.setItem(row, column, item)
self.table.setModel(model)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.table)
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.Resize and source is self.table:
source.verticalHeader().setMaximumWidth(source.width()/4)
return super(Window, self).eventFilter(source, event)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window(15, 5)
window.setGeometry(600, 100, 400, 300)
window.show()
sys.exit(app.exec_())
UPDATE:
У меня был пойти в письменной форме пользовательского класса заголовка, который реализует пользовательское изменение размера вертикальной ширины заголовка. Это почти работает, но я не могу найти способ правильно обновить представление при перетаскивании мышью. Во всяком случае, здесь есть демо, что я до сих пор в случае, если кто может увидеть, как заставить его работать:
import sys
from PyQt4 import QtCore, QtGui
class HeaderView(QtGui.QHeaderView):
def __init__(self, table):
super(HeaderView, self).__init__(QtCore.Qt.Horizontal, table)
self.setClickable(True)
self.setHighlightSections(True)
self.setResizeMode(QtGui.QHeaderView.Interactive)
self._vheader = table.verticalHeader()
self._resizing = False
self._start_position = -1
self._start_width = -1
def mouseMoveEvent(self, event):
if self._resizing:
width = event.x() - self._start_position + self._start_width
if width > 0:
self._vheader.setFixedWidth(width)
# TODO: find a proper replacement for this
self.geometriesChanged.emit()
else:
super(HeaderView, self).mouseMoveEvent(event)
if 0 <= event.x() <= 3:
if not self.testAttribute(QtCore.Qt.WA_SetCursor):
self.setCursor(QtCore.Qt.SplitHCursor)
def mousePressEvent(self, event):
if not self._resizing and event.button() == QtCore.Qt.LeftButton:
if 0 <= event.x() <= 3:
self._start_position = event.x()
self._start_width = self._vheader.width()
self._resizing = True
return
super(HeaderView, self).mousePressEvent(event)
def mouseReleaseEvent(self, event):
self._resizing = False
super(HeaderView, self).mouseReleaseEvent(event)
class Window(QtGui.QWidget):
def __init__(self, rows, columns):
super(Window, self).__init__()
self.table = QtGui.QTableView(self)
self.table.setHorizontalHeader(HeaderView(self.table))
self.table.verticalHeader().setTextElideMode(QtCore.Qt.ElideRight)
model = QtGui.QStandardItemModel(rows, columns, self.table)
for row in range(rows):
item = QtGui.QStandardItem('FOO_BAR_123_AB_CD_%s' % row)
item.setToolTip(item.text())
model.setVerticalHeaderItem(row, item)
for column in range(columns):
item = QtGui.QStandardItem('(%d, %d)' % (row, column))
item.setTextAlignment(QtCore.Qt.AlignCenter)
model.setItem(row, column, item)
self.table.setModel(model)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.table)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window(15, 5)
window.setGeometry(600, 100, 400, 300)
window.show()
sys.exit(app.exec_())
Считаете ли вы, что используете Qt Designer? – Ronikos
Прошу прощения, я новичок в этом, вы можете уточнить? Как я могу использовать Qt Designer? – learncode
Qt Designer позволяет создавать пользовательские интерфейсы с использованием элементов перетаскивания. Это намного проще в использовании, чем ручное кодирование пользовательского интерфейса, и он очищает ваш код. Если это для большого проекта, я бы настоятельно рекомендовал рассмотреть возможность переключения на Qt Designer - хотя некоторые вещи еще должны быть закодированы явно, и по иронии судьбы это один из них. – Ronikos