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

时间:2014-04-17 14:59:44

标签: c++ qt

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

class MainWindow : public QMainWindow
{
    Q_OBJECT
    public:
    QString fileName();
};
MainWindow.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:\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 

My Main.cpp

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

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

    return a.exec();
}

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

1 个答案:

答案 0 :(得分:3)

您无法将窗口小部件创建为全局对象,因为这些对象将在主函数中的应用程序对象之前创建。然后你的错误就会发生。

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