如何将带有标签的 GIF 添加到 QListWidgetItem?
How can I add a GIF with a label to a QListWidgetItem?
我正在尝试在 QListWidget 中的 QListWidgetItem 的左侧显示动画 GIF,标签文本如下。我一直在读 QLabels 持有 QMovies,它可以 运行 GIF 动画,我需要创建一个自定义小部件并使用它而不是默认的 QListWidgetItem,但我没有运气。有没有人如何做到这一点?我是不是把事情搞得太复杂了?
我在下面写了一个基本的测试用例:
#! /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_()
首先你有一个错字(它应该抛出异常)所以你必须将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")
有效,您只需将默认项目的大小调整为自定义项目的大小。
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.
list_widget.setItemWidget(default_list_item, custom_list_widget_item)
default_list_item.setSizeHint(custom_list_widget_item.size())
#Set into UI
self.setCentralWidget(list_widget)
self.show()
输出
我正在尝试在 QListWidget 中的 QListWidgetItem 的左侧显示动画 GIF,标签文本如下。我一直在读 QLabels 持有 QMovies,它可以 运行 GIF 动画,我需要创建一个自定义小部件并使用它而不是默认的 QListWidgetItem,但我没有运气。有没有人如何做到这一点?我是不是把事情搞得太复杂了?
我在下面写了一个基本的测试用例:
#! /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_()
首先你有一个错字(它应该抛出异常)所以你必须将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")
有效,您只需将默认项目的大小调整为自定义项目的大小。
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. list_widget.setItemWidget(default_list_item, custom_list_widget_item) default_list_item.setSizeHint(custom_list_widget_item.size()) #Set into UI self.setCentralWidget(list_widget) self.show()
输出