PyQt 拖放 - 无反应

1 投票
1 回答
3640 浏览
提问于 2025-04-15 22:55

我正在尝试把一个文件拖到一个窗口上(我也试过在QListWidget上做这个,但没有成功)。

这是我的test.py文件:

#! /usr/bin/python
# Test
from PyQt4 import QtCore, QtGui
import sys
from qt_test import Ui_MainWindow
class MyForm(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)
        self.__class__.dragEnterEvent = self.DragEnterEvent
        self.__class__.dragMoveEvent = self.DragEnterEvent
        self.__class__.dropEvent = self.drop
        self.setAcceptDrops(True)
        print "Initialized"
        self.show()

    def DragEnterEvent(self, event):
        event.accept()

    def drop(self, event):
        link=event.mimeData().text()
        print link

def main():
    app = QtGui.QApplication(sys.argv)
    mw = MyForm()
    sys.exit(app.exec_())


if __name__== "__main__":
    main()

还有这个qt_test.py文件:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created: Thu May 20 12:23:19 2010
#      by: PyQt4 UI code generator 4.6
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setAcceptDrops(True)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))

我看过这封邮件,并且按照里面说的做了。但是我只看到“Initialized”的输出,拖动的文件似乎没有被接受(无论是从文件管理器拖的文件,还是从文本编辑器拖的纯文本)。你知道我哪里做错了吗?

谢谢!

1 个回答

3

是的,嗯……可以这么说。

从编辑器拖动纯文本对我来说没问题,至于文件……

当你把一个文件拖到你的应用程序上时,它的类型是 "text/uri-list"。对于这个类型,你需要使用 event.mimeData().urls() 方法来获取一系列 PyQt4.QtCore.QUrl 对象。

你需要根据不同的mime数据格式来处理它们。你可以使用 mimeData() 的以下方法来查看它有哪些属性:

hasColor()
hasFormat()
hasHtml()
hasImage()
hasText()
hasUrls()

撰写回答