【问题标题】:QT declare Mainwindow out of the main classQT 在主类之外声明 Mainwindow
【发布时间】:2013-06-19 12:03:06
【问题描述】:

我在 c++ 中有这两个类

GUI.cpp

#include "AL_GUI.h"
#include <QtGui/QApplication>
#include "mainwindow.h"

GUI::GUI() {
}

void GUI::startGUI(){
    int c=1;
    char *array[10];
    char** v = &array[0];
    QApplication qa(c,v);
    w.show();
    qa.exec();
}
void GUI::notifyAlert(){

}

GUI::~GUI() {
    // TODO Auto-generated destructor stub
}

GUI.h

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

#ifndef GUI_H_
#define GUI_H_

class GUI {
public:
    GUI();
    virtual ~GUI();
    void startGUI();
    void notifyAlert();

private:
    MainWindow w;
};

#endif 

但是当我运行这个程序时,我遇到了错误: QWidget:必须在 QPaintDevice 之前构造一个 QApplication

如何在 gui.h 中声明 MainWindow w 以使我不会收到此错误

【问题讨论】:

  • 我会让 w 指针使用 MainWindow 的前向声明,并从 GUI.h 中删除所有包含(包括 mainwindow.h 的 2 个包含)。然后就像塞巴斯蒂安的回答说首先构建 QApplication 。
  • 你可以把代码发给我吗?

标签: c++ qt


【解决方案1】:

你不能(嗯,你可以,但你不应该)。 MainWindon 声明是正确的。问题是您在创建 QApplication 之前尝试创建 GUI 对象。

为什么不在创建 GUI 对象的地方创建 QApplication,就在它之前?

【讨论】:

  • 因为我需要或者MainWindow或者QApplication等实例变量
  • 对不起,我不明白你想说什么。
  • 我需要在 gui.h 中有: private: MainWindow w; };或私有:QApplication qa; };或两者兼而有之
  • 您可以随时使用 QApplication::instance() 方法从任何地方访问 QApplication 对象(它是一个单例)对象。
  • 在 GUI 中有一个 MainWindow 成员很好。我的观点是,您应该在创建 GUI 对象的地方创建 QApplication 对象,而不是在 startGui 中。
【解决方案2】:

我会让 w 指针使用 MainWindow 的前向声明,并从 GUI.h 中删除所有包含(包括 mainwindow.h 的 2 个包含)。然后就像塞巴斯蒂安的回答说首先构建 QApplication 。

AL_GUI.h

#ifndef GUI_H_
#define GUI_H_

class MainWindow;

class GUI {
public:
    GUI();
    virtual ~GUI();
    void startGUI();
    void notifyAlert();

private:
    MainWindow* w;
};

gui.cpp

#include "AL_GUI.h"
#include <QtGui/QApplication>
#include "mainwindow.h"

GUI::GUI()  : w(NULL)
{
}

void GUI::startGUI(){
    int c=1;
    char *array[10];
    char** v = &array[0];
    QApplication qa(c,v);
    w = new MainWindow;
    w->show();
    qa.exec();
}
void GUI::notifyAlert(){

}

GUI::~GUI() {
    delete w;
}

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多