猿问

在 PyQt5 中 3 秒后自动更改 Stacked Widget 索引

我正在尝试显示堆叠小部件的第一页(欢迎页面),并在 3 秒后自动将其替换为第二页(菜单页面)。


我试过这种方法,但它不起作用..


..........


self.stackedWidget.setCurrentIndex(0)

time.sleep(3) 

self.stackedWidget.setCurrentIndex(1) 

QtCore.QMetaObject.connectSlotsByName(smartUpdaterUI)


..............


繁星淼淼
浏览 83回答 2
2回答

摇曳的蔷薇

Qt 使用 GUI 事件循环来处理事件并更新 UI。在将控制权移交给事件循环并获取和处理该更新之前,对 GUI 的任何更新都将不可见。您用 Python 编写的代码与 GUI 发生在同一线程中。因此,当您的代码正在运行时,事件循环不是,并且不会处理更改。旁注:这就是为什么如果您尝试执行一些长时间运行的操作(例如访问 API)而不使用单独的线程,您的应用程序会“挂起”。在您的代码中,您将当前索引设置为0,然后使用 Pythontime.sleep()等待,然后再更新为 index 1。self.stackedWidget.setCurrentIndex(0)time.sleep(3) # no event loop running hereself.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)

莫回无

void QTimer::singleShot(int msec, const QObject *receiver, const char *member)这个静态函数在给定的时间间隔后调用一个槽。尝试一下:import sysfrom 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()        
随时随地看视频慕课网APP

相关分类

Python
我要回答