簡體   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