如何在 PyQt5 中解决这个问题?

考虑下面给出的最低限度的例子

class Main:

    def __init__(self):

        self.name=''

        self.age=''


    def setinfo(self):

        self.name=input()

        self.age=input()


    def run(self):

        self.startWin=QWidget()

        self.setinfo()

        dnd=DragDrop('Drop Photo here',self.startWin)

        self.startWin.show()

        sys.exit(app.exec_())


    def showWin(self,file_path):

        self.mainWin=QWidget()

        self.label1=QLabel(self.name,self.mainWin)

        self.label2=QLabel(self.age,self.mainWin)

        self.photo = QLabel(self.mainWin)

        pixmap = QPixmap(file_path)

        self.photo.setPixmap(pixmap)

        self.mainWin.show()


class DragDrop(QLabel):

    def __init__(self, title, parent):

        super().__init__(title, parent)

        self.setAcceptDrops(True)


    def dragEnterEvent(self, event):

        if event.mimeData().hasImage:

            event.accept()

        else:

            event.ignore()

    

    def dropEvent(self, event):

        file_path = event.mimeData().urls()[0].toLocalFile()

        self.showWin(file_path)


app = QApplication([])

instance=Main()

instance.run()

现在,我想要的是将文件放入 dnd(拖放 QLabel)后立即调用 Main 类的 showWin 函数,以显示该人的姓名、年龄和照片。但是,当然,来自 DragDrop 类的调用将不起作用,因为 showWin 函数属于 Main 类。我什至无法创建该类的对象然后调用它,因为我想在已经运行的实例中进行更改。


我该如何克服这种情况?


我已经尝试过的:

我尝试将可变数据类型(如列表)传递到 DragDrop 类的构造函数中,并对其进行更改。但问题是,需要再次单击运行函数中的某个按钮才能使用该路径并调用 showWin。第二种解决方案是通过__get__在 run 函数中使用方法直接覆盖 QLabel 对象的事件方法(不形成类)。但我认为这太特定于语言了。我正在尝试为此找到一个基于面向对象的通用解决方案。


函数式编程
浏览 94回答 1
1回答

德玛西亚99

您可以使用自定义信号。在 DragDrop 中创建信号并在 中发出dropEvent:image_dropped = pyqtSignal(str)def dropEvent(self, event):    file_path = event.mimeData().urls()[0].toLocalFile()    self.image_dropped.emit(file_path)将信号连接到showWinMain:def run(self):    self.startWin=QWidget()    self.setinfo()    dnd=DragDrop('Drop Photo here',self.startWin)    dnd.image_dropped.connect(self.showWin)    self.startWin.show()    sys.exit(app.exec_())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python