setCurrentWidget применяется после окончания нажатого сигнала - PullRequest
0 голосов
/ 27 сентября 2018

Когда я создаю слоты по имени с таким синтаксисом:

on_<widgetname>_clicked();

Если я хочу отобразить определенный виджет Внутри этой функции он не будет отображаться, пока не достигнет конца функции.

То есть, когда я создаю следующую функцию:

void MyWindow::on_myWidget_clicked()
{
    // the stackedWidget is composed of:
    // page_1 with myWidget
    // page_2 

    ui->stackedWidget->setCurrentWidget(ui->page_2);
    waitSomeTime();
}

с

void MyWindow::waitSomeTime()
{
    QThread t;
    t.sleep(2); // Wait 2 seconds to see which line is going to be executed first.
}

Когда код запускается, сначала проходят 2 секунды и только затем страница_2

Почему строка

ui->stackedWidget->setCurrentWidget(ui->page_2);

не выполняется первой?

1 Ответ

0 голосов
/ 28 сентября 2018

void QThread :: sleep (unsigned long secs) [статические]
Заставляет текущий поток спать в течение секунд.

the waitSomeTime Функция переводит основной (текущий) поток в спящий режим, поэтому он блокирует все, даже обработку графического интерфейса.Как отметил @scopchanov, вы можете использовать QApplication :: processEvents () , который будет обрабатывать событие setCurrentWidget.Однако весь графический интерфейс пользователя будет по-прежнему заблокирован до тех пор, пока sleep не будет выполнен, что означает, что виджет будет отображаться, но не сможет обрабатывать какие-либо операции.

Так что было бы лучшеиспользуйте QTimer :: singleShot , если вы хотите отложить работу, или запустите другую новую QThread, чтобы сделать это.

...