如何解决使用来自另一个文件的Drop_groupBox的PyQt5
我在PyQt5-Application中有一个groupBox
,它是一个拖放区,用户可以在其中上传文件,而dropEvent
打印一个拖到该拖放区中的文件名列表并将其写入到listWidget
。我已经从here稍微更改了原始代码:
dropfiles.py
# -*- coding: utf-8 -*-
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
import os
from PyQt5 import QtCore,QtGui,QtWidgets
class Drop_groupBox(QtWidgets.qgroupbox):
dropped = QtCore.pyqtSignal(list)
def __init__(self,parent):
super().__init__(parent)
self.setAcceptDrops(True)
def dragenterEvent(self,e):
if e.mimeData().hasUrls():
e.accept()
else:
e.ignore()
def dropEvent(self,e):
list_of_files = [url.toLocalFile() for url in e.mimeData().urls() if os.path.isfile(url.toLocalFile())]
self.dropped.emit(list_of_files)
class Ui_MainWindow(object):
def setupUi(self,MainWindow):
MainWindow.setobjectName("MainWindow")
MainWindow.resize(658,449)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(658,449))
MainWindow.setMaximumSize(QtCore.QSize(658,449))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setobjectName("centralwidget")
self.gridLayout_3 = QtWidgets.qgridLayout(self.centralwidget)
self.gridLayout_3.setobjectName("gridLayout_3")
self.gridLayout = QtWidgets.qgridLayout()
self.gridLayout.setobjectName("gridLayout")
self.label_Files = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_Files.sizePolicy().hasHeightForWidth())
self.label_Files.setSizePolicy(sizePolicy)
self.label_Files.setMinimumSize(QtCore.QSize(122,20))
self.label_Files.setMaximumSize(QtCore.QSize(122,20))
self.label_Files.setobjectName("label_Files")
self.gridLayout.addWidget(self.label_Files,1,1)
self.listWidget_Files = QtWidgets.QListWidget(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.listWidget_Files.sizePolicy().hasHeightForWidth())
self.listWidget_Files.setSizePolicy(sizePolicy)
self.listWidget_Files.setMinimumSize(QtCore.QSize(256,341))
self.listWidget_Files.setMaximumSize(QtCore.QSize(256,341))
self.listWidget_Files.setobjectName("listWidget_Files")
self.gridLayout.addWidget(self.listWidget_Files,1)
self.gridLayout_3.addLayout(self.gridLayout,1)
# self.groupBox = QtWidgets.qgroupbox(self.centralwidget)
self.groupBox = Drop_groupBox(self.centralwidget)
self.groupBox.dropped.connect(self.fill_fileslist)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
self.groupBox.setSizePolicy(sizePolicy)
self.groupBox.setMinimumSize(QtCore.QSize(300,300))
self.groupBox.setMaximumSize(QtCore.QSize(400,300))
self.groupBox.setTitle("")
self.groupBox.setobjectName("groupBox")
self.gridLayout_2 = QtWidgets.qgridLayout(self.groupBox)
self.gridLayout_2.setobjectName("gridLayout_2")
self.label = QtWidgets.QLabel(self.groupBox)
self.label.setobjectName("label")
self.gridLayout_2.addWidget(self.label,1)
self.gridLayout_3.addWidget(self.groupBox,1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0,658,19))
self.menubar.setobjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setobjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self,MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setwindowTitle(_translate("MainWindow","TestCase"))
self.label_Files.setText(_translate("MainWindow","<html><head/><body><p align=\"center\"><span style=\" font-size:12pt; font-weight:600;\">Selected Files</span></p></body></html>"))
self.label.setText(_translate("MainWindow","<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:600;\">Drop Files Here!</span></p></body></html>"))
def fill_fileslist(self,files_list):
self.listWidget_Files.addItems(files_list)
print(files_list)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
当我将所有代码都放在一个文件中时,这工作得很好。但是现在我的问题是我正在使用PyQt Designer设计gui,并且我想使用编程逻辑(编程功能)将“ gui”文件与文件分开,以便在我更改gui中的某些内容并将其转换时到python文件(带有pyuic
)中,Designer中定义的功能 not 不会被覆盖。这就是我尝试过的:
mainwindow.py(gui文件)
# -*- coding: utf-8 -*-
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore,QtWidgets
class Ui_MainWindow(object):
def setupUi(self,1)
self.groupBox = QtWidgets.qgroupbox(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,"<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:600;\">Drop Files Here!</span></p></body></html>"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
dropfiles_functions.py(具有编程逻辑的文件)
# -*- coding: utf-8 -*-
import os
from PyQt5 import QtCore,QtWidgets
from dropfiles_gui import Ui_MainWindow
class Drop_groupBox(QtWidgets.qgroupbox):
dropped = QtCore.pyqtSignal(list)
def __init__(self,e):
list_of_files = [url.toLocalFile() for url in e.mimeData().urls() if os.path.isfile(url.toLocalFile())]
self.dropped.emit(list_of_files)
class MConv(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.groupBox = Drop_groupBox(self.ui.centralwidget) # <-- why is this not working?
self.ui.groupBox.dropped.connect(self.fill_fileslist) # <-- why is this not working?
def fill_fileslist(self,files_list):
self.listWidget_Files.addItems(files_list)
print(files_list)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = MConv()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我不明白为什么drop事件没有传递到groupBox。在文件'dropfiles_functions.py'中,我将'self.ui.groupBox'更改为'new Drop_groupBox',但其功能无法正常工作。有人可以向我解释为什么会这样,我在做什么错吗?
解决方法
要使其正常工作,您需要将QtDesigner中的QtWidgets.QGroupBox
小部件从Drop_groupBox
升级为self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
小部件。您可以检查official Qt documentation以了解操作方法。如果成功,则将.ui文件转换为.py文件,则该行
self.groupBox = Drop_groupBox(self.centralwidget)
应替换为
from dropfiles_functions import Drop_groupBox
。在.py文件的底部,应该有一个类似于
的import语句。MConv
下一步是正确设置MConv
。由于QMainWindow
继承自Ui_MainWindow
和Ui_MainWindow
,因此您无需在QMainWindow.__init__
中创建MConv.setupUi
的单独实例。相反,您可以直接引用MConv.groupBox
和class MConv(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__(self)
self.setupUi(self) # <-- this will define self.groupBox = Drop_groupbox(...) amongst others
self.groupBox.dropped.connect(self.fill_fileslist)
def fill_fileslist(self,files_list):
self.listWidget_Files.addItems(files_list)
print(files_list)
,即
if __name__ == "__main__"
最后,在MConv
块中,需要确保您使用的是QMainWindow
的实例,而不是标准的if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = MConv()
MainWindow.show()
sys.exit(app.exec_())
,即
{{1}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。