我正在做一个与网络相关的项目。最近我碰到这种情况。这只是一个存根

Class My_Class
{
public:
    My_Class();
    void start();
public slots():
    void after_Load_Function();
}

My_Class::My_Class()
{
    //Some initializations
    connect(WebPage,SIGNAL(finished()),this,SLOTS(after_Load_Function()));
}

void My_Class::start()
{
    WebPage->load();
}

void My_Class::after_Load_Function()
{
    //Do something with the finished WebPage
}

int main(int argc,char * argv[])
{
    //Some Qt things

    My_Class a;
    a.start();
}

完全加载后,“WebPage”将发出“完成”信号。
现在问题出在加载“webPage”之前,“start”正在返回。从而控制到达“主”。因此,现在控件仅应在“after_Load_Function”完成其工作之后才从“开始”返回。因此,我想要以下顺序,
  • main创建My_Class对象A。
  • 主要从A.调用
  • 开始调用从“WebPage”加载,并等待直到“WebPage”发出“完成”,
    并依次发出“after_Load_Function”和“after_Load_Function”
    完成工作。
  • 现在
  • ,“开始”返回
  • main返回

  • 但是,我不知道如何使这种等待条件。我该怎么办?

    最佳答案

    您可以通过运行本地事件循环来执行此操作,让组件处理网络收入并加载页面。当它们发出信号时,您可以在事件循环上执行一个插槽以将其退出。

    void My_Class::start()
    {
        QEventLoop qel;
        QObject::connect(WebPage, SIGNAL(finished()), &qel, SLOT(quit()));
    
        WebPage->load();
        qel.exec();
    }
    

    我以前一直在使用它,并且效果很好。我不建议经常使用它,因为它会处理事件,包括在调用start期间可能不希望start的调用者处理的事件,因此您需要将此事件记录给它的调用者。您可以通过将某些标志传递给QEventLoop::exec来阻止某些事件的处理,例如防止处理用户界面事件。

    10-04 23:36