在这个简单的示例中,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/