Я пишу 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](https://i.stack.imgur.com/mALG3.png)
Эти элементы добавляются в представление каждую секунду. И вы можете заметить, что высота строки время от времени меняется:
![QListView on Linux](https://i.stack.imgur.com/u69Um.gif)
Однако такое поведение существует только на Linux. На Windows тот же сценарий работает нормально:
![QListView on Windows](https://i.stack.imgur.com/3FCF7.gif)
Я также обнаружил, что .setUniformItemSizes(False)
- это обходной путь, но это приводит к плохой производительности, когда Есть много элементов, которые нужно добавить в представление.
Есть ли способ установить фиксированную высоту строки?