【问题标题】:Pyside / PyQt: How to send information between classesPyside / PyQt:如何在类之间发送信息
【发布时间】:2017-11-23 06:25:00
【问题描述】:

我正在尝试制作一个允许用户手动选择文件或只是将文件拖放到MainWindow的程序。

文件浏览器工作正常,MainWindow 接受 drop,但我不知道如何:

  1. filePath离开课堂myMainWindow进入课堂Ui_MainWindow
  2. 删除文件后将pushButton 的文本更改为“已选择文件”。

似乎我需要使用 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_())

【问题讨论】:

  • 你可以更好地解释第一点。
  • 当我运行这段代码时,它会弹出一个带有“浏览”按钮的巨大窗口。当我点击那个按钮时,它会弹出一个 QFileDIalog 窗口,一旦我选择了一个文件,按钮上的文本就会变为“File Selected”。所以至少有一件你想要发生的事情发生了。
  • 我问你第一点
  • dropEvent 中,我将self.filePath 设置为放入MainWindow 的文件的位置。 (如果您在注释行中输入“print(self.filePath)”,您将看到文件路径以字符串形式输出)我的问题是如何将第 27 行的self.filePath 中的字符串传输到@987654331 @?
  • 信号和槽是Qt对象之间通信的正确方法,但为什么需要Ui_MainWindow类呢?它的所有功能都可以合并到myMainWindow。然后你应该能够处理 dropEvent 内的所有事情

标签: python pyqt pyside signals-slots


【解决方案1】:

在任何面向对象语言中“在类之间发送信息”(或让它们进行通信)的唯一方法是通过消息(例如 python 的方法)。当您处理多个线程并且您需要在主线程中执行某些事情(视觉上的事情发生的地方)时,会使用 Pyside 的/Qt 的信号。 Pyside/Qt 的信号也可用于连接动作(例如,单击按钮以显示正在显示的图像)。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多