在C ++中,我怎么能等到满足条件,例如 - 伪代码:
bool con = false;
waituntil(con);
//do whatever
答案 0 :(得分:2)
如果您使用的是Qt API,可以使用QEventLoop,如下所示:
QEventLoop loop;
QWidget::connect(lineEdit, SIGNAL(editingFinished()), &loop, SLOT(quit()));
loop.exec();
您的应用程序在继续作出响应的同时,但在QLineEdit对象完成编辑之前不会退出该循环。
您可以自由使用任何与您相关的信号,甚至可以在用户点击QLineEdit时立即创建自定义信号
答案 1 :(得分:-1)
在回应The Badger的评论时,我为太模糊而道歉。 以下是对以下代码如何运作的完整解释。
您可以使用Q_PROPERTY宏以及类似@TheRealNox描述的方法。
原始帖子询问当con等于true时如何执行特定操作 它说:
waituntil(con);
// do whatever
嗯,下面我概述了一种可以使用Qt执行操作的方法,只要布尔类型对象名为" con"变化。此方法使用Q_PROPERTY通过指定NOTIFY关键字来设置要发出的信号。
Q_PROPERTY(bool con MEMBER con NOTIFY con_changed)
这里要注意的重要部分是NOTIFY con_changed部分。 通过添加单词NOTIFY后跟一个信号(在这种情况下为con_changed),基本上每当MEMBER发生变化时(在这种情况下" con"),它就会发出信号" con_changed"以便你的程序的其他部分可以"听到"信号并作出相应的反应。
让我们看一下这个示例头文件,这个例子在下面进行了解释。
在myclass.h中
class MyClass : public QObject {
// emits the 'con_changed' signal whenever con changes
Q_PROPERTY(bool con MEMBER con NOTIFY con_changed)
Q_OBJECT
public:
MyClass(QObject *parent = 0);
bool con;
signals:
void con_changed(bool new_con_value);
public slots:
void check_con_value(bool new_con_value);
}
现在,如果您查看第一个框中的代码,您会注意到我已使用"信号指定了SIGNAL:"与Q_PROPERTY的NOTIFY参数中提到的签名(名称)相同的宏。 (在这种情况下,它是con_changed)
信号本质上是对象使用Qt与另一个对象通信的一种方式,并且是线程安全的。
同样在上面的代码中,您应该注意到还有一个"公共插槽:"我定义方法的部分" check_con_value(bool new_con_value)。
这将是一个连接到信号" con_changed"的插槽,基本上是这样,只要" con_changed"信号被发送,它将自动导致插槽:" check_con_value"执行。但是,截至目前,插槽check_con_value和con_changed尚未连接在一起,我们将在下一个文件中进行连接。
myclass.cpp中的
#include "myclass.h"
MyClass::MyClass(QObject* parent) : QObject(parent) {
con = false;
// connect the con_changed signal to execute check_con_value
connect(this, SIGNAL(con_changed(bool),
this, SLOT(check_con_value(bool));
}
void MyClass::check_con_value(bool new_con_value) {
if (new_con_value == true) {
/***********
*
* here's where you perform whatever actions you want
*
**/
}
}
上面的代码中有两件事情需要注意。
首先,我已经连接了信号" con_changed"到插槽" check_con_value"通过使用connect方法。基本上通过键入connect(发送者,SIGNAL,接收者,SLOT)来连接工作。我觉得解释连接超出了这个响应的范围,但无论如何,
上面发生的第二件事是我们已经输入了" check_con_value" slot,只要con_changed作为信号发送就会执行。在那个插槽里面你会注意到有一个条件if语句:
if (new_con_value == true) {
// execute your code here.
}
所以,基本上这意味着,如果你使用Q_PROPERTY定义设置程序,那么只要你想等到con为真,然后在发生这种情况时执行一些代码,你可以将con设置为false,如下所示:
con = false;
然后只要它变为true,代码就会执行。
这可能过于复杂,但原来的帖子只是一个句子,因此根据其中包含的信息,这就像我真正能够回答他们的问题一样接近。
还有其他解决方案,根据此特定功能的使用情况,这可能是也可能不是设置等待条件的理想方式。
事实上,还有其他更简单的解决方案,但这种方式是一种更有条理,更干净的方式来执行所需的功能。
我想这一切都取决于用例是什么,OP没有包含在内。
答案 2 :(得分:-2)
要等到条件满足,您需要让程序循环包含条件的代码部分。
例如:
bool con = false;
while(programIsRunning) {
//your program
while(con) {
//wait until con
}
}