“必须在 QWidget 之前构造一个 QApplication”

Amo*_*kar 4 c++ qt

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

class MainWindow : public QMainWindow
{
    Q_OBJECT
    public:
    QString fileName();
};
Run Code Online (Sandbox Code Playgroud)

主窗口文件

QString MainWindow::fileName() {
    return "F:/Users/Admin/Desktop/" + dnldName;
}
Run Code Online (Sandbox Code Playgroud)

文件名()的用法

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Starting F:\Users\Admin\Desktop\Imp Docs\C++ apps\build-GUINetworkApp-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\GUINetworkApp.exe...
QWidget: Must construct a QApplication before a QWidget
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
F:\Users\Admin\Desktop\Imp Docs\C++ apps\build-GUINetworkApp-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\GUINetworkApp.exe exited with code 3   
Run Code Online (Sandbox Code Playgroud)

主程序

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

代码有什么问题,我该如何解决?

fal*_*lkb 5

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

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