Qt 必须在 QWidget 之前构造 QApplication
Posted
技术标签:
【中文标题】Qt 必须在 QWidget 之前构造 QApplication【英文标题】:Qt must construct QApplication before a QWidget 【发布时间】:2017-01-17 07:18:48 【问题描述】:Qt 最近开始在没有原因的情况下崩溃。由于以编程方式启动另一种形式,目前使我神经紧张的最近一个正在崩溃。 “必须在 QWidget 之前构建 QApplication”显然是 Qt 5.7.* 版本的常见问题,而我目前在 *** 中找到的解决方案对我没有帮助。
这是我在应用程序崩溃后收到的错误消息的屏幕截图:
这是我删除的代码,它允许我重新启动应用程序而不会出现任何明显的问题:
#include "operations.h"
Operations o;
void mainWindow::on_thisButton_clicked()
o.show();
this->hide();
----
请求的 main.cpp :)
#include "mainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
QApplication a(argc, argv);
mainWindow w;
w.show();
return a.exec();
【问题讨论】:
错误在您的main()
函数中。贴出它的代码。
我刚刚添加了。
不清楚但你可以看到this或this
你的Operations
班级使用QWidget-inherited class
吗?
Debugging: QWidget: Must construct a QApplication before a QWidget & Invalid parameter passed to C runtime function的可能重复
【参考方案1】:
试试这个:
#include "operations.h"
void mainWindow::on_thisButton_clicked()
Operations *o = new Operations();
o->show();
this->hide();
如果您不想在每次单击按钮时都创建一个新的,您可能希望将Operations *o
声明为mainWindow
的成员并在构造函数中对其进行初始化。
【讨论】:
这是迄今为止最好的解决方案。它将使您可以访问 MainWindow 类中的所有操作 *o,并防止错误发生。【参考方案2】:“必须在 QWidget 之前构造 QApplication”是您使用 Qt 应用程序时遇到的标准错误类型,当链接不兼容的东西时(例如混合调试/发布)。
所以在大多数用例中,这表明存在构建问题,与代码本身无关。
【讨论】:
【参考方案3】:不要将操作对象创建为全局变量,因为它将在运行 main() 之前创建为静态对象,因此错误消息是正确且相关的。这是一个 C++ 问题,而不是 Qt 问题。 所有其他建议都有效,因为您现在在正确的时间创建对象,在 QApplication 之后...
【讨论】:
不是纯C++的问题,因为是Qt的限制,在构造QApplication
之前可能没有初始化Operations
。
嗯,我认为这是一个纯粹的 C++ 问题,因为它可能发生在任何具有相互依赖关系的类中【参考方案4】:
好的,我已经设法找到了解决方案,但是,它是边缘白痴,因为它没有任何意义为什么它不能在以前的状态下工作。从技术上讲,为了不出现错误,您需要做的就是将您所引用的表单类的声明粘贴在函数本身中(即Operations o;
)。
这是代码解决方案本身:
#include "operations.h"
void mainWindow::on_thisButton_clicked()
Operations o;
o.show();
this->hide();
请记住,这并不是所有问题的结束,因为我目前遇到的问题是新表单在打开的 1 秒内关闭。如果我设法解决它,我将更新我的解决方案。
【讨论】:
就像@Florent 建议你的操作必须继承QWidget。当您在函数范围之外声明它时,它会在 main() 执行之前被初始化,因此您的问题中会出现错误。当你在函数中声明它时,它会在函数退出时被销毁,这就是它立即关闭的原因。以上是关于Qt 必须在 QWidget 之前构造 QApplication的主要内容,如果未能解决你的问题,请参考以下文章
必须在传递给 C 运行时函数的 QWidget 和无效参数之前构造一个 QApplication