关于PyQt5中QListWidget动态删除Item中的问题

在前段时间里,做了一个简单的项目,就是一个音乐下载器的客户端程序。功能比较简单,一个单一的界面,主要展示下载的音乐的一些基本信息;后台通过创建一个WebSocket,监听Web端发来的请求。在Web端可以做到添加任务,删除任务等功能。整个项目用Python实现,窗体部分,则用的是PyQt5。具体实现如下。

关于PyQt5中QListWidget动态删除Item中的问题_第1张图片
下载音乐的任务列表,采用的是QListWidget控件,每一个元素用的是自定义的Item。在删除的任务的时候,任务信息确实已经删除了,但是该位置的Item并没有消失,而是变成透明的了。此时,删除QListWidget元素的方法,我用的是removeItemWidget。具体实现如下。

    def on_task_deleted(self,id):
        if self.ui.list_musics.count() > 0:
            for index in range(self.ui.list_musics.count()):
                item = self.ui.list_musics.item(index)
                widget = self.ui.list_musics.itemWidget(item)
                if widget.get_fileid() == id:
                    self.ui.list_musics.removeItemWidget(item)
                    del item
                    del widget
                    break

这段代码在QT Creator中,用C++代码测试,并没有任何问题。但是用Python实现时,则会出现上述的问题。后来在网上苦苦搜索,才知道在Python中,需要用另外一种方式来删除元素,即通过takeItem方法来取出该元素。代码如下。

    def on_task_deleted(self,id):
        if self.ui.list_musics.count() > 0:
                for index in range(self.ui.list_musics.count()):
                    item = self.ui.list_musics.item(index)
                    widget = self.ui.list_musics.itemWidget(item)
                    if widget.get_fileid() == id:
                        self.ui.list_musics.takeItem(index)
                        del item
                        break
        print('task deleted')

经过验证,这种方式在C++和Python中都是可行的。
个人觉得QT还是挺强大的,不过还需要多注意一些细节才行,否则还会遇到不少的坑呢!

你可能感兴趣的:(QT,qt5)