在PyQt4的QTableWidget中,将最小列宽设置为标题宽度

8
我正在使用PyQt4中的QTableWidget组件,但是我似乎无法根据各自的标题长度正确调整列的大小。
这是表格布局应该看起来的样子(不包括竖线,显然):
Index | Long_Header | Longer_Header
1     | 102402      | 100
2     | 123123      | 2
3     | 454689      | 18

我正在处理的代码大致如下:
import sys
from PyQt4.QtCore import QStringList, QString
from PyQt4.QtGui  import QApplication, QMainWindow, QSizePolicy
from PyQt4.QtGui  import QTableWidget, QTableWidgetItem

def createTable():
    table = QTableWidget(5, 3)
    table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

    headers = QStringList()
    headers.append(QString("Index"))
    headers.append(QString("Long_Header"))
    headers.append(QString("Longer_Header"))

    table.setHorizontalHeaderLabels(headers)
    table.horizontalHeader().setStretchLastSection(True)

    # ignore crappy names -- this is just an example :)
    cell1 = QTableWidgetItem(QString("1"))
    cell2 = QTableWidgetItem(QString("102402"))
    cell3 = QTableWidgetItem(QString("100"))

    cell4 = QTableWidgetItem(QString("2"))
    cell5 = QTableWidgetItem(QString("123123"))
    cell6 = QTableWidgetItem(QString("2"))

    cell7 = QTableWidgetItem(QString("3"))
    cell8 = QTableWidgetItem(QString("454689"))
    cell9 = QTableWidgetItem(QString("18"))

    table.setItem(0, 0, cell1)
    table.setItem(0, 1, cell2)
    table.setItem(0, 2, cell3)
    table.setItem(1, 0, cell4)
    table.setItem(1, 1, cell5)
    table.setItem(1, 2, cell6)
    table.setItem(2, 0, cell7)
    table.setItem(2, 1, cell8)
    table.setItem(2, 2, cell9)

    return table

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainW = QMainWindow()

    mainW.setMinimumWidth(300)
    mainW.setCentralWidget(createTable())

    mainW.show()

    app.exec_()

当应用程序执行时,第一列非常宽,而其他列有些压缩。有没有办法强制表格根据标题宽度调整大小,而不是数据本身?更好的方法是强制每个列宽度为数据和标题值的最大宽度吗?
更新:我尝试在表格上调用resizeColumnsToContents(),但视图变得非常混乱。
更新2:只要在所有单元格和标题插入到表格之后才调用resizeColumnsToContents(),它就可以正常工作。
1个回答

9
table.resizeColumnsToContents()

这个特定的例子应该可以解决问题。如果您还没有这样做,请确保收藏PyQt文档(在寻找特定函数时非常方便)。

谢谢回复,但我已经尝试过resizeColumnsToContents()。它会将列调整为数据大小,而标题变得不可读。我有文档(我经常使用它),但似乎找不到解决这个令人烦恼的问题的方法。 - bedwyr
@bedwyr:也许问题是在其他地方触发的(也许是从继承的.ui(设计师)文件中的属性?)。我无法在这里重现问题(PyQt 4.5.4 iirc,Mac)。这是您的示例代码(添加了一个简单的table.resizeColumnsToContents()):http://img210.imageshack.us/img210/9968/screenshot20100704at225.png - ChristopheD
我所有的设计都是手工设计的(没有使用Qt Designer),因此很可能是我的问题:^)我在Linux上使用的是4.7.2版本,因此Linux端可能有所不同,尽管我不太确定。问题很可能出在我的一方面。我会继续查找 - 谢谢! - bedwyr
1
我搞定了。resizeColumnsToContents() 函数完美运行,但是我需要在设置表头标签之后调用它 :^) 感谢您的帮助! - bedwyr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接