我有一个使用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)如果有人应该通过此操作删除项目,之后不会有选定的项目(所以他们不能只按两次删除并按顺序删除两行)。
答案 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]
的使用情况。