2

当我使用这种语法按名称创建插槽时:

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 秒,然后才显示 page_2。

为什么线

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

是不是先执行?

4

1 回答 1

1

void QThread::sleep(unsigned long secs) [静态]
强制当前线程休眠 secs 秒。

waitSomeTime函数使主(当前)线程休眠,因此它将阻止一切,甚至是 GUI 处理。正如@scopchanov 评论的那样,您可以使用QApplication::processEvents(),它将处理setCurrentWidget. 但是,在完成之前,整个 GUI 仍将被阻止sleep,这意味着小部件将被显示,但无法处理任何操作。

因此,如果您想延迟工作,或者开始另一个新的工作,最好使用QTimer::singleShotQThread

于 2018-09-28T00:39:49.163 回答