Как я могу добавить GIF с меткой в ​​QListWidgetItem? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь отобразить анимированный GIF в левой части QListWidgetItem в QListWidget с текстом метки, следующим за ним. Я читал, что QLabels содержит QMovies, которые могут запускать анимации GIF, и что мне нужно создать собственный виджет и использовать его вместо стандартного QListWidgetItem, но мне не повезло. Кто-нибудь как это сделать? Я слишком усложняю вещи?

Я написал базовый c тестовый пример ниже:

#! /usr/bin/env python

from PySide2 import QtGui, QtWidgets, QtCore


class List_Widget_Gif(QtWidgets.QWidget):
    def __init__(self, label_text, gif, parent=None):
        super(List_Widget_Gif, self).__init__(parent)
        # Layout
        horizontal_box_layout = QtWidgets.QHBoxLayout()
        # Create text label
        self.text_label = QtWidgets.QLabel()
        self.text_label.setText(label_text)
        # Create label to apply GIF to (Apparently this is the best thing to use for GIF in this case?)
        self.icon_label = QtWidgets.QLabel()
        movie = QtGui.QMovie(gif, QtCore.QByteArray(), self)
        self.icon_label.setMovie(movie)
        movie.start()
        # Add widgets to layout
        horizontal_box_layout.addWidget(self.text_label)
        horizontal_box_layout.addWidget(self.icon_label)
        #Set the layout
        self.setLayout(horizontal_box_layout)


class TestUI(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(TestUI, self).__init__(parent)

        self.setObjectName("TestUI")
        #Vars to pass
        self.my_gif = "my_cool_animation.gif"
        self.my_text = "This is awesome text"

    def setup_UI(self):
        #Create Default List Widget
        list_widget = QtWidgets.QListWidget()
        # Create Default List Widget Item
        default_list_item = QtWidgets.QListWidgetItem()
        # Create Custom List Widget with label and GIF motion
        custom_list_widget_item = List_Widget_Gif(self.my_text, self.my_gif)
        # Add default item to list widget
        list_widget.insertItem(list_widget.count(), default_list_item)
        # Set the default item to the custom one with the gif motion.
        self.ui.layerList.setItemWidget(default_list_item, custom_list_widget_item)
        #Set into UI
        self.setCentralWidget(list_widget)

        self.show()

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    test = TestUI()
    test.setup_UI()
    app.exec_()

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Сначала у вас есть опечатка (она должна выдать исключение), поэтому вы должны изменить self.ui.layerList на list_widget.

Исправление выше есть несколько возможных причин ошибки :

  • Поля должны быть удалены из макета пользовательского виджета:

    horizontal_box_layout.setContentsMargins(0, 0, 0, 0)
    
  • Не используйте относительные пути, так как они являются Из-за молчаливых ошибок лучше построить абсолютный путь, основываясь на расположении другого элемента. Если я предполагаю, что файл .gif находится в той же папке, что и файл .py, вы можете использовать эту информацию, чтобы она изменилась:

    import os
    
    CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
    
    self.my_gif = os.path.join(CURRENT_DIR, "my_cool_animation.gif")
    
0 голосов
/ 01 апреля 2020

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

def setup_UI(self):
    #Create Default List Widget
    list_widget = QtWidgets.QListWidget()
    # Create Default List Widget Item
    default_list_item = QtWidgets.QListWidgetItem()
    # Create Custom List Widget with label and GIF motion
    custom_list_widget_item = List_Widget_Gif(self.my_text, self.my_gif)
    # Add default item to list widget
    list_widget.insertItem(list_widget.count(), default_list_item)
    # Set the default item to the custom one with the gif motion.
    <b>list_widget.setItemWidget(default_list_item, custom_list_widget_item)
    default_list_item.setSizeHint(custom_list_widget_item.size())</b>
    #Set into UI
    self.setCentralWidget(list_widget)

    self.show()

Вывод

enter image description here

...