如何正确管理活动小部件,而不是失去它们的焦点或记住变量中的焦点
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_())
我有 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_())