Drag and Drop, как перетащить файл с системы в виджет?

Рейтинг: 0Ответов: 1Опубликовано: 11.03.2023

Как в main.py реализовать события переноса и сброса файла с системы в область виджета, созданного через Qt Designer? Без изменения кода этого виджета test.py.

main.py:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAbstractItemView
from PyQt5.QtCore import Qt
from test import *


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.listWidget.setDragDropMode(QAbstractItemView.DragDrop)
        self.ui.listWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.ui.listWidget.addItems(['one', 'two', 'three', 'four'])
        self.setWindowFlags(Qt.WindowStaysOnTopHint)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    try:
        sys.exit(app.exec_())
    except SystemExit:
        print('Окно было закрыто')

test.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(451, 390)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.listWidget = QtWidgets.QListWidget(self.frame)
        self.listWidget.setObjectName("listWidget")
        self.verticalLayout_2.addWidget(self.listWidget)
        self.verticalLayout.addWidget(self.frame)
        MainWindow.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

Ответы

▲ 0

Я плохо понимаю что вы хотите сделать, но я вам покажу как просто перетаскивать изображение в окно и отображает его.

import sys
from urllib.request import Request, urlopen
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


#from test import *
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(451, 390)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.listWidget = QtWidgets.QListWidget(self.frame)
        self.listWidget.setObjectName("listWidget")
        self.verticalLayout_2.addWidget(self.listWidget)
        
        self.verticalLayout.addWidget(self.frame)
        MainWindow.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


class Widget(QFrame):  
    request_headers = {
        # User-Agent указан, чтобы избежать кода состояния HTTP 403 (запрещено)
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0'
    }

    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.setAcceptDrops(True)
        self.vbl = QVBoxLayout(self)

    def dragEnterEvent(self, e): 
        e.accept()
    
    def dropEvent(self,e):
        if e.mimeData().hasImage():
            pix = QPixmap(e.mimeData().imageData())
        elif e.mimeData().hasUrls():
            url = e.mimeData().urls()[0]
            if url.isLocalFile():
                pix = QPixmap(url.toLocalFile())
            else:
                try:
                    req = Request(url.toString(), headers=self.__class__.request_headers)
                    data = urlopen(req).read()
                except:
                    return
                pix = QPixmap()
                pix.loadFromData(data)
        else:
            return
        if pix.isNull(): return

        for i in reversed(range(self.vbl.count())): 
            w = self.vbl.itemAt(i).widget()
            self.vbl.removeWidget(w)
            w.setParent(None)

        label = QLabel()
        label.setPixmap(pix)
        self.vbl.addWidget(label)
     

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowFlags(Qt.WindowStaysOnTopHint)
        
        self.frame.setStyleSheet("background-color: rgb(150, 50, 50);")
        self.listWidget.setStyleSheet("background-color: rgb(150, 250, 50);")
        
        self.listWidget.setDragDropMode(QAbstractItemView.DragDrop)
        self.listWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.listWidget.addItems(['one', 'two', 'three', 'four'])


        self._widget = Widget(self)
        self._widget.setStyleSheet("background-color: rgb(150, 150, 250);")
        self.verticalLayout_2.addWidget(self._widget, 1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    try:
        sys.exit(app.exec_())
    except SystemExit:
        print('Окно было закрыто')

введите сюда описание изображения

введите сюда описание изображения