Как мне получить обратный вызов, чтобы QListWidgetItem стал видимым в PyQT5?Python

Программы на Python
Ответить
Anonymous
 Как мне получить обратный вызов, чтобы QListWidgetItem стал видимым в PyQT5?

Сообщение Anonymous »

Я создал простой MediaBrowser, используя QListWidget в PyQT5:

Код: Выделить всё

class MediaBrowser(QListWidget):

def __init__(self, database: Database, viewtab, dir_path):
QListWidget.__init__(self)
self.log = logging.getLogger('mediahug')
self.database = database
self.viewtab = viewtab

self.setLayoutMode(QListView.Batched)
self.setBatchSize(10000)
self.setUniformItemSizes(True)

self.current_directory = dir_path
# self.current_file_widgets = []
self.thumb_loader_thread = None
self.itemSelectionChanged.connect(self.selection_change)

# Should theoretically speed things up but it does not
# self.setSizeAdjustPolicy(QListWidget.AdjustToContents)

self.setSelectionMode(QAbstractItemView.SingleSelection)
self.setViewMode(QListWidget.IconMode)
self.setResizeMode(QListWidget.Adjust)
self.setIconSize(QSize(THUMB_WIDTH, THUMB_HEIGHT))
self.load_files(dir_path)

...
...

def all_files(self):
return self.findItems('*', Qt.MatchWildcard)

def load_files(self, dir_path):
if self.thumb_loader_thread and self.thumb_loader_thread.isRunning():
self.log.info('Killing Previous Thumbnail Loading Thread')
self.thumb_loader_thread.requestInterruption()
self.thumb_loader_thread.wait(sys.maxsize)
self.log.info('Previous Thumbnail Thread Done')

self.clear()
# Load New File widgets
onlyfiles = [f for f in listdir(dir_path) if isfile(join(dir_path, f))]
for f in onlyfiles:
vid = join(dir_path, f)
self.log.debug(f"Creating File/Thumb Widget {vid}")
self.addItem(ThumbWidget(vid, self.database))

self.thumb_loader_thread = ThumbLoaderThread(self.all_files(), dir_path)
self.thumb_loader_thread.start()
MediaBrowser, который является QListWidget, при запуске добавляет несколько элементов ThumbWidget (которые являются объектами QListWidgetItem):

Код: Выделить всё

class ThumbWidget(QListWidgetItem):

def __init__(self, filename: str, database):
QListWidgetItem.__init__(self)
self.filename = filename
self.database = database
self.setText(basename(self.filename))
standard_file_icon = QWidget().style().standardIcon(QStyle.SP_FileIcon)
self.setIcon(standard_file_icon)
self.setSizeHint(QSize(THUMB_WIDTH, THUMB_HEIGHT + FILENAME_MARGIN))

def __str__(self):
return f'Thumbnail for {self.filename}'

def load_thumb(self):
metadata = self.database.file_metadata(self.filename)
img_thumb = metadata['thumb']
if img_thumb:
img = QPixmap()
img.loadFromData(img_thumb, 'JPEG')
self.setIcon(QIcon(img))
При запуске это занимает много времени. Я хотел бы загружать миниатюру элемента только тогда, когда он прокручивается в поле зрения. В другом месте моего кода MediaBrowser находится внутри QScrollArea.

Код: Выделить всё

        self.media_scroller = QScrollArea()
self.media_scroller.setWidget(self._media_browser)
self.media_scroller.setWidgetResizable(True)
Есть ли какой-нибудь способ заставить события знать, когда конкретный QWidgetItem в данный момент прокручивается или выходит из поля зрения? Таким образом, я могу загружать и выгружать миниатюры, что позволяет сократить время запуска.
Полный код этого проекта можно найти здесь:
https. ://gitlab.com/djsumdog/mediahug/-/tree/master/mediahug/gui/viewtab

Подробнее здесь: https://stackoverflow.com/questions/790 ... e-in-pyqt5
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»