考虑下面给出的最低限度的例子
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 对象的事件方法(不形成类)。但我认为这太特定于语言了。我正在尝试为此找到一个基于面向对象的通用解决方案。
德玛西亚99
相关分类