我有4个带有模型的QListView小部件(不适合使用QListView或QTableView)。我需要从模型和视图中删除选定的项目。而且我需要一个按钮来连接删除功能。因此,您按下按钮,最后选择的一项消失了。但是随后您在一个列表视图中选择了一个项目,它保持选中状态,因此,如果我按下按钮,则4个QListViews中的选定项目都消失了。自动取消选择项不是一种选择,因为我有一个功能不起作用。如果尝试使用.hasFocus():按下按钮后,按钮将获得焦点,因此什么也不会发生。我可以添加另一个按钮以随意取消选择或使用快捷方式,但是对我来说有点笨拙。
所以,我需要一种使小部件不失去焦点的方法,或者是要了解如何使我的程序记住4个小部件中的哪一个最关注焦点。
您必须跟踪使用来自QApplication的focusChanged信号获取焦点的小部件,并验证它是否是QListView之一。
from PySide2 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
button = QtWidgets.QPushButton("Delete")
button.clicked.connect(self.on_clicked)
lay = QtWidgets.QHBoxLayout()
self.listviews = []
# create QListView
for i in range(4):
lv = QtWidgets.QListView()
model = QtGui.QStandardItemModel()
lv.setModel(model)
lay.addWidget(lv)
self.listviews.append(lv)
for j in range(10):
it = QtGui.QStandardItem("{}-{}".format(i, j))
model.appendRow(it)
vlay = QtWidgets.QVBoxLayout(self)
vlay.addWidget(button)
vlay.addLayout(lay)
self._last_listview = None
QtWidgets.qApp.focusChanged.connect(self.on_focusChanged)
@QtCore.Slot()
def on_clicked(self):
if self._last_listview is not None:
for index in reversed(sorted(self._last_listview.selectedIndexes())):
self._last_listview.model().removeRow(index.row())
@QtCore.Slot("QWidget*", "QWidget*")
def on_focusChanged(self, old, now):
if now in self.listviews:
self._last_listview = now
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())