【问题标题】:How do I get around this issue in PyQt5?如何在 PyQt5 中解决这个问题?
【发布时间】:2020-10-28 19:20:41
【问题描述】:

考虑下面给出的最小示例

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 对象的事件方法。但我认为这太特定于语言了。我正在尝试为此找到一个通用的基于 OOP 的解决方案。

【问题讨论】:

    标签: python oop pyqt5


    【解决方案1】:

    您可以使用自定义信号。在 DragDrop 中创建信号并在 dropEvent 中发出:

    image_dropped = pyqtSignal(str)
    def dropEvent(self, event):
        file_path = event.mimeData().urls()[0].toLocalFile()
        self.image_dropped.emit(file_path)

    将信号连接到 Main 中的 showWin

    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_())

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 2016-01-24
      • 2011-09-19
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多