"Must construct a QApplication before a QWidget"

"Must construct a QApplication before a QWidget"

本文关键字:QWidget before QApplication Must construct      更新时间:2023-10-16

我正在尝试制作一个简单的Qt程序。我已经成功地构建并运行了该程序好几次。当我添加了一个getter方法来将字符串从MainWindow传递到对话框的QFileDialog::getSaveFileName()时,就会出现这些错误。但当我在下面几行注释时,程序就会成功运行
主窗口.h

class MainWindow : public QMainWindow
{
    Q_OBJECT
    public:
    QString fileName();
};

主窗口.cpp

QString MainWindow::fileName() {
    return "F:/Users/Admin/Desktop/" + dnldName;
}

fileName()的用法

void Dialog::on_browseButton_clicked()
{
    QFileDialog folder;
    folder.setFileMode(QFileDialog::Directory);
    folder.setOption(QFileDialog::ShowDirsOnly);
    dirPath = folder.getSaveFileName(this, tr("Save File"), mWinObj.fileName(), tr("All Files"));
    ui->savePathEdit->setText(dirPath);
}

该程序构建成功,但在我尝试运行时出现以下错误。

Starting F:UsersAdminDesktopImp DocsC++ appsbuild-GUINetworkApp-Desktop_Qt_5_2_0_MinGW_32bit-DebugdebugGUINetworkApp.exe...
QWidget: Must construct a QApplication before a QWidget
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
F:UsersAdminDesktopImp DocsC++ appsbuild-GUINetworkApp-Desktop_Qt_5_2_0_MinGW_32bit-DebugdebugGUINetworkApp.exe exited with code 3   

main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

代码出了什么问题,我该如何修复?

您不能将小部件创建为全局对象,因为这些对象将在主函数中的应用程序对象之前创建。那么你的错误就会发生。

在构建QApplication对象后,在主函数中创建小部件,或者如果您想要全局访问,只需保留一个指向小部件的全局指针(但这不是一种好的编程风格)。