Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GUI中的Qt即时对象交互_C++_Qt - Fatal编程技术网

C++ GUI中的Qt即时对象交互

C++ GUI中的Qt即时对象交互,c++,qt,C++,Qt,在这个简单的示例中,pushButton1_clicked()通过setText()方法更改QLabel的文本: 这里,label1文本将被设置为“blabla”,但只有在按钮1_clicked()完成后(5秒后)。为什么?我希望在调用setText()方法的同一时刻对其进行更改,然后线程才能休眠5秒钟。Qt是如何实现的 提前谢谢 注:在Visual Studio 2012编译器中使用Qt 5.2。这是我在stackoverflow中的第一个答案,我今天注册了,如果我做错了什么,请原谅。 睡眠冻

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

这里,label1文本将被设置为“blabla”,但只有在按钮1_clicked()完成后(5秒后)。为什么?我希望在调用setText()方法的同一时刻对其进行更改,然后线程才能休眠5秒钟。Qt是如何实现的

提前谢谢


注:在Visual Studio 2012编译器中使用Qt 5.2。

这是我在stackoverflow中的第一个答案,我今天注册了,如果我做错了什么,请原谅。 睡眠冻结你的所有应用程序,这样你就可以使用QTest::qWait了 比如说

void MainWindow::on_pushButton_3_clicked()
{
    ui->label->setText("BLABLABLA"); //now we change the text
     //Sleep(5000);
    QTest::qWait(5000); //waiting, nothing happened
    qDebug() << "5 sec gone";//after 5 sec we can see this words
}
void主窗口::点击按钮3
{
ui->label->setText(“blabla”);//现在我们更改文本
//睡眠(5000);
QTest::qWait(5000);//等待,什么也没发生

qDebug()使用
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
};
class主窗口:公共QWidget{
QScopedPointer用户界面;
...
Q_插槽无效按钮1_单击(){
ui->label1->setText(“等待…”);
QTimer::singleShot(5000,this,SLOT(postWait());
}
Q_插槽无效后等待(){
ui->label1->setText(“等待完成”);
}
公众:
MainWindow(QWidget*parent=0):QWidget(parent),ui(新ui::MainWindow(this)){}
~MainWindow(){}//智能指针将自动删除子窗口小部件
};

让我们考虑一下这里的操作顺序:

  • GUI发出按钮按下的信号更改事件
  • 您的插槽被调用
  • 在插槽中,您正在排队等待小部件更新事件
  • 然后停止主事件循环5秒钟
  • 一旦执行返回到主事件循环,它就可以更新屏幕

这在任何平台上的任何类型的GUI上都是非常典型的行为。锁定GUI线程被认为是一种糟糕的做法——用户不希望界面锁定。相反,您应该使用一个,它不会阻止主事件循环。

您是说pushButton1\u clicked()是一个插槽,它在一个辅助线程中?@MrEricSir pushButton1\u clicked()默认情况下是一个插槽,但它不在第二个线程中。没有太多,我只是创建了一个新的Qt Widgets应用程序项目,并在其中添加了一个QPushButton和一个QLabel。这是一个糟糕的建议。
qWait
旋转一个事件循环,并将很高兴地重新输入您不希望重新输入的应用程序代码。不要介意引入hea将vy测试模块转换为生产应用程序。
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
};