代码之家  ›  专栏  ›  技术社区  ›  Agis Soleas

PyQt堆叠的小部件在函数结束之前不会移动到下一页

  •  0
  • Agis Soleas  · 技术社区  · 9 年前

    嗨,我有一个程序,当按钮被按下时,它应该移动到下一个堆叠的小部件,替换一些标签中的一些文本,然后执行一些功能,但这不起作用,当功能完成时,它会移动到下页 代码为:

    QtCore.QObject.connect(self.StartBtn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.start) #Start
    def nextPage(self):
        current_page =  self.stackedWidget.currentIndex()
        i = int(current_page) + 1
        self.stackedWidget.setCurrentIndex(i)   
    def start(self):
        self.nextPage()
        self.animation()
        self.runFunctions()
     def runFunctions(self):    
        try:
    
            self.DbLabel.setText(_translate("MainWindow", "Checking Database", None))
    
            if checkDb == True:
                self.DbLabel.setText(_translate("MainWindow", "Checking Database ", None))
                self.checkDbFun()
                self.DbLabel.setText(_translate("MainWindow", "Database checked", None))
            else:
                self.checkedDbImg.setPixmap(QtGui.QPixmap(_fromUtf8("Files\\x.png")))
                self.DbLabel.setText(_translate("MainWindow", "Database not checked", None))
          except Exception as e:  
            self.AlertMessage(e)
    
    
    def animation(self):
        self.LoadingGif = QtGui.QLabel(MainWindow)
        movie = QtGui.QMovie("Files\\loading.png")
        self.LoadingGif.setMovie(movie)
        self.LoadingGif.setAlignment(QtCore.Qt.AlignCenter)
        self.gridLayout_2.addWidget(self.LoadingGif, 4, 1, 1, 1)
        movie.start()
    

    所以我想要的是按StartBtn,然后移动到下一个堆叠的小部件页面,加载动画图像,然后运行函数

    1 回复  |  直到 9 年前
        1
  •  1
  •   Oliver    9 年前

    您可能需要让Qt处理事件,以便选项卡更改生效。你可以用两种方法:

    1. 插入a qApp.processEvents() animation() runFunctions() ( qApp 在中 PyQt5.QtWidgets )
    2. 呼叫 运行函数() 通过单次计时器: QTimer.singleShot(0, runFunctions) ,哪个学校 runFunctions 通过事件循环,因此将首先处理任何挂起的事件(因为 运行函数() 是最新添加的),则 运行函数() 将被呼叫。如果你真的有参数 运行函数() ,使用lambda。

    我喜欢第一种方法,因为我发现它更清楚地表明了正在发生的事情(事件需要处理),但我建议在该行中添加一条注释,“这样堆栈选项卡可以更改”。

    顺便说一下,您应该使用“signal.connect(slot)”格式的新型符号来表示信号插槽连接,更简洁:

    self.StartBtn.clicked.connect(self.start)
    

    因此,对于方法#1,您的代码如下所示:

    from PyQt5.QtWidgets import qApp
    
    ...
    self.StartBtn.clicked.connect(self.start)
    ...
    
    def start(self):
        self.nextPage()
        self.animation()
        qApp.processEvents()
        self.runFunctions()
    
    ...