2016-12-06 12 views
2

Я искал googled, но я не могу найти решение моей проблемы.Изменение ширины столбца столбца в QTableWidget pyqt

У меня есть QTableWidget с 2 столбцами, и я пытаюсь сделать их видимыми для всего виджета, пока не появится горизонтальная полоса прокрутки.

С изображением должно быть все понятно:

enter image description here

Я использовал Qt Designer для создания пользовательского интерфейса и код, чтобы заполнить все виджеты и другие вещи.

Итак, сначала я изменен Th2 2 колонки к содержанию с:

self.statTable.resizeColumnToContents(0) 
self.statTable.resizeColumnToContents(1) 

и она работает, но тогда виджет не изменение размера на 2-ширину столбцов.

+0

Вы когда-нибудь пробовали решения (ы), которые я дал в своем ответе? Мне было бы интересно узнать, решили ли они вашу проблему (было довольно сложно разобраться, и я не уверен, что покрыл все угловые случаи). – ekhumoro

+0

Привет, извините, что больше не отвечал .. По пути я решил, добавив эту строку после двух строк выше: '' self.statTable.setFixedWidth (self.statTable.columnWidth (0) + self.statTable.columnWidth (1)) '' – matteo

ответ

6

Это очень легкое решение в PyQt5. Все, что вам нужно сделать, это set the size adjust policy в таблице при инициализации пользовательского интерфейса, и оно будет автоматически изменяться в соответствии с содержимым. Это может быть сделано в Qt Designer, или программно, например:

self.statTable.setSizeAdjustPolicy(
     QtWidgets.QAbstractScrollArea.AdjustToContents) 

Вы тогда просто нужно сделать:

self.statTable.resizeColumnsToContents() 

всякий раз, когда таблица вновь заполняется.

Для PyQt4 все должно быть рассчитано вручную, и некоторые хаки также необходимы для получения полностью согласованных результатов. Демо-скрипт ниже работает хорошо для меня, но YMMV:

import random 
from PyQt4 import QtCore, QtGui 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.table = QtGui.QTableWidget(5, 2, self) 
     self.button = QtGui.QPushButton('Populate', self) 
     self.button.clicked.connect(self.populate) 
     layout = QtGui.QGridLayout(self) 
     layout.addWidget(self.table, 0, 0) 
     layout.addWidget(self.button, 1, 0) 
     layout.setColumnStretch(1, 1) 

    def populate(self): 
     words = 'Red Green Blue Yellow Black White Purple'.split() 
     length = random.randint(2, len(words)) 
     self.table.setRowCount(random.randint(3, 30)) 
     for column in range(self.table.columnCount()): 
      for row in range(self.table.rowCount()): 
       item = QtGui.QTableWidgetItem(' '.join(
        random.sample(words, random.randint(1, length)))) 
       self.table.setItem(row, column, item) 

     self.table.setVisible(False) 
     self.table.verticalScrollBar().setValue(0) 
     self.table.resizeColumnsToContents() 
     self.table.setVisible(True) 
     self.setTableWidth() 

    def setTableWidth(self): 
     width = self.table.verticalHeader().width() 
     width += self.table.horizontalHeader().length() 
     if self.table.verticalScrollBar().isVisible(): 
      width += self.table.verticalScrollBar().width() 
     width += self.table.frameWidth() * 2 
     self.table.setFixedWidth(width) 

    def resizeEvent(self, event): 
     self.setTableWidth() 
     super(Window, self).resizeEvent(event) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(700, 150, 800, 400) 
    window.show() 
    sys.exit(app.exec_()) 
+0

Я использую pyQt5, и где я могу найти это на дизайнере QT? потому что я его нигде не вижу, и ввод кода не сработал! @ekhumoro –

+2

@MohammedAminAIMEUR. Он находится в редакторе свойств (раздел 'QAbstractScrollArea'). – ekhumoro