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

问题描述 投票:0回答:1

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

所以,我需要一种使小部件不失去焦点的方法,或者是要了解如何使我的程序记住4个小部件中的哪一个最关注焦点。

python pyside2
1个回答
0
投票

您必须跟踪使用来自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_())
© www.soinside.com 2019 - 2024. All rights reserved.