在这个简单的示例中,pushButton1_clicked()通过setText()方法更改QLabel的文本:

void MainWindow::pushButton1_clicked()
{
    ui->label1->setText("BLABLABLA");
    Sleep(5000);
}

在这里,label1文本将设置为“BLABLABLA”,但仅在pushButton1_clicked()完成之后(5秒后)。为什么?我希望在调用setText()方法的同时对它进行更改,然后线程才能休眠5秒钟。如何在Qt中完成?

提前致谢。

ps。将Qt 5.2与Visual Studio 2012编译器一起使用。

最佳答案

Sleep方法将GUI线程阻塞5秒钟。您应该绝不阻止GUI线程。在执行Sleep时,除本地异步过程调用外,该线程中的其他任何线程均不会运行。 setText方法仅调度小部件更新,而此时并不会重新绘制小部件。由于Sleep阻止控件返回事件循环,因此计划的更新不会发生。

如果要在按下按钮后延迟执行某些任务,则应使用计时器:

class MainWindow : public QWidget {
  QScopedPointer<Ui::MainWindow> ui;
  ...
  Q_SLOT void pushButton1_clicked() {
    ui->label1->setText("Waiting...");
    QTimer::singleShot(5000, this, SLOT(postWait()));
  }
  Q_SLOT void postWait() {
    ui->label1->setText("Finished waiting.");
  }
public:
  MainWindow(QWidget * parent = 0) : QWidget(parent), ui(new Ui::MainWindow(this)) {}
  ~MainWindow() {} // The smart pointer will delete the child widgets automatically
};

关于c++ - GUI中的Qt即时对象互通,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25098008/

10-11 22:48
查看更多