在 pyside 中使用 QWizard 下一个插槽

Using the QWizard next slot in pyside

我用 Pyside 创建了一个向导。 在一个页面上,我创建了一个新线程,它启动了一个安装程序。 安装程序准备就绪后,向导应自动继续,无需单击下一步按钮。

我已经阅读了 pyside 文档,现在我的理解是,QWizard 有一个 next 函数。但是如何使用这个功能呢?

我的测试工作正常:

from PySide.QtGui import *
from PySide.QtCore import *

...
...

class Install(QWizardPage):

def __init__(self, parent=None):
    super(Install, self).__init__(parent)

def initializePage(self):
    self.setTitle("Install")
    label = QLabel("Install")
    label.setWordWrap(True)
    layout = QVBoxLayout()
    self.progressBar = QProgressBar(self)
    self.progressBar.setRange(0,1)
    self.progressBar.setRange(0,0)
    layout.addWidget(self.progressBar)
    layout.addWidget(label)
    self.setLayout(layout)
    self.myTask = TaskThread()
    self.myTask.start()
    self.myTask.taskFinished.connect(self.Finished)

def Finished(self):
    print("finish")

def isComplete(self):
    return False


class TaskThread(QThread):
taskFinished = Signal()
def run(self):
    a = 0
    while a != 10000:
        print("test")
        a += 1
    self.taskFinished.emit()

当我尝试使用下一个功能时,我尝试:

self.CallNext = QWizard().next
self.myTask.taskFinished.connect(self.CallNext)

还有:

self.myTask.taskFinished.connect(QWizard().next)

但这不起作用

这个连接应该在 QWizardQWizardPage 存在的上下文中完成,但在此之前我们必须将 QThread 的创建移动到构造函数中,例如下面我主要做的例子:

class Install(QWizardPage):
    def __init__(self, parent=None):
        super(Install, self).__init__(parent)
        self.myTask = TaskThread()
    def initializePage(self):
        [...]
        self.setLayout(layout)

        self.myTask.start()

if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)

    wizard = QWizard()
    install = Install()
    install.setTitle("installer")
    install.myTask.taskFinished.connect(wizard.next)
    wizard.addPage(install)
    page = QWizardPage()
    page.setTitle("next Page")
    wizard.addPage(page)
    wizard.show()

    sys.exit(wizard.exec_())