考虑下面给出的最低限度的例子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 对象的事件方法(不形成类)。但我认为这太特定于语言了。我正在尝试为此找到一个基于面向对象的通用解决方案。
1 回答
德玛西亚99
TA贡献1770条经验 获得超3个赞
您可以使用自定义信号。在 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_())
添加回答
举报
0/150
提交
取消