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

必须在 QWidget Pyqt5 之前构造 QApp

“必须在 QWidget 之前构建 QApplication”

在 Qt 创建者中提升 QWidget,构造函数的问题

带有 QWidget 的分段错误构造函数。 Qt/C++

ℰ悟透Qt┇Puzzle记录