为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星淼淼 2021-06-18 15:01:26
我正在尝试显示堆叠小部件的第一页(欢迎页面),并在 3 秒后自动将其替换为第二页(菜单页面)。我试过这种方法,但它不起作用............self.stackedWidget.setCurrentIndex(0)time.sleep(3) self.stackedWidget.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(smartUpdaterUI)..............
查看完整描述

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)


查看完整回答
反对 回复 2021-06-22
?
莫回无

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()        



查看完整回答
反对 回复 2021-06-22
  • 2 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信