PyQt5 Drag and Drop (перетащить файл с системы в виджет)
такой вопрос, как в 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"))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я плохо понимаю что вы хотите сделать, но я вам покажу как просто перетаскивать изображение в окно и отображает его.
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('Окно было закрыто')

