Python 如何从QListWidget获取当前选定的项目,而不是它所记住的内容

Python 如何从QListWidget获取当前选定的项目,而不是它所记住的内容,python,qt,pyqt,Python,Qt,Pyqt,QListWidget返回。selectedItems()即使当前没有选择任何项目(它会记住上次单击或选择的项目。因此,即使取消选择了所有项目,它也会返回它所记得的内容)。但是我需要QListWidget只返回当前选中的项目 .hasFocus()技巧不可靠,因为所有项目都可能被隐藏,QListWidget将处于焦点位置。但在未选择任何内容时,它仍将继续并返回一个项目。我最终使用了这种方法: def getSelectedItem(self): if not self.myTreeWid

QListWidget
返回
。selectedItems()
即使当前没有选择任何项目(它会记住上次单击或选择的项目。因此,即使取消选择了所有项目,它也会返回它所记得的内容)。但是我需要
QListWidget
只返回当前选中的项目


.hasFocus()
技巧不可靠,因为所有项目都可能被隐藏,QListWidget将处于焦点位置。但在未选择任何内容时,它仍将继续并返回一个项目。

我最终使用了这种方法:

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
稍后编辑: 这是他的代码(经过编辑),显示了我提到的问题

首先选择一个项目,然后点击“隐藏取消隐藏”按钮隐藏所有项目。单击“现在是空的listView”中的任意位置(以确保取消选择所有内容)。单击“打印所选内容”按钮。以下是结果的图像:

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_())


我最终采用了这种方法:

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
稍后编辑: 这是他的代码(经过编辑),显示了我提到的问题

首先选择一个项目,然后点击“隐藏取消隐藏”按钮隐藏所有项目。单击“现在是空的listView”中的任意位置(以确保取消选择所有内容)。单击“打印所选内容”按钮。以下是结果的图像:

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_())


我最终采用了这种方法:

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
稍后编辑: 这是他的代码(经过编辑),显示了我提到的问题

首先选择一个项目,然后点击“隐藏取消隐藏”按钮隐藏所有项目。单击“现在是空的listView”中的任意位置(以确保取消选择所有内容)。单击“打印所选内容”按钮。以下是结果的图像:

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_())


我最终采用了这种方法:

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
稍后编辑: 这是他的代码(经过编辑),显示了我提到的问题

首先选择一个项目,然后点击“隐藏取消隐藏”按钮隐藏所有项目。单击“现在是空的listView”中的任意位置(以确保取消选择所有内容)。单击“打印所选内容”按钮。以下是结果的图像:

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_())


我不知道你为什么不认为
.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_())
选择的所有内容:

未选择任何内容:


我不知道你为什么不认为
。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_())
选择的所有内容:

未选择任何内容:


我不知道你为什么不认为
。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_())
选择的所有内容:

未选择任何内容:


我不知道你为什么不认为
。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_())
选择的所有内容:

未选择任何内容:



.selectedItems()返回项目,即使当前没有选择任何内容。它“记住”事物。如果您选择ListView项目,然后隐藏所有项目,取消选择所有内容,选择另一个小部件,它仍将返回上次选择的内容。您需要为我共享更多代码,以了解您的体验。如果你运行我上面的代码,就不会有项目的“记忆”。我编辑了你的代码并发布了它,以显示我遇到的问题。请查看附加在..selectedItems()下的内容。即使当前未选择任何内容,也会返回项目。它“记住”事物。如果您选择ListView项目,然后隐藏所有项目,取消选择所有内容,选择另一个小部件,它仍将返回上次选择的内容。您需要为我共享更多代码,以了解您的体验。如果你运行我上面的代码,就不会有项目的“记忆”。我编辑了你的代码并发布了它,以显示我遇到的问题。请查看附加在..selectedItems()下的内容。即使当前未选择任何内容,也会返回项目。它“记住”事物。如果您选择ListView项目,然后隐藏所有项目,取消选择所有内容,选择另一个小部件,它仍将返回上次选择的内容。您需要为我共享更多代码,以了解您的体验。如果你运行我上面的代码,就不会有项目的“记忆”。我编辑了你的代码并发布了它,以显示我遇到的问题。请查看附加在..selectedItems()下的内容。即使当前未选择任何内容,也会返回项目。它“记住”事物。如果您选择ListView项目,然后隐藏所有项目,取消选择所有内容,选择另一个小部件,它仍将返回上次选择的内容。您需要为我共享更多代码,以了解您的体验。如果你运行我上面的代码,就不会有项目的“记忆”。我编辑了你的代码并发布了它,以显示我遇到的问题。请看一看,它被附加在下面。当然,它仍然会被选中。它永远不会被取消选择!仅隐藏。顺便说一句,您需要将此添加到您的问题中,而不是作为答案。然后删除这个答案。奇怪和误导的是,即使在QListWidget被点击后(所有项目都被隐藏),它仍然认为最后一个选中的项目是
选中的
…当然它仍然被选中!只是藏起来了。如果你不想让他们再被选中,你需要在隐藏它之前取消选择它。当然,它仍然会被选中。它永远不会被取消选择!仅隐藏。顺便说一句,您需要将此添加到您的问题中,而不是作为答案。然后删除这个答案。奇怪和误导的是,即使在QListWidget被点击后(所有项目都被隐藏),它仍然认为最后一个选中的项目是
选中的
…当然它仍然被选中!只是藏起来了。如果你不想让他们再被选中的话,你需要在隐藏它之前取消选择它。当然,它仍然是