欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-22 19:21:09
...

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

关于PyQt5中QListWidget动态删除Item中的问题
下载音乐的任务列表,采用的是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