Как передать переменные из одного QWizardPage в основной QWizard

Я пытаюсь выяснить, как передать переменные (например, из функции openFile) из класса QWizardPage в основной класс QWizard. Я также читал о сигналах и слотах, но не могу понять, как и если это идеальный способ сделать это при использовании PyQt5. Ниже приведен упрощенный пример кода:

class ImportWizard(QtWidgets.QWizard):
  def __init__(self, parent=None):
    super(ImportWizard, self).__init__(parent)
    self.addPage(Page1(self))
    self.setWindowTitle("Import Wizard")
    # Trigger close event when pressing Finish button to redirect variables to backend
    self.finished.connect(self.closeEvent)

  def closeEvent(self):
    print("Finish")
    # Return variables to use in main
    print(self.variable)


class Page1(QtWidgets.QWizardPage):

  def __init__(self, parent=None):
    super(Page1, self).__init__(parent)
    self.openFileBtn = QPushButton("Import Edge List")
    layout = QtWidgets.QVBoxLayout()
    layout.addWidget(self.comboBox)
    layout.addWidget(self.openFileBtn)
    self.setLayout(layout)
    self.openFileBtn.clicked.connect(self.openFileNameDialog)

  def openFileNameDialog(self, parent):
    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    fileName, _ = QFileDialog.getOpenFileName(
        self, "QFileDialog.getOpenFileName()", "",
        "All Files (*);;Python Files (*.py)", options=options)
    # if user selected a file store its path to a variable
    if fileName:
        self.parent.variable = fileName

1 ответ

Решение

Если вы хотите получить доступ QWizard от QWizardPage Вы должны использовать wizard() метод, с другой стороны closeEvent() это событие, которое запускается при закрытии окна, которое не должно вызываться дополнительным сигналом, который не нужен, правильная вещь заключается в создании слота, который подключается к finished сигнал.

from PyQt5 import QtCore, QtWidgets

class ImportWizard(QtWidgets.QWizard):
    def __init__(self, parent=None):
        super(ImportWizard, self).__init__(parent)
        self.addPage(Page1(self))
        self.setWindowTitle("Import Wizard")
        # Trigger close event when pressing Finish button to redirect variables to backend
        self.finished.connect(self.onFinished)

    @QtCore.pyqtSlot()
    def onFinished(self):
        print("Finish")
        # Return variables to use in main
        print(self.variable)

class Page1(QtWidgets.QWizardPage):

    def __init__(self, parent=None):
        super(Page1, self).__init__(parent)
        self.openFileBtn = QtWidgets.QPushButton("Import Edge List")
        self.comboBox = QtWidgets.QComboBox()
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.comboBox)
        layout.addWidget(self.openFileBtn)
        self.setLayout(layout)
        self.openFileBtn.clicked.connect(self.openFileNameDialog)


    @QtCore.pyqtSlot()
    def openFileNameDialog(self):
        options = QtWidgets.QFileDialog.Options()
        options |= QtWidgets.QFileDialog.DontUseNativeDialog
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
            self, "QFileDialog.getOpenFileName()", "",
            "All Files (*);;Python Files (*.py)", options=options)
        # if user selected a file store its path to a variable
        if fileName:
            self.wizard().variable = fileName


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = ImportWizard()
    w.show()
    sys.exit(app.exec_())
Другие вопросы по тегам