使用来自另一个文件的Drop_groupBox的PyQt5

如何解决使用来自另一个文件的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_MainWindowUi_MainWindow,因此您无需在QMainWindow.__init__中创建MConv.setupUi的单独实例。相反,您可以直接引用MConv.groupBoxclass 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?