Я пытаюсь отобразить первую страницу сложного виджета (приветственная страница) и через 3 секунды автоматически заменить его на вторую страницу (страницу меню).
Я пробовал этот подход, но он не работает.
..........
self.stackedWidget.setCurrentIndex(0)
time.sleep(3)
self.stackedWidget.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(smartUpdaterUI)
..............
Qt использует цикл событий GUI для обработки событий и обновления пользовательского интерфейса. Любые обновления графического интерфейса не будут видны до тех пор, пока управление не будет передано циклу событий, и это обновление не будет получено и обработано.
Код, который вы пишете на Python, происходит в том же потоке, что и GUI. Поэтому, пока ваш код запущен, цикл событий не выполняется, и изменения не обрабатываются.
Замечание: поэтому ваше приложение может "зависать", если вы попытаетесь сделать что-то долгое, как доступ к API, без использования отдельного потока.
В вашем коде вы устанавливаете текущий индекс time.sleep()
0
, а затем используете Python time.sleep()
для ожидания до обновления до индекса 1
.
self.stackedWidget.setCurrentIndex(0)
time.sleep(3) # no event loop running here
self.stackedWidget.setCurrentIndex(1)
Пока выполняется time.sleep(3)
, выполнение выполняется в этот момент. Это означает, что управление не возвращается в цикл событий Qt, и первое изменение не обрабатывается. По завершении таймаута устанавливается второй индекс, и только тогда ваша функция возвращает управление обратно в Qt.
Цикл событий теперь применяет оба изменения, но сразу один за другим. Итак, все, что вы видите, - это индекс, установленный в 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 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()