Неправильное форматирование QTableWidgetItem при обновлении с PyQt5 5.11.3 до 5.12 - PullRequest
0 голосов
/ 17 апреля 2019

Я недавно возобновил работу над моим проектом PyQt5. Между тем, когда я оставил проект выключенным и сейчас, был выпущен Qt 5.12, и, похоже, он заставил мой QTableWidget неправильно отформатировать мой столбец «Описание», и я не могу понять, почему это происходит или как это исправить.

Вот как выглядел мой главный экран раньше (PyQt5 == 5.11.3):

original screen - correct formatting

Вот как это выглядит сейчас (PyQt5 == 5.12 и выше). Кажется, что столбец описания отображает больше текста, чем может вместить, что приводит к переполнению текста вверху и внизу ячейки:

new screen - description column formatted incorrectly

Изучив историю версий 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

Вывод на 5.12.1

5.12.1 output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...