Python:在 QListWidget 中捕获重新排序事件?
Posted
技术标签:
【中文标题】Python:在 QListWidget 中捕获重新排序事件?【英文标题】:Python: capture re-ordering event in a QListWidget? 【发布时间】:2016-12-13 03:00:40 【问题描述】:我需要响应 QListWidget 中项目的拖放重新排序。我找不到要使用的 QEvent。任何帮助将不胜感激!
我正在使用 eventFilter 例程在我的 GUI 中捕获事件:
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def eventFilter(self, sourceObj, event):
if event.type()== QtCore.QEvent.Drop:
print("got to drop event")
(processing code here)
也许此事件不会在项目的拖放重新排序时触发,因为拖放是小部件内部的(例如,小部件外部的任何内容都不会拖放到它上面)?
我试过QtCore.QEvent.Drop
和QtCore.QEvent.MouseButtonRelease
都没有成功。我应该使用哪个事件?
(我在 Ubuntu 16.10 上使用 Python3、PyQt4。我的 eventFilter 例程适用于 GUI 中的其他操作,例如单击、丢失焦点等)
【问题讨论】:
尝试在 QListWidget 的视口上安装事件过滤器 @Schollii 非常感谢。在 viewport() 上安装事件过滤器确实会触发事件。然后问题变成了 QT 直到事件之后才处理 QListWidget 中 QItems 的重新排序。不过,我确实找到了解决方案:使用 ChildRemoved 事件。显然,QT 在拖放重新排序时发出该事件。 【参考方案1】:这是我发现可行的解决方案。解决方案是使用 eventFilter 来监听 ChildRemoved QEvent。显然,当 QListWidget 中的项目通过拖放重新排序时,QT 会触发此事件。
第 1 步。在包含 QListWidget 的类的 init(self) 中,为要捕获其事件的小部件安装事件过滤器。
def __init__(self):
self.lstYourWidgetNameHere.installEventFilter(self)
步骤 2. 在同一类的 eventFilter 例程中,检查 ChildRemoved QEvent。
def eventFilter(self, sourceObj, event):
objName = str(sourceObj.objectName())
if event.type()== QtCore.QEvent.ChildRemoved:
if objName == "lstYourWidgetNameHere":
(your code here)
【讨论】:
以上是关于Python:在 QListWidget 中捕获重新排序事件?的主要内容,如果未能解决你的问题,请参考以下文章
如何重定向 python 解释器输出并将其捕获到 C++ 程序中的字符串中?
Python PyQt4 QFileDialog 图像并在 QListWidget 中加载