“必须在 QWidget 之前构建 QApplication”

Posted

技术标签:

【中文标题】“必须在 QWidget 之前构建 QApplication”【英文标题】:"Must construct a QApplication before a QWidget" 【发布时间】:2014-04-17 14:59:44 【问题描述】:

我正在尝试制作一个简单的 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   

ma​​in.cpp

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

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();

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

【问题讨论】:

但是错误信息非常有用,不是吗?您是否构建 QApplication 以及何时构建?请也显示您的 main() 函数。 还有很多代码缺失(例如mWinObj是什么?)。你能创建并发布一个SSCCE吗? 我错过了调用 folder.getSaveFileName 的地点和时间 你真正的主要功能是什么?如果先构造“a”,则不会发生“QWidget:必须在 QWidget 之前构造 QApplication”。还是您有任何小部件类型的全局对象? @falkb mWinObj 是实际代码中的全局对象。这是错误的原因吗? 【参考方案1】:

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

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

【讨论】:

以上是关于“必须在 QWidget 之前构建 QApplication”的主要内容,如果未能解决你的问题,请参考以下文章