我有一个程序,它运行一系列步骤,用户在显示的图片上选择点。我不确定在用户选择这些点时暂停执行的正确方法。目前我正在使用这样的东西:
while(m_MouseCount < 2)
{
qApp->processEvents(QEventLoop::WaitForMoreEvents);
if(m_cancelFlag){
// disconnect mousePressSignal
return;
}
}
我遇到的问题是,在此循环期间关闭窗口时,程序会继续在后台运行。
我注意到有限状态机在这种情况下更适合使用,我在这里所做的是“可怕的伪同步”编程。但是如果我确实使用了FSM,我仍然会遇到等待FSM运行的问题,然后再进行下一个用户选择的测量。
是否有更好的方法等待用户输入?
修改
据我所知,Qt的UI是事件驱动的,通常不会暂停。我的程序如下:
我无论如何都没有看到某种暂停或等待。
答案 0 :(得分:2)
我不完全确定您的最终结果是什么,但在使用UI时,您通常不会尝试在自己的代码块/循环中等待任何事情。让QT /其他框架处理这些循环如何工作,这可能包括也可能不包括阻塞&#34;模态&#34;对话。
相反,你只是等待事情(事件)发生。在这种情况下,您可能希望等待QT告诉您用户点击了图像中的某个坐标,然后执行您想做的任何响应。
如果你关心用户在完成任务之前试图关闭窗口,那么也会有一个事件。
不是真正的代码。
//measurements may want to be a UI thing, such as a table or whatever
//is suitable for your use . You would then also have the ability to go
//back and make corrections, etc.
measurements.push_back(Measurement("Measurement Foo"));
measurements.push_back(Measurement("Measurement Bar"));
currentMeasurement = 0;
myImage->addMouseDownHandler(std::bind(&MyApp::onImageClickedOn, this));
...
void MyApp::startMeasurement()
{
auto &measurement = measurements[currentMeasurement];
delete fromMarker; fromMarker = nullptr;
instructionCtrl->setText(
"Please select two points to define " +
measurement.getName());
}
void MyApp::onImageClickedOn(MouseEvent event)
{
if (!fromMarker)
{ //Create a marker where the from/start point is
//Likely wants to be visual/ui object to aid user
fromMarker = new FromSelectMarker(myImage, event.mousePos);
}
else
{
//Second point
auto from = fromMarker.getPos();
auto to = event.mousePos;
auto &measurement = measurements[currentMeasurement];
measurement.setPositions(from, to);
++currentMeasurement;
if (currentMeasurement < measurements.size()
{
startMeasurement();
}
else
{
//finished, do next thing
}
}
}
如果你真的有一个复杂的用户序列经历了许多不同的有限状态&#34;使用某种形式的导航,然后可能是你想要的FSM框架。或者如果你没有一个简单的可用,你可以整理代码以获得类似的东西。