Python Pyside/PyQt:如何在类之间发送信息

Python Pyside/PyQt:如何在类之间发送信息,python,pyqt,pyside,signals-slots,Python,Pyqt,Pyside,Signals Slots,我正在尝试制作一个程序,允许用户手动选择一个文件或将一个文件拖放到主窗口中 文件浏览器工作,MainWindow接受拖放,但我不知道如何: 获取filePath出类myMainWindow并进入类Ui\u MainWindow 当文件被删除时,将按钮的文本更改为“已选择文件” 似乎我需要使用emit()/signal()在这两个类之间发送信息,但我不知道如何连接它们 完整代码: from PySide import QtCore, QtGui class myMainWindow(QtGui

我正在尝试制作一个程序,允许用户手动选择一个文件或将一个文件拖放到
主窗口中

文件浏览器工作,MainWindow接受拖放,但我不知道如何:

  • 获取
    filePath
    出类
    myMainWindow
    并进入类
    Ui\u MainWindow
  • 当文件被删除时,将按钮的文本更改为“已选择文件”
  • 似乎我需要使用emit()/signal()在这两个类之间发送信息,但我不知道如何连接它们

    完整代码:

    from PySide import QtCore, QtGui
    
    
    class myMainWindow(QtGui.QMainWindow):
        def __init__(self, parent=None):
            QtGui.QMainWindow.__init__(self, parent=parent)
            self.filePath = ''
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasUrls:
                event.accept()
            else:
                event.ignore()
    
        def dragMoveEvent(self, event):
            if event.mimeData().hasUrls:
                event.setDropAction(QtCore.Qt.CopyAction)
                event.accept()
            else:
                event.ignore()
    
        def dropEvent(self, event):
            if event.mimeData().hasUrls:
                event.setDropAction(QtCore.Qt.CopyAction)
                event.accept()
                for url in event.mimeData().urls():
                    self.filePath = (str(url.toLocalFile()))
                    # What else do I do here?
            else:
                event.ignore()
    
    
    class Ui_MainWindow(object):
        def selectFile(self):
            self.filePath = QtGui.QFileDialog.getOpenFileName()
            self.pushButton.setText('File Selected')
            print(self.filePath)
    
        def myChanges(self):
            self.pushButton.clicked.connect(self.selectFile)
    
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            MainWindow.setAcceptDrops(True)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton = QtGui.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(330, 180, 75, 23))
            self.pushButton.setObjectName("pushButton")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
            self.myChanges()
    
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
            self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Browse", None, QtGui.QApplication.UnicodeUTF8))
    
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = myMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    
    在任何面向对象语言中,“在类之间发送信息”(或让它们通信)的唯一方法是通过消息(例如python的方法)。Pyside的/Qt信号用于处理多个线程,并且需要在主线程中执行某些操作(在主线程中发生可视操作)。Pyside/Qt的信号也用于连接操作(例如,单击按钮以显示图像)

    在您的示例中,我认为最好是让类彼此了解(相互引用),并在需要时发送消息。例如,当您调用setupUI时,将mainWindow作为参数传递。在这个方法中,你可以有

    def setupUi(self, MainWindow):
        self._mainWindow = MainWindow
        mainWindow.setUi(self)
    

    setUi方法将该类另存为属性。然后在DropEvent上,您可以将路径作为另一条消息的参数发送到UI。

    您可以更好地解释第一点。当我运行此代码时,它会弹出一个巨大的窗口,其中有一个标记为“浏览”的按钮。当我点击该按钮时,它会弹出一个QFileDIalog窗口,一旦我选择了一个文件,按钮上的文本就会变为“file Selected”。因此,您希望发生的事情中至少有一件发生了。我询问您关于
    dropEvent
    中的第一点,我正在将
    self.filePath
    设置为放入
    main窗口的文件的位置。(如果在带有注释的行中键入“print(self.filePath)”,您将看到文件路径作为字符串输出)我的问题是如何将第27行的
    self.filePath
    中的字符串传输到
    class Ui_MainWindow
    ?信号和插槽是Qt对象之间通信的正确方法,但是为什么需要
    Ui\u主窗口
    类呢?它的所有功能都可以合并到myMainWindow中。然后您应该能够从
    dropEvent