【问题标题】:window does not popup before process start -> tried sleep() method, but "fails"在进程开始之前没有弹出窗口->尝试了 sleep() 方法,但是“失败”
【发布时间】:2012-03-21 23:07:54
【问题描述】:

我尝试在某些进程启动之前使用 sleep 方法,只是为了让弹出窗口有时间出现:

    Processmethod()
{

    QDialog *ProcessMessage = new QDialog;      
    Ui::DialogProcessMessage Dialog;            
    Dialog.setupUi(ProcessMessage);             
    ProcessMessage->setModal(true);
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); 
    ProcessMessage->show();

    sleep(500);

    PROCESSES START                     
}

我的问题是,弹出窗口只是在进程完成后出现,而不是在进程开始之前出现。如果我停用应该在窗口出现后启动的进程,弹出窗口工作正常。负责弹出窗口的进程是否失败?我的错在哪里?问候

【问题讨论】:

    标签: c++ qt sleep qprocess


    【解决方案1】:

    添加

    qApp->processEvents();
    

    在睡眠电话之前。

    【讨论】:

    • 嗨,你能告诉我qApp->processEvents(); 的确切含义/作用吗? - 我在 qt 文档中阅读了它,但我不明白。我尝试了您的建议,并且在该过程现在开始之前也会弹出窗口,但是对话框文本丢失并且它不会留在我的 GUI 顶部,尽管我将其设置为 ProcessMessage->setModal(true);
    • qApp (qt-project.org/doc/qt-4.8/qapplication.html#qApp) 是一个指向 QApplication 实例的全局指针,它由 Qt 提供。 processEvents() (qt-project.org/doc/qt-4.8/qcoreapplication.html#processEvents) 是一种“刷新”主循环中排队的所有事件的方法,包括绘画和 gui 更新
    • 好的,但它仍然不能像我在第一条评论中写的那样正常工作。此外,processEvents() 方法可以防止 GUI 冻结,这不是我的目标。冻结很好,只是弹出窗口应该先弹出。
    【解决方案2】:

    我假设sleep 是 Windows 功能?不要使用它。稍后使用QTimer 启动进程:

    ProcessMessage->show();
    QTimer::singleShot(500, processObject, SLOT(start()));
    

    【讨论】:

    • 问题是弹窗后三个方法调用了三个进程。没有比 sleep() 更简单的方法了吗?
    • @Streight,因此,您必须创建自己的插槽来启动进程。有什么区别,您将如何开始流程?我不知道Sleep 将如何帮助您。它只是冻结应用程序,你不必冻结,我相信
    • 嗯,我不确定。我认为ProcessMessage->show(); 和进程启动之间的时间将是窗口无法弹出的问题,这就是我尝试使用 sleep() 的原因。但是现在我认为可能是以下过程阻碍了弹出窗口的出现。
    • @Streight,除非您等待进程终止,否则进程不能阻碍或冻结您的应用程序。你应该明白,除非你有超过 1 个线程,否则如果你删除所有 Sleep 函数,你的程序行为不会改变(通常)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多