2 回答
TA贡献1793条经验 获得超6个赞
Qt 使用 GUI 事件循环来处理事件并更新 UI。在将控制权移交给事件循环并获取和处理该更新之前,对 GUI 的任何更新都将不可见。
您用 Python 编写的代码与 GUI 发生在同一线程中。因此,当您的代码正在运行时,事件循环不是,并且不会处理更改。
旁注:这就是为什么如果您尝试执行一些长时间运行的操作(例如访问 API)而不使用单独的线程,您的应用程序会“挂起”。
在您的代码中,您将当前索引设置为0,然后使用 Pythontime.sleep()等待,然后再更新为 index 1。
self.stackedWidget.setCurrentIndex(0)
time.sleep(3) # no event loop running here
self.stackedWidget.setCurrentIndex(1)
在time.sleep(3)发生时,执行在此时举行。这意味着不会将控制权交还给 Qt 事件循环,并且不会处理第一个更改。一旦超时完成,第二个索引被设置,然后你的函数将控制权返回给 Qt。
事件循环现在应用这两个更改,但立即一个接一个。所以你看到的只是 index 被设置为1,没有首先显示 0 并且没有任何延迟。
为了避免这种情况,您需要在设置初始索引后将控制权返回给事件循环。最简单的方法是设置它,然后使用异步QTimer.
self.stackedWidget.setCurrentIndex(0)
QTimer.singleShot(3000, lambda: self.stackedWidget.setCurrentIndex(1))
将lambda:被用作一个匿名函数,所以我们可以通过1对setCurrentIndex由直到计时器被触发延迟执行。如果你只跳到一个页面,你可以这样做:
def go_to_page_1(self):
self.stackedWidget.setCurrentIndex(1)
self.stackedWidget.setCurrentIndex(0)
QTimer.singleShot(3000, go_to_page_1)
TA贡献1865条经验 获得超7个赞
void QTimer::singleShot(int msec, const QObject *receiver, const char *member)
这个静态函数在给定的时间间隔后调用一个槽。
尝试一下:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class stackedExample(QWidget):
def __init__(self):
super(stackedExample, self).__init__()
self.leftlist = QListWidget()
self.leftlist.insertItem (0, 'Contact' )
self.leftlist.insertItem (1, 'Personal' )
self.leftlist.insertItem (2, 'Educational' )
self.stack1 = QWidget()
self.stack2 = QWidget()
self.stack3 = QWidget()
self.stack1UI()
self.stack2UI()
self.stack3UI()
self.stackWidget = QStackedWidget(self)
self.stackWidget.addWidget(self.stack1)
self.stackWidget.addWidget(self.stack2)
self.stackWidget.addWidget(self.stack3)
hbox = QHBoxLayout(self)
hbox.addWidget(self.leftlist)
hbox.addWidget(self.stackWidget)
self.setLayout(hbox)
self.leftlist.currentRowChanged.connect(self.display)
self.setGeometry(300, 50, 10, 10)
self.setWindowTitle('StackedWidget demo')
self.stackWidget.setCurrentIndex(0)
QTimer.singleShot(3000, lambda: self.display(1))
QTimer.singleShot(6000, lambda: self.display(2))
QTimer.singleShot(9000, lambda: self.display(0))
self.show()
def stack1UI(self):
layout = QFormLayout()
layout.addRow("Name", QLineEdit())
layout.addRow("Address", QLineEdit())
#self.setTabText(0,"Contact Details")
self.stack1.setLayout(layout)
def stack2UI(self):
layout = QFormLayout()
sex = QHBoxLayout()
sex.addWidget(QRadioButton("Male"))
sex.addWidget(QRadioButton("Female"))
layout.addRow(QLabel("Sex"),sex)
layout.addRow("Date of Birth",QLineEdit())
self.stack2.setLayout(layout)
def stack3UI(self):
layout = QHBoxLayout()
layout.addWidget(QLabel("subjects"))
layout.addWidget(QCheckBox("Physics"))
layout.addWidget(QCheckBox("Maths"))
self.stack3.setLayout(layout)
def display(self, i):
self.stackWidget.setCurrentIndex(i)
def main():
app = QApplication(sys.argv)
ex = stackedExample()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
添加回答
举报