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