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.DropQtCore.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 中加载

使用 python 编辑 QlistWidget 中的部分行

python 将QWidget添加到QListWidget

python 迭代QListWidget

在 QListWidget 之间拖放自定义小部件项目