Я недавно возобновил работу над моим проектом PyQt5. Между тем, когда я оставил проект выключенным и сейчас, был выпущен Qt 5.12, и, похоже, он заставил мой QTableWidget неправильно отформатировать мой столбец «Описание», и я не могу понять, почему это происходит или как это исправить.
Вот как выглядел мой главный экран раньше (PyQt5 == 5.11.3):
![original screen - correct formatting](https://i.imgur.com/neWXHVW.png)
Вот как это выглядит сейчас (PyQt5 == 5.12 и выше). Кажется, что столбец описания отображает больше текста, чем может вместить, что приводит к переполнению текста вверху и внизу ячейки:
![new screen - description column formatted incorrectly](https://i.imgur.com/4lnjoTM.png)
Изучив историю версий Qt, я заметил несколько изменений в представлениях элементов и QTableWidget, которые могут быть причиной этой проблемы, но все они кажутся исправлениями, и я не думаю, что сделал что-то слишком вздорное для исправления сломай мой код https://code.qt.io/cgit/qt/qtbase.git/tree/dist/changes-5.12.0/?h=v5.12.0#n314
Вот пример кода, демонстрирующий мою проблему. Я протестировал этот код с PyQt5 версий 5.11.3 и 5.12.1, и похоже, что происходит то же самое. Весь мой проект здесь , если вам нужен контекст.
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
app = QApplication(sys.argv)
screen = app.primaryScreen()
SCREEN_H, SCREEN_W = screen.availableGeometry().height(), screen.availableGeometry().width()
DEFAULT_HEIGHT_RATIO = 0.7
MAIN_HEIGHT_RATIO = 0.8
MAIN_WIDTH_RATIO = 0.9
TABLE_MAX_RESIZE_WIDTH = 1200
COLUMN_LONG = 300
COLUMN_MED = 200
COLUMN_SHORT = 100
COLUMN_TINY = 70
TABLE_MAX_ROW_HEIGHT = 50
TOOLTIP_WIDTH = 150
class TestWindow(QMainWindow):
def __init__(self):
super().__init__()
headers = ["Name","Level","Class","Description"]
table = QTableWidget(3, len(headers))
table.setHorizontalHeaderLabels(headers)
table.setSelectionBehavior(QAbstractItemView.SelectRows)
table.setSelectionMode(QAbstractItemView.NoSelection)
table.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
table.setWordWrap(True)
data = [
["a",1,"abc","this is a test description padding padding Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Adipiscing elit ut aliquam purus sit amet. Elem"],
["a",1,"abc","this is a test description padding padding Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Adipiscing elit ut aliquam purus sit amet. Elem"],
["a",1,"abc","this is a test description padding padding Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Adipiscing elit ut aliquam purus sit amet. Elem"],
]
for x, row in enumerate(data):
for y, cell in enumerate(row):
item = QTableWidgetItem(str(cell))
table.setItem(x,y,item)
self.table = table
self.resizeTableCols()
self.resizeTableRows()
self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding)
self.setCentralWidget(table)
self.show()
def layoutCleanup(self):
self.resizeTableRows()
self.resize(min(self.table.width() + COLUMN_LONG, SCREEN_W*MAIN_HEIGHT_RATIO), min(SCREEN_H*DEFAULT_HEIGHT_RATIO, SCREEN_H*MAIN_WIDTH_RATIO))
def resizeTableCols(self):
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
self.table.horizontalHeader().setSectionResizeMode(self.table.columnCount() - 1, QHeaderView.Stretch)
def resizeTableRows(self):
self.table.resizeRowsToContents()
for row in range(self.table.rowCount()):
if self.table.rowHeight(row) >= TABLE_MAX_ROW_HEIGHT:
self.table.setRowHeight(row, TABLE_MAX_ROW_HEIGHT)
def main():
win = TestWindow()
win.layoutCleanup()
sys.exit(app.exec_())
if __name__ == "__main__": main()
Вывод на 5.11.3
![5.11.3 output](https://i.imgur.com/JOUZ8zw.png)
Вывод на 5.12.1
![5.12.1 output](https://i.imgur.com/MdzqaoT.png)