如何从QListWidget获取当前选择的项而非记忆中的项

0 投票
2 回答
12544 浏览
提问于 2025-04-18 14:40

QListWidget 在调用 .selectedItems() 时,即使没有任何选中的项目,它也会返回上一次点击或选中的项目。也就是说,即使所有项目都被取消选择,它仍然会记住之前的选择并返回那个项目。但我需要 QListWidget 只返回当前选中的项目。

使用 .hasFocus() 这个方法并不可靠,因为所有项目可能都被隐藏,这时 QListWidget 仍然会处于焦点状态。但它仍然会继续返回一个项目,即使实际上没有任何项目被选中。

2 个回答

0

我最后采用了这个方法:

def getSelectedItem(self):
    if not self.myTreeWidget.hasFocus(): return
    for selectedItem in self.myTreeWidget.selectedItems():
        if not selectedItem: continue
        if selectedItem.isHidden(): continue 
        return selectedItem

后续编辑:

这是他的代码(经过编辑),展示了我提到的问题。

首先选择一个项目,然后通过点击“隐藏-显示”按钮来隐藏所有项目。接着在现在空的列表视图中随便点击一下(这样可以确保所有选择都被取消)。然后点击“打印选中项”按钮。以下是结果的图片:

在这里输入图片描述

from PyQt4 import QtCore, QtGui

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.resize(720, 480)
        central_widget = QtGui.QWidget(self)
        self.setCentralWidget(central_widget)

        layout = QtGui.QHBoxLayout(central_widget)

        self.text_edit = QtGui.QTextEdit(central_widget)
        layout.addWidget(self.text_edit)

        self.drop_list = QtGui.QListWidget(central_widget)

        self.drop_list.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
        self.drop_list.addItems(['one', 'two', 'three', 'four'])
        layout.addWidget(self.drop_list)
        self.show()

        self.button1=QtGui.QPushButton("Hide-Unhide Items")
        self.button1.clicked.connect(self.hideUnhideItems)
        layout.addWidget(self.button1)

        self.button2=QtGui.QPushButton("Print Selected")
        self.button2.clicked.connect(self.getSelected)
        layout.addWidget(self.button2)

    def getSelected(self):
        self.text_edit.clear()
        self.text_edit.setText(repr(self.drop_list.selectedItems()))

    def hideUnhideItems(self):
        for i in range(self.drop_list.count()):
            item=self.drop_list.item(i)
            if not item.isHidden():
                item.setHidden(True)
            else:
                item.setHidden(False)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    frame = MainWindow()
    sys.exit(app.exec_())
3

我不明白你为什么觉得 .selectedItems() 不好使。我刚刚用下面的代码试了一下,结果是正常的。

import sys

from PySide import QtGui


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super().__init__()

        self.resize(720, 480)
        central_widget = QtGui.QWidget(self)
        self.setCentralWidget(central_widget)

        layout = QtGui.QHBoxLayout(central_widget)

        self.text_edit = QtGui.QTextEdit(central_widget)
        layout.addWidget(self.text_edit)

        self.drop_list = QtGui.QListWidget(central_widget)
        self.drop_list.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
        self.drop_list.addItems(['one', 'two', 'three', 'four'])
        self.drop_list.itemSelectionChanged.connect(self.show_List)
        layout.addWidget(self.drop_list)

        statusbar = QtGui.QStatusBar(self)
        self.setStatusBar(statusbar)

        action_ShowList = QtGui.QAction(self)
        action_ShowList.triggered.connect(self.show_List)

        self.show()

    def show_List(self):
        self.text_edit.setText(repr(self.drop_list.selectedItems()))


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    frame = MainWindow()
    sys.exit(app.exec_())

所有选中的项目:

列表中所有项目都被选中

没有选中的项目:

列表中没有项目被选中

撰写回答