Qt - 暂停执行程序以等待用户输入的正确方法是什么?

时间:2015-08-01 16:54:52

标签: c++ qt

我有一个程序,它运行一系列步骤,用户在显示的图片上选择点。我不确定在用户选择这些点时暂停执行的正确方法。目前我正在使用这样的东西:

while(m_MouseCount < 2)
{
    qApp->processEvents(QEventLoop::WaitForMoreEvents);
    if(m_cancelFlag){
        // disconnect mousePressSignal
        return;
    }
}

我遇到的问题是,在此循环期间关闭窗口时,程序会继续在后台运行。

我注意到有限状态机在这种情况下更适合使用,我在这里所做的是“可怕的伪同步”编程。但是如果我确实使用了FSM,我仍然会遇到等待FSM运行的问题,然后再进行下一个用户选择的测量。

是否有更好的方法等待用户输入?

修改

据我所知,Qt的UI是事件驱动的,通常不会暂停。我的程序如下:

  1. 用户会看到一张图片,并通过按钮显示一些选项(裁剪,开始分析,取消)
  2. 用户选择裁剪
  3. 提示用户选择一个矩形来裁剪图片(直到选中矩形程序“暂停” - 取消选项仍然存在)
  4. 用户选择完整分析
  5. 提示用户选择测量1。
  6. 程序“暂停”,直到选中两个点。
  7. 提示用户选择测量2。
  8. 程序“暂停”,直到选中两个点。
  9. 重复此过程,直到选择了所有测量值。
  10. 根据测量结果进行计算。
  11. 我无论如何都没有看到某种暂停或等待。

1 个答案:

答案 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框架。或者如果你没有一个简单的可用,你可以整理代码以获得类似的东西。