如何正确管理活动小部件,而不是失去它们的焦点或记住变量中的焦点

How to properly manage active widgets, not loosing focus of them or remember the focus in variable

我有 4 个带模型的 QListView 小部件(不适合使用 QListView 或 QTableView)。我需要从模型和视图中删除 selected 项。我需要一个按钮连接到删除功能。因此,您按下按钮,最后 selected 的一项消失了。但是然后你 select 一个列表视图中的一个项目它保持 selected,所以如果我按下按钮,4 个 QListViews 中的 selected 项目就消失了。自动删除 select 项目不是一种选择,因为我有一个功能不起作用。
如果我尝试使用 .hasFocus(): 按下按钮后,按钮获得焦点,因此什么也没有发生。我可以随意添加另一个按钮到 deselect 或使用快捷方式,但对我来说有点笨拙。

所以我需要一种方法来让小部件不失去焦点,或者了解如何让我的程序记住 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_())