Qt必须在QWidget之前构造QApplication

时间:2017-01-17 07:18:48

标签: c++ qt runtime-error

Qt最近开始崩溃而没有理由。由于以编程方式启动另一种形式,目前正在将我的神经紧张到纸浆的最新产品正在崩溃。 “必须在QWidget之前构建QApplication”显然是Qt 5.7。*版本的常见问题,而我在StackOverflow中找到的解决方案对我没有帮助。

这是我在应用程序崩溃后收到的错误消息的屏幕截图: crash image

以下是我删除的代码,它允许我重新启动应用程序而没有任何明显的问题:

#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();
}

4 个答案:

答案 0 :(得分:3)

试试这个:

#include "operations.h"

void mainWindow::on_thisButton_clicked()
{
    Operations *o = new Operations();
    o->show();
    this->hide();
}

您可能希望将Operations *o声明为mainWindow的成员,并在每次点击该按钮时不想创建新的构建器时将其初始化。

答案 1 :(得分:1)

不要将Operations对象创建为全局变量,因为它将作为运行main()的静态BEFORE创建,因此错误消息只是正确且相关。这是一个C ++问题,而不是Qt问题。 所有其他建议都有效,因为您现在可以在QApplication ...

之后的适当时间创建对象

答案 2 :(得分:0)

好吧,我已经设法找到了一个解决方案,然而,这是一种愚蠢的边缘,因为它没有任何意义,因为它不能在之前的状态下工作。从技术上讲,为了使错误不出现,你需要做的就是在函数本身中粘贴你所引用的表单类的声明(即Operations o;)。

这是代码解决方案本身:

#include "operations.h"

void mainWindow::on_thisButton_clicked()
{
    Operations o;
    o.show();
    this->hide();
}

请记住,这不是所有问题的结束,因为我现在遇到新表单在打开的同一个1秒内关闭的问题。如果我设法解决它,我将更新我的解决方案。

答案 3 :(得分:0)

“必须在QWidget之前构造QApplication”是Qt应用程序遇到的标准错误类型,当链接不兼容的东西时(如混合调试/发布)。

因此,在大多数用例中,这表示构建问题,并且与代码本身无关。