PyQt 5 应用程序因未知原因崩溃和/或故障

问题描述 投票:0回答:1

所以,我有一个程序,其中有一个充满项目的列表小部件。双击(激活)该项目时,会出现一条消息,然后该项目消失,如果我单击“加载!”应用程序上的按钮,该项目不应再次出现。然而,只有两个问题。而“加载!”按钮似乎总是工作正常,激活一个项目有时会导致 GUI 崩溃,如果没有崩溃,由于某种原因,它有时会依次激活两个项目。当它没有崩溃并且没有同时激活两个项目时,它就会完全按照预期工作。当 GUI 崩溃时,看不到回溯。

列表项与按钮的连接:

def on_item_activated(item):
    setting(item, listWidget, feed, dict1, dictQ)

listWidget.itemActivated.connect(on_item_activated)
button = QPushButton("Load!")

def viewer():
    viewing(feed, listWidget, dict1)
btnconnect = button.clicked.connect(viewer)

点击项目/按钮会做什么:

def moveToQ(entryDel, listWidget, dict1, dictQ):
    dictQ[entryDel] = dict1[entryDel]
    del dict1[entryDel] 
    row = 0
    listWidget.clearSelection()
    listWidget.clear()
    for i in list(dict1.keys()):
        #print("Hi")
        listWidget.insertItem(row, i)
        row += 1

def setting(item, widget, feed, dict1, dictQ):
    message = QMessageBox()
    for entry in list(dict1.keys()):
        
        if (item.text() == entry):
            message.setText(dict1[entry])
            message.exec_()
            moveToQ(entry, widget, dict1, dictQ)

def viewing(feed, listWidget, dict1):
    #print("Hi")
    listWidget.clear()
    row = 0
    for x in list(dict1.keys()):
        listWidget.insertItem(row, x)
        row += 1

我最初使用 lambda 函数进行连接。在找到使用插槽的建议后,我放弃了 lambda 函数。然而,结果却没有改变。

python python-3.x pyqt pyqt5 listbox
1个回答
0
投票

来自@ekhumoro:QListWidget.clear 槽会永久删除每个项目。因此,当设置找到匹配项时,moveToQ将清除当前列表,包括激活的项目。但随后搜索将毫无意义地继续,这意味着文本方法会在已删除的项目上再次调用,从而导致崩溃。正如已经指出的,这里的部分问题是全局变量的使用。然而,更糟糕的是高度冗余的代码结构:无需搜索并重新填充列表小部件即可删除所选项目。

© www.soinside.com 2019 - 2024. All rights reserved.