Reputation: 19329
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
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
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:
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
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:
Nothing selected:
Upvotes: 3