如何在PyQt的动态UI中覆盖小部件的事件(dropEvent)?

时间:2016-08-08 20:54:38

标签: python qt pyqt pyqt4

我在做什么/到目前为止我有什么:

我正在使用Qt-designer创建PyQt .ui文件,我使用QUiLoader在我的python脚本中加载它,这使我可以访问小部件/组件:

self.ui.tree_widget_of_items ( which is a QTreeWidget created in Qt-designer)

我能够读取和写入小部件的值,我可以像这样使用TreeWidget上的信号:

self.ui.tree_widget_of_items.itemSelectionChanged.connect(self.myFunction)

我想做什么?

  • 我想在我的python脚本中覆盖treeWidget的dropEvent

我尝试了但是没有工作:

self.ui.tree_widget_of_items.dropEvent = self.drop_action

def drop_action(self,e):
    print "drop action"

我尝试将自己的函数分配给TreeWidget的dropEvent,但是当我在TreeWidget上删除项目时它不会被触发。

我也尝试过:

self.ui.tree_widget_of_items.dragEnterEvent = self.drop_action

我确保在TreeWidget上启用了拖放功能。

2 个答案:

答案 0 :(得分:1)

您必须在树上安装事件过滤器并在班级中实施QObject.eventFilter方法。

示例(安装事件过滤器):

self.ui.tree_widget_of_items.installEventFilter(self)

并实现eventFilter:

def eventFilter(self, o, e):
    if e.type() == QEvent.DragEnter: #remember to accept the enter event
        e.acceptProposedAction()
        return True
    if e.type() == QEvent.Drop:
        # handle the event
        # ...
        return True
    return False #remember to return false for other event types

请参阅QObject.installEventFilterQObject.eventFilter

答案 1 :(得分:1)

在动态UI中实现事件(这意味着在Qt-designer中创建的UI,并使用.ui文件在python工具中使用)。你需要做以下事情:

  1. 你的工具的MainWindow类应该继承QtGui.QMainWindow

    class main_window(QtGui.QMainWindow):
    
  2. 应该调用super()。 init ()

    class main_window(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(main_window, self).__init__(parent)
    
            loader = QUiLoader()
            file = QtCore.QFile(os.path.join(SCRIPT_DIRECTORY, 'mainwindow.ui'))
            file.open(QtCore.QFile.ReadOnly)
            if parent:
                self.ui = loader.load(file, parentWidget=parent)
            else:
                self.ui = loader.load(file)
            file.close()
    
  3. 在组件上安装EventFilter:

    self.ui.tree_widget_of_items.installEventFilter(self)      
    # not --> self.ui.tree_widget_of_items.installEventFilter(self.ui)
    
  4. 定义eventFilter():

    def eventFilter(self, o, e):
    if (o.objectName() == "tree_widget_of_items"):
        if e.type() == QtCore.QEvent.Type.Enter:
            self.drop_action(e)