MFC App中的QT DLL-如何使Qdialog *真正 *模式
Qt DLL in MFC app - How to make QDialog *really* modal?
目前,我正在开发一个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()
的文档以了解更多信息。
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 是否可以在C++中使变量真正只读
- boost odeint什么时候真正调用观测者
- 如何将真正的字符串从python c-api转换为python脚本
- "constinit"和"constexpr"之间的真正区别是什么?
- 自定义对话框(源自QDialog)不会关闭(Android)
- C++中真正的异步文件 IO
- QDialog 不能在 Windows 上退出,但在 MacOS 上不能退出/
- boost beast Websocket Multi Request Server/Client 并不是真正的 mul
- 如何获取类型是否真正可移动可构造
- 动态记忆的删除是如何真正起作用的
- QDialog自行关闭,我该如何解决?
- Qt5自定义QDialog,不使用qt创建器
- 当按下QDialog取消或确定时如何调用函数?
- 如何根据标题长度调整QDialog的大小?
- 如何获取具有 Freetype2 的真正类型字体支持的代码点列表 C++
- 构建一个真正、完全静态的Qt 5框架和应用程序(Qt 5.8之后)
- C++:当顺序真正重要时,如何保证在项目中包含头文件的顺序
- 如何通过 Qdialog 中的 qtablewidget 填充作为 MainWindow 成员的 qvector
- MFC App中的QT DLL-如何使Qdialog *真正 *模式