繁体   English   中英

必须在将QWidget和Invalid参数传递给C运行时函数之前构造QApplication

[英]Must construct a QApplication before a QWidget & Invalid parameter passed to C runtime function

我完成了从Qt4到Qt5的应用程序的迁移,它编译了所有内容,但它在某个时刻崩溃了。 我正在调试它,并试图找到原因,但我已达到死胡同:

这是堆栈:

在此输入图像描述

main.cpp第373行:

TouchSwibz w(NULL, NULL, renderMode ? renderMode : AppSettings::RASTERMODE);

当它到达断点并且我试图走得更远时,它会像往常一样崩溃

“此应用程序已请求运行时以不寻常的方式终止它。”

并且应用程序输出显示

QWidget: Must construct a QApplication before a QWidget
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

我想也许是因为在创建主窗口时窗口小部件正在初始化,但是可以做些什么来解决这个问题呢? 什么是一个好的解决方法? 我甚至都不知道这是不是真正的问题。 我使用Qt 5.2.1在Windows 7 x64下工作,使用mingw 4.8 32bit编译,应用程序也在32位。 一切都使用相同的工具包编译。 我不知道我能提供什么其他有用的信息。 我试着踩到QwtSlider构造函数但我不能。

我设法通过在调试模式下编译所有库来解决它,结果发布库处于发布模式,而在调试模式下构建应用程序将导致未定义的行为发生。

您最有可能拥有QWidget类型的非本地实例。 根据定义,这些将在main开始执行之前初始化,因此在构建QApplication之前。 下面的代码重现了这个问题:

#include <QLabel>
#include <QApplication>

QLabel label("Hello, world!");

int main(int argc, char ** argv)
{
  QApplication app(argc, argv);
  label.show();
  return app.exec();
}

修复是延迟构造,直到有一个QApplication对象:

#include <QLabel>
#include <QApplication>

// Won't ever be a dangling pointer.
QPointer<QLabel> label;

int main(int argc, char ** argv)
{
  QApplication app(argc, argv);
  QLabel label_("Hello, world!");
  label.reset(&label_);
  label->show();
  return app.exec();
}

我刚刚解决了类似的问题,这是我的详细情况和解决方案:

  • 我使用VS和Qt附加组件 ;

    • 和Qt版本是5.7 64位(但这并不重要)
  • 我在调试和发布模式下都成功编译了;

  • 我可以在调试模式下运行它,但不能在发布版本中运行它,这会导致按钮“必须在QWidget之前构建一个QApplication”。

  • [重要]我首先在DEBUG模式下编译和测试它,然后我遇到了一些鼓励我使用RELEASE模式的计算阈值。

  • [重要]我使用了一些与Qt GUI组件相关的第三方库 ,它要求您向项目添加外部依赖项。

  • [重要]我只是将Project Property页面中的配置从DEBUG复制到RELEASE,如外部C ++库或外部依赖项。

我终于找到了原因。 项目的“属性页”对话框 - >“链接器”文件夹 - >“输入属性”页 - >“其他依赖项”中 ,应将其中一个外部库替换为发行版本1,它具有不同的名称,在我的情况下, QGLViewerd2.libQGLViewer2.lib

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM