Высота строки QListView изменяется, когда строка содержит символы CJK. Есть ли способ установить фиксированную высоту строки? - PullRequest
0 голосов
/ 26 апреля 2020

Я пишу QListView, который отображает строковые элементы. Для оптимизированной производительности я setUniformItemSizes(True). Но с этим установленным свойством высота строки представления изменяется, когда вновь добавленные элементы содержат символы CJK.

Это минимальный воспроизводимый пример в PyQt:

#!/usr/bin/env python

from PyQt5.QtWidgets import QApplication, QListView
from PyQt5.QtCore import (
    Qt, QAbstractListModel, QTimer, QModelIndex
)


class Model(QAbstractListModel):

    def __init__(self):
        super().__init__()
        self.items = []
        self.timer = QTimer()
        self.timer.timeout.connect(self.populate)
        self.timer.start(1000)

    def rowCount(self, parent):
        return len(self.items)

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            if index.row() % 3 == 0:
                return '汉字'
            else:
                return 'foo bar'

    def populate(self):
        items = '1 2 3 4 5'.split()
        self.beginInsertRows(QModelIndex(), len(self.items), len(self.items) + len(items) - 1)
        self.items.extend(items)
        self.endInsertRows()


class main():

    app = QApplication([])
    model = Model()
    view = QListView()
    view.setModel(model)
    view.setWindowFlag(Qt.Dialog)
    view.setUniformItemSizes(True)
    view.move(30, 30)
    view.show()
    app.exec()


if __name__ == '__main__':
    main()

Сценарий должен отображать QListView со строками текста, которые читают «foo bar» или «汉字»:

QListView with rows of text

Эти элементы добавляются в представление каждую секунду. И вы можете заметить, что высота строки время от времени меняется:

QListView on Linux

Однако такое поведение существует только на Linux. На Windows тот же сценарий работает нормально:

QListView on Windows

Я также обнаружил, что .setUniformItemSizes(False) - это обходной путь, но это приводит к плохой производительности, когда Есть много элементов, которые нужно добавить в представление.

Есть ли способ установить фиксированную высоту строки?

...