MFC App中的QT DLL-如何使Qdialog *真正 *模式

Qt DLL in MFC app - How to make QDialog *really* modal?

本文关键字:Qdialog 真正 模式 何使 App 中的 QT DLL- MFC      更新时间:2023-10-16

目前,我正在开发一个Windows DLL,它使用 QT 5.9.2 (MSVC 2015编译器(,该Windows DLL应该由现有的商业MFC应用程序加载。应此应用程序的要求,应显示QDialog的模态实例。由于QApplication::exec()将阻止整个应用程序,因此我使用以下代码"模拟"事件循环:

void Core::createQApplicationInstance()
{
    // Check, if there's already a 'QApplication' instance running (unlikely)
    if (!QApplication::instance())
    {
        int argc = 1;
        // Create a new 'QApplication' instance
        m_app = new QApplication(argc, nullptr);
        // Create a 'QTimer' instance to call 'processEvents' periodically:
        // We can't run 'm_app->exec()' because it would block everything,
        // so we'll use this 'hacky-whacky' method here
        m_timer = new QTimer;
        // Connect the timer's timeout to the app's 'processEvents' via a lambda
        QObject::connect(
            m_timer,
            &QTimer::timeout,
            [&]()
            {
                m_app->processEvents();
            }
        );
        // Start the timer with the fixed 'message' interval
        m_timer->start(kMsgInterval);
    }
}

如果我的DLL现在应该显示一个模态对话框,则(部分(使用以下代码:

{...}
        case eUserIGeneral:
        {
            qDebug() << "<< eUserIGeneral";
            QDialog w;
            w.setModal(true);
            w.exec();
            // --> Code here is executed AFTER the dialog has been closed
        }
        break;
        //-------------------------------------------------------------------
{...}

在关闭对话框后,w.exec()之后的代码将实际执行(如预期的(。但是,主要应用程序仍然保持响应迅速,并且不受我对话的方式的影响,这不是我所期望的。

调用模式DLL对话框时,如何确保主应用程序中的输入是锁定的?

尽管我对您的问题没有真正的答案,但是您的代码有太多错误,无法在评论中正确解释。因此,我将此作为答案。

QApplication::exec():我强烈建议对其进行修改。如果您希望窗口是模态,为什么"阻止整个应用程序"直到关闭窗口是错误的?请注意,您不会阻止应用程序的QT部分,只有调用Exec的QT部分。

QTimer:计时器只能在事件循环中运行。因此,m_app->processEvents()要么永远不会执行,要么您已经运行了事件循环。无论哪种方式,计时器都没有用。

w.setModal():如果这对您不正确,请查看setWindowModality()

w.exec():忽略setModal()的值。阅读setModal()exec()的文档以了解更多信息。

w.exec():执行事件循环。如果这有所帮助您,QApplication::exec()也应该有效。只需确保完成后退出主事件循环即可。

w.exec():在对话框关闭后未执行。它是执行显示对话框的。它会阻止对话框关闭。因此,您将开始执行它,显示对话框,关闭对话框,然后返回。阅读exec()的文档以了解更多信息。