Я пишу приложение, которое использует пользовательский QWidget вместо обычных listitems или делегатов в PyQt. Я выполнил ответ в Render QWidget in paint() method of QWidgetDelegate for a QListView - среди прочего - для реализации QTableModel с пользовательскими виджетами. Полученный образец кода находится в нижней части этого вопроса. Есть некоторые проблемы с реализацией, которые я не знаю, как решить:Плавная ленивая загрузка и выгрузка пользовательского IndexWidget в QListView
- Разгрузка предметов, когда они не отображаются. Я планирую создать свое приложение для списка, в котором будут тысячи записей, и я не могу хранить это много виджетов в памяти.
- Загрузка элементов, которые еще не отображаются или, по крайней мере, загружают их асинхронно. Виджеты требуют момента для рендеринга, а примерный код ниже имеет некоторое очевидное отставание при прокрутке списка.
- При прокрутке списка в приведенной ниже реализации каждая загруженная кнопка при загрузке появляется в верхнем левом углу QListView в течение секунды, прежде чем подпрыгивать в позиции. Как этого можно избежать?
-
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt
class TestListModel(QtCore.QAbstractListModel):
def __init__(self, parent=None):
QtCore.QAbstractListModel.__init__(self, parent)
self.list = parent
def rowCount(self, index):
return 1000
def data(self, index, role):
if role == Qt.DisplayRole:
if not self.list.indexWidget(index):
button = QtGui.QPushButton("This is item #%s" % index.row())
self.list.setIndexWidget(index, button)
return QtCore.QVariant()
if role == Qt.SizeHintRole:
return QtCore.QSize(100, 50)
def columnCount(self, index):
pass
def main():
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
list = QtGui.QListView()
model = TestListModel(list)
list.setModel(model)
list.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
layout = QtGui.QVBoxLayout(window)
layout.addWidget(list)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Для решения вопросов 3, вы пробовали давая кнопку нажать родитель во время создания? А именно, QListView. – Lorenz03Tx