在Python / PySide中清除所选列表项(因此没有选定的列表项)

时间:2011-12-02 21:43:57

标签: python pyside qt-designer

我有一个使用PySide用Python编写的应用程序,用QT Designer创建了UI。

我在窗口中有一个列表,其中包含一组项目。当应用程序加载时,它似乎抓住了列表中的最后一项(即使列表中没有显示“突出显示”的行)。如果我打破并检查当时是否有所选项目,我将获得列表中的最后一项。

我有这段代码:

    @QtCore.Slot(QTreeWidgetItem,QTreeWidgetItem)
    def on_list_currentItemChanged(self,current=None,previous=None):
        if current:
            self.ui.actionDelete_Task.setEnabled(True)
        else:
            self.ui.actionDelete_Task.setEnabled(False)

确定是否选择了当前项目。因此,在初始加载时,我希望当前为空,但它不是,它指向列表中的最后一项,即使没有选择任何项目。

有什么东西我不见了吗?或者,或者,如何告诉列表没有选定的行/取消选择所有行?

最终我正在寻找的是(a)当表单加载并且列表最初显示时没有选择项目时,删除按钮被禁用,甚至(b)如果有人应该通过此操作删除项目,之后不会有选定的项目(所以他们不能只按两次删除并按顺序删除两行)。

1 个答案:

答案 0 :(得分:1)

当前项目和选择不一定是一回事。当前项目是指具有键盘焦点的项目;选择指的是当前突出显示的项目。因此,没有选择的树窗口小部件仍将具有当前项目(除非它根本没有项目)。

因此,一种解决方案可能只是检查当前项目是否也被选中:

@QtCore.Slot(QTreeWidgetItem, QTreeWidgetItem)
def on_list_currentItemChanged(self, current=None, previous=None):
    if current is not None and current.isSelected():
        self.ui.actionDelete_Task.setEnabled(True)
    else:
        self.ui.actionDelete_Task.setEnabled(False)

修改

在查看Qt源代码后,上面的代码似乎不起作用,因为在重置选择之前会发出currentItemChanged信号。

相反,我建议使用itemSelectionChanged信号,并检查selectedItems

def on_list_ItemSelectionChanged(self):
    if self.list.selectedItems():
        self.ui.actionDelete_Task.setEnabled(True)
    else:
        self.ui.actionDelete_Task.setEnabled(False)

注意:采用这种方法可能还需要在代码中的其他位置替换currentItem()selectedItems()[0]的使用情况。