alphanumeric
alphanumeric

Reputation: 19329

How to get currently selected item from QListWidget and not what it remembers

QListWidget returns on .selectedItems() even if there are no items currently selected (it remembers last item clicked or selected. So even if all its items were deselected it still returns what it remembers). But I need QListWidget to return ONLY that item that is currently selected.

.hasFocus() trick is not reliable since all the items could get hidden, QListWidget would be in focus. But it still will go ahead and return an item while nothing is selected.

Upvotes: 0

Views: 12921

Answers (2)

alphanumeric
alphanumeric

Reputation: 19329

I ended up using this approach:

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

Edited later:

Here is his code (edited) showing the problem I've mentioned.

First select an item, then hide all the items by hitting 'Hide-Unhide' button. Click anywhere inside of now being empty listView (just to make sure everything is deselected). Click "Print Selected" button. Here is the image of the result:

enter image description here

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

Upvotes: 0

James Mertz
James Mertz

Reputation: 8759

I'm not sure why you don't think that .selectedItems() doesn't work. I just tried this with the code below and it's working correctly.

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

Everything selected:

All items in list selected

Nothing selected:

No items in list selected

Upvotes: 3

Related Questions