python PyQt QTableView resizeRowsToContents在初始化时未完全调整大小

hfyxw5xn  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(266)

我这里有一个QTableView小部件的最小示例,它显示了一个长字符串,我希望在启动应用程序时对该字符串进行换行。

from PyQt6.QtWidgets import (
    QMainWindow,
    QTableView,
    QHeaderView,
    QApplication,
)
from PyQt6.QtCore import (
    Qt, 
    QEvent,
    QAbstractTableModel,
    QSize,
    QEvent
)
import sys

text = """A long string which needs word wrapping to fully display. A long string which needs word wrapping to fully display. A long string which needs word wrapping to fully display."""

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.table = QTableView()
        header = self.table.horizontalHeader()
        header.setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
        
        self.table.horizontalHeader().sectionResized.connect(self.table.resizeRowsToContents)
        
        self.model = TableModel([[text] for i in range(50)])
        self.table.setModel(self.model)
        self.setCentralWidget(self.table)
        
        self.table.resizeRowsToContents()

    def changeEvent(self, event):
        if event.type() == QEvent.Type.WindowStateChange: 
            self.table.resizeRowsToContents()

        return super(MainWindow, self).changeEvent(event)

class TableModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        self._data = data

    def data(self, index, role):
        if role == Qt.ItemDataRole.DisplayRole:
            return self._data[index.row()][index.column()]

    def rowCount(self, index):
        return len(self._data)

    def columnCount(self, index):
        return len(self._data[0])

app = QApplication(sys.argv)
app.lastWindowClosed.connect(app.quit)
w = MainWindow()
w.show()
app.exec()

当我运行上面的代码时,我得到了这个

但是当我手动调整窗口大小时,我得到了我所期望的结果,

我想在__init__方法中调用self.table.resizeRowsToContents()就可以了。另一个问题是,为什么resizeRowsToContents()__init__方法中不起作用,而self.table.horizontalHeader().sectionResized.connect(self.table.resizeRowsToContents)在调整大小时起作用呢?

t3irkdon

t3irkdon1#

为什么当resizeRowsToContents()在init方法中不起作用时,self. table.horizontalHeader(). sectionResized.connect(self.table.resizeRowsToContents)在调整大小时起作用?
因为窗口尚未呈现,所以QTableView还不知道文本的大小以便调整行的大小。
当应用程序启动时,我如何获得第二个图像作为状态?我认为在init方法中调用self.table.resizeRowsToContents()可以做到这一点。
你可以将表格的填充从init方法中分离出来,或者延迟它,直到你的小部件被呈现出来,最好是在类本身里面,但是你可以这样做:

# ...
app = QApplication(sys.argv)
app.lastWindowClosed.connect(app.quit)
w = MainWindow()
w.show()
w.table.resizeRowsToContents() # I just added this line
app.exec()

相关问题