嗨,我有一个程序,当按下按钮时,它应该移动到下一个堆叠的小部件,替换一些标签中的一些文本,然后执行一些功能,但这不起作用,当功能完成时,它会移到下一页代码为:
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,然后移动到下一个堆叠的小部件页面,加载动画图像,然后运行函数
您可能需要让Qt处理事件,以便选项卡更改生效。你可以用两种方法:
- 在
animation()
和runFunctions()
之间插入qApp.processEvents()
(qApp
在PyQt5.QtWidgets
中) - 通过单触发定时器调用
runFunctions()
:QTimer.singleShot(0, runFunctions)
,它将通过事件循环调用runFunctions
,因此任何挂起的事件都将首先被处理(因为runFunctions()
是最新添加的),然后调用runFunctions()
。如果您实际上有runFunctions()
的params,请使用lambda
我喜欢第一种方法,因为我发现它更清楚地指示了正在发生的事情(需要处理事件),但我也建议在那一行添加一条注释,"这样堆栈选项卡就可以更改"。
顺便说一句,你应该使用新型的信号插槽连接符号,更干净,形式为"signal.connect(插槽)":
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()
...