2016-12-22 7 views
4

enter image description hereИзменить размер вертикального заголовка QTableView в PyQt4?

мне нужно уменьшить размер первого столбца (столбец с вертикальными заголовками)

Как я могу изменить размер вертикальный заголовок QTableView в PyQt4?

У меня очень большие заголовки и небольшой блок графического интерфейса, чтобы показать этот стол, пожалуйста, помогите мне!

Я могу изменить размер всех столбцов, но не смог определить размер вертикальных заголовков?

Я пробовал много вещей, как:

self.tableView.setColumnWidth(0, 30) // only able to change the data columns in table not headers 

self.tableView.verticalHeader().setResizeMode(QHeaderView.Interactive) //Able to change the height of headers but not width of them 

Я хочу сделать заголовки, которые могут быть изменены пользователем и не имеет зависимостей от других параметров проекта, как размер окна, размер другие столбцы ....

Может кто-нибудь мне помочь?

+0

Считаете ли вы, что используете Qt Designer? – Ronikos

+0

Прошу прощения, я новичок в этом, вы можете уточнить? Как я могу использовать Qt Designer? – learncode

+0

Qt Designer позволяет создавать пользовательские интерфейсы с использованием элементов перетаскивания. Это намного проще в использовании, чем ручное кодирование пользовательского интерфейса, и он очищает ваш код. Если это для большого проекта, я бы настоятельно рекомендовал рассмотреть возможность переключения на Qt Designer - хотя некоторые вещи еще должны быть закодированы явно, и по иронии судьбы это один из них. – Ronikos

ответ

3

Вы можете л имитируйте размер вертикального заголовка с помощью 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_()) 
+0

спасибо за ответ! Я думал об этой альтернативе о наличии фиксированной maxWidth, но это не совсем то, что я искал. Таким образом, вы говорите, что пользователь не может изменять размер этого заголовка по своей воле. – learncode

+0

Это большое дело, потому что у некоторых заголовков есть только один символ, а некоторые файлы имеют около 1000 символов, поэтому я не хочу фиксировать размер с maxWidth, – learncode

+1

@VenkataNarsiReddyVaddula. Максимальная ширина не фиксирована. Он изменяется в случае изменения размера при изменении размера окна. Я использовал процент ширины таблицы, но вы можете использовать любой способ, который вы хотите установить. – ekhumoro

0

PyQt имеет небольшую документацию, но this page предоставляет всю возможную информацию о классе QTableView.

Я не уверен, что ваша конкретная проблема, однако вы можете попробовать:

self.tableView.horizontalHeader().setSectionResizeMode(3) 

The documentation of .setSectionResize()

В качестве альтернативы, если вы хотите, чтобы изменить размер каждого заголовка к размеру набора, попробуйте:

self.tableView.horizontalHeader().resizeSection(0, pixelSize1) 
self.tableView.horizontalHeader().resizeSection(1, pixelSize2) 
self.tableView.horizontalHeader().resizeSection(2, pixelSize3) 
... 

The documentation of .resizeSection()

+0

. Я загрузил изображение, которое поможет вам лучше понять проблему. Также QHeaderView не имеет setSectionResizeMode(), я попробовал setResizeMode() – learncode

1

решение Ekhumoro работает почти идеально. Изменчивое поведение перетаскивания, наблюдаемое во время изменения размера, связано с изменением пространства координат при изменении размера.

Чтобы исправить это изменчивое поведение и иметь плавное изменение размера, вы должны использовать глобальное пространство координат, а не локальную координату для headerView. Для этого просто заменить event.x() с event.globalX()

 #width = event.x() - self._start_position + self._start_width 
     width = event.globalX() - self._start_position + self._start_width 

      #self._start_position = event.x() 
      self._start_position = event.globalX() 

Я также изменить geometried Измененный сигнал, который будет emited от вертикального заголовка, а не по горизонтали заголовка. Поскольку это был вертикальный заголовок, который фактически изменил размер. Однако в моем тестовом случае я не мог сказать, что это важно, но концептуально это кажется правильным.

  #self.geometriesChanged.emit() 
      self._vheader.geometriesChanged.emit() 
Смежные вопросы