C++ 在Qt中,如何延迟成员函数';在收到信号之前,是否返回?

C++ 在Qt中,如何延迟成员函数';在收到信号之前,是否返回?,c++,qt,loops,recursion,C++,Qt,Loops,Recursion,我想使用一个递归过程来迭代Qt中的大量图像:本质上,图像被重复四分之一(达到一个极限),并询问用户图像是否通过或失败-即如果图像以大尺寸通过,我们将以更小的尺寸再次调用函数(直到达到极限),如果失败,我们将返回并向上传递层次结构 这种方法似乎遇到了Qt的事件驱动方法的障碍——我看不出在等待用户输入时如何暂停循环——也就是说,没有什么比“等待按钮按下”更有效的方法了 我知道这种方法在事件驱动编程中被视为一种反模式,但有什么替代方法不涉及在堆上保存大量的状态(而不是在堆栈上“免费”保存状态)?QEv

我想使用一个递归过程来迭代Qt中的大量图像:本质上,图像被重复四分之一(达到一个极限),并询问用户图像是否通过或失败-即如果图像以大尺寸通过,我们将以更小的尺寸再次调用函数(直到达到极限),如果失败,我们将返回并向上传递层次结构

这种方法似乎遇到了Qt的事件驱动方法的障碍——我看不出在等待用户输入时如何暂停循环——也就是说,没有什么比“等待按钮按下”更有效的方法了


我知道这种方法在事件驱动编程中被视为一种反模式,但有什么替代方法不涉及在堆上保存大量的状态(而不是在堆栈上“免费”保存状态)?

QEventLoop可能会对您有所帮助。我启动一个http连接,在一个超时的计时器旁边,所有这些都在一个线程内。然后等待其中一人完成并返回

void MyThread::run(){
  QNetworkAccessManager qnaManager;
  bool isPost = false;

  QUrl url(myUrl);
  QNetworkRequest req(url);
  QNetworkReply *reply;

  req.setHeader(QNetworkRequest::ContentTypeHeader,
            "application/json");
  req.setHeader(QNetworkRequest::ContentLengthHeader, 
            QVariant(postData.size()).toString());

  reply = qnaManager.get(req);

  QEventLoop eventLoop;
  QTimer timer;
  timer.setSingleShot(true);
  const int timeout = 400;
  timer.start(timeout);

  connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
  connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
  eventLoop.exec();

  if (timer.isActive()){
    //everything is ok
  }else{ 
    //timer elapsed, no replay 
    return;
  }

}

无论如何,最后我决定最好的方法是实现更多的消息传递代码——等待用户输入发送消息。它的代码比我使用/提供的“传统”回调类型范例要长,但它最终运行得很干净。

我不知道应用程序是如何工作的,但您可以使用
QMutex
QWaitCondition
停止线程,直到单击按钮或其他什么来解锁互斥锁。我猜你应该使用一个后台线程来执行你的操作。你为什么不使用一个模式对话框来进行用户输入呢?我已经考虑过了,但是要做到这一点需要很大的计算能力,你可以在循环中从递归方法调用qApp->processEvents(),直到你的槽被调用为止;这是一种丑陋且容易出错的方法(例如,当所有数据都在堆栈上时,如果用户决定退出应用程序会发生什么情况?),但它可能适用于您的用例。在我看来,使用模型对话框或自己的
QEventLoop
似乎是最好的解决方案。我不明白你为什么认为它需要很大的计算能力。