放置事件后的Qt

问题描述 投票:2回答:3

我需要在小部件上发生放置事件之后处理一些数据。

即,用户在列表A中选择了一些项目,并将它们放入列表B。在B添加了从A中选择的项目后,我的程序需要比较两个列表。

有什么想法吗?

qt events pyqt drag-and-drop qlistwidget
3个回答
1
投票

这是一个PyQt脚本,演示了两种捕获放置事件的方法:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        widget = QtGui.QWidget(self)
        self.setCentralWidget(widget)
        layout = QtGui.QVBoxLayout(widget)
        self.listA = ListWidget(self)
        self.listB = QtGui.QListWidget(self)
        self.listB.viewport().installEventFilter(self)
        for widget in (self.listA, self.listB):
            widget.setAcceptDrops(True)
            widget.setDragEnabled(True)
            for item in 'One Two Three Four Five Six'.split():
                widget.addItem(item)
            layout.addWidget(widget)

    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.Drop and
            source is self.listB.viewport()):
            self.listB.dropEvent(event)
            if event.isAccepted():
                print 'eventFilter', self.listB.count()
            return True
        return QtGui.QMainWindow.eventFilter(self, source, event)

class ListWidget(QtGui.QListWidget):
    def __init__(self, parent):
        QtGui.QListWidget.__init__(self, parent)

    def dropEvent(self, event):
        QtGui.QListWidget.dropEvent(self, event)
        if event.isAccepted():
            print 'dropEvent', self.count()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

1
投票

您正在监听的事件是QDropEvent。要在收到事件时做一些工作,您需要:

  • 在目标小部件上重新实现QDropEvent
  • 使用单独的控制器窗口小部件作为放置目标的事件过滤器(在控制器上重新实现QWidget::dropEvent,然后将其安装在目标[QWidget::dropEvent]上。

EDIT:深入探讨:

  1. 重新实现 QObject::eventFilter

标题:

QObject::eventFilter

实施:

installEventFilter
  1. 使用单独的事件过滤器

标题:

installEventFilter

实施:

dropEvent

1
投票

让它正常工作!

我对任何感兴趣的人的代码:

cDropTarget : public QWidget
{
  Q_OBJECT

public:
  cDropTarget(QWidget *Parent = 0);

protected:
  virtual void dropEvent(QDropEvent *event);
}
© www.soinside.com 2019 - 2024. All rights reserved.