gpt4 book ai didi

c++ - MFC 应用程序中的 Qt DLL - 如何使 QDialog *真正* 模态?

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:00 24 4
gpt4 key购买 nike

目前我正在使用 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 的部分。

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

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

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

w.exec():执行事件循环。如果这有点像您想要的那样,QApplication::exec() 也应该可以工作。只需确保在完成后退出主事件循环即可。

w.exec():对话框关闭后不执行。它在显示对话框时 执行。它会阻塞,直到对话框关闭。所以你将开始执行它,显示对话框,关闭对话框,然后从它返回。阅读 exec() 的文档以了解更多信息。

关于c++ - MFC 应用程序中的 Qt DLL - 如何使 QDialog *真正* 模态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48668171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com