Vous pouvez l imitez la taille de l'en-tête vertical en utilisant setMaximWidth et utilisez setTextElideMode pour ajuster la taille du texte.
Cependant, il n'existe pas de méthode intégrée permettant de redimensionner la largeur de l'en-tête verticale par l'utilisateur. Donc, en tant que solution de rechange, vous pouvez utiliser l'événement resize pour ajuster la largeur de l'en-tête vertical à un pourcentage de la largeur totale. De cette façon, le redimensionnement de la fenêtre modifiera également la largeur de l'en-tête vertical.
Voici un script de démonstration qui implémente tout cela:
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_())
MISE À JOUR:
J'ai eu un aller à écrire une classe d'en-tête personnalisé qui implémente le redimensionnement de l'utilisateur de la largeur d'en-tête verticale. Il fonctionne presque, mais je ne trouve pas un moyen de mettre à jour la vue correctement tout en faisant glisser avec la souris. Quoi qu'il en soit, voici une démo de ce que j'ai jusqu'à présent au cas où quelqu'un peut voir comment faire fonctionner:
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_())
Avez-vous envisagé d'utiliser Qt Designer? – Ronikos
Je suis désolé, je suis nouveau à ce que vous pouvez élaborer? Comment puis-je utiliser Qt Designer? – learncode
Qt Designer vous permet de créer des interfaces utilisateur en utilisant les éléments glisser-déposer. Il est beaucoup plus facile à utiliser que de coder manuellement l'interface utilisateur et il nettoie votre code. Si cela est un grand projet, je recommande vivement envisager de passer à Qt Designer - même si certaines choses doivent encore être codées explicitement, et ironiquement c'est l'un d'entre eux – Ronikos