从PyQt5 5.11.3升级到5.12时QTableWidgetItem格式不正确

时间:2019-04-17 16:21:32

标签: python qt pyqt pyqt5

我最近重新开始了我的PyQt5项目。在我离开该项目的位置与现在之间,Qt 5.12发布了,它似乎导致QTableWidget不正确地格式化了“ Description”列,并且我无法弄清它为什么发生或如何解决。

这是我的主屏幕之前的样子(PyQt5 == 5.11.3):

original screen - correct formatting

这是现在的样子(PyQt5 == 5.12及更高版本)。 “描述”列似乎显示了超出其容纳范围的更多文本,从而导致文本溢出到单元格的顶部和底部:

new screen - description column formatted incorrectly

检查了Qt版本历史记录后,我注意到对itemviews和QTableWidget进行的一些更改可能会导致此问题,但是它们似乎都是错误修复,而且我认为我并没有为修复该错误而做得太过分破坏我的代码。 this doc

这里有一些示例代码演示了我的问题。我使用PyQt5版本5.11.3和5.12.1测试了此代码,似乎发生了相同的事情。如果您需要上下文,我的整个项目是https://code.qt.io/cgit/qt/qtbase.git/tree/dist/changes-5.12.0/?h=v5.12.0#n314

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

0 个答案:

没有答案