【问题标题】:Open a new window after Finish Button has been clicked on Qwizard : Pyqt5在 Qwizard 上单击完成按钮后打开一个新窗口:Pyqt5
【发布时间】:2018-02-20 18:43:00
【问题描述】:

除了退出页面之外,我想让 QWizard 上的完成按钮执行其他操作。我需要将它连接到调用另一个窗口的函数。换句话说,我需要查看 Qwizard 页面的 Finish Button 并将其添加功能。有谁知道如何做到这一点。谢谢

【问题讨论】:

    标签: qt pyqt5 qwizard


    【解决方案1】:

    当您按下 QPushbutton 时,您有 QWizard 对象?

    如果是:

    使用 SIGNAL 和 SLOT!

    我不知道它在 Python 中是什么样子的,但是 c++ 是这样的:

    connect(my_button, SIGNAL(clicked(), your_qwizard_object, SLOT(your_qwizard_slot()));

    https://wiki.qt.io/Signals_and_Slots_in_PySide

    【讨论】:

    • 我需要它来打开一个 QtWidget 对象。另外,我需要结论页面上的内置完成按钮来执行此功能并关闭向导
    • 谢谢。不过,我将不得不在 python 中理解这一点。我对C++知之甚少。换句话说,我必须使用信号槽来覆盖默认的完成按钮功能吗??
    • 我认为是的。 wiki.qt.io/Signals_and_Slots_in_PySide 阅读此内容:)
    【解决方案2】:
    void MainWindow::on_btnCreateWizard_clicked() { 
        MyWizardForm* dlg = new MyWizardForm(this); 
        connect(dlg, SIGNAL(_finished()), this, SLOT(slot_show_me()));
        this->hide();
        dlg.exec(); 
    } 
    
    void MainWindow::slot_show_me() { 
        this->show();
    } 
    
    void MyWizardForm::on_btnClose_Clicked() { 
        emit _finished();
        this->reject();
    }
    

    【讨论】:

    • 这是一个调用向导页面的主窗口吗?相反的怎么样。我有一个功能强大的主窗口表单,可以独立运行。当它从 qwizard 调用时,它会显示但当您单击它的按钮时会崩溃。
    【解决方案3】:

    https://forum.qt.io/topic/44065/how-to-catch-finish-button-pressed-signal-in-qwizard/6

    我想这里是回答如何捕捉完成按钮按下事件。 我从未使用过 pyqt5,但我认为信号和插槽与 c++ 中的相同。

    【讨论】:

      【解决方案4】:

      这与您在 PyQt 中已经习惯的做法基本相同。区别在于如何找到完成按钮实体。这是一个工作示例:

      import sys
      from PyQt5 import QtWidgets, QtCore, QtGui
      
      class IntroPage(QtWidgets.QWizardPage):
          def __init__(self, parent=None):
              super(IntroPage, self).__init__(parent)
      
      class LastPage(QtWidgets.QWizardPage):
          def __init__(self, parent=None):
              super(LastPage, self).__init__(parent)
      
      class MyWizard(QtWidgets.QWizard):
          def __init__(self, parent=None):
              super(MyWizard, self).__init__(parent)
      
              self.introPage = IntroPage()
              self.lastPage = LastPage()
              self.setPage(0, self.introPage)
              self.setPage(1, self.lastPage)
      
              # This is the code you need
              self.button(QtWidgets.QWizard.FinishButton).clicked.connect(self._doSomething)
      
          def _doSomething(self):
              msgBox = QtWidgets.QMessageBox()
              msgBox.setText("Yep, its connected.")
              msgBox.exec()
      
      if __name__ == '__main__':
          app = QtWidgets.QApplication(sys.argv)
          main = MyWizard()
          main.show()
          sys.exit(app.exec_())
      

      注意我是如何使用这个命令的:self.button(QtWidgets.QWizard.FinishButton) 专门指向完成按钮。剩下的就是建立你自己的方法来做你需要的任何事情。在我的示例中,我连接到 def _doSomething(self) 并启动了一个非常简单的 QMessageBox。

      【讨论】:

      • 高,这在 MacOSX 和 Windows 上都能完美运行。但是,如果向导调用 QWidget 而不是 QMessageBox,则该表单会出现并保留在 MacOSX 上,但在 Windows 上会很快消失。你知道为什么会这样吗?
      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多