C++ QT在主类之外声明Mainwindow

C++ QT在主类之外声明Mainwindow,c++,qt,C++,Qt,我有两门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.

我有两门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
}
#包括“AL_GUI.h”
#包括
#包括“mainwindow.h”
GUI::GUI(){
}
void GUI::startGUI(){
int c=1;
字符*数组[10];
字符**v=&数组[0];
应用质量保证(c,v);
w、 show();
qa.exec();
}
void GUI::notifyAlert(){
}
GUI::~GUI(){
//TODO自动生成的析构函数存根
}
GUI.h

#包括
#包括“mainwindow.h”
#包括“mainwindow.h”
#ifndef GUI_H_
#定义图形用户界面_
类GUI{
公众:
GUI();
虚拟图形用户界面();
void startGUI();
void notifyAlert();
私人:
主窗口w;
};
#恩迪夫
但是当我运行这个程序时,我有一个错误: QWidget:必须在QPaintDevice之前构造QApplication

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

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

为什么不在创建GUI对象之前创建QApplication呢?

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


为什么不在创建GUI对象之前创建QApplication呢?

我会为MainWindow创建一个指针,用于转发声明,并从GUI.h中删除所有包含项(包括MainWindow.h的两个包含项)。然后就像Sebastian的回答说的,首先构造QApplication

阿鲁圭

#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;
}
#包括“AL_GUI.h”
#包括
#包括“mainwindow.h”
GUI::GUI():w(空)
{
}
void GUI::startGUI(){
int c=1;
字符*数组[10];
字符**v=&数组[0];
应用质量保证(c,v);
w=新的主窗口;
w->show();
qa.exec();
}
void GUI::notifyAlert(){
}
GUI::~GUI(){
删除w;
}

我会为MainWindow创建一个使用转发声明的指针,并从GUI.h中删除所有包含项(包括MainWindow.h的两个包含项)。然后就像Sebastian的回答说的,首先构造QApplication

阿鲁圭

#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;
}
#包括“AL_GUI.h”
#包括
#包括“mainwindow.h”
GUI::GUI():w(空)
{
}
void GUI::startGUI(){
int c=1;
字符*数组[10];
字符**v=&数组[0];
应用质量保证(c,v);
w=新的主窗口;
w->show();
qa.exec();
}
void GUI::notifyAlert(){
}
GUI::~GUI(){
删除w;
}

我会为MainWindow创建一个使用转发声明的指针,并从GUI.h中删除所有include(包括MainWindow.h的2个include)。然后,正如Sebastian的回答所说,首先构造QApplication。你可以给我发代码来这样做吗?我会为MainWindow创建一个指针,并从GUI.h中删除所有的include(包括MainWindow.h的两个include)。然后就像Sebastian的回答说的,首先构造QApplication。你可以给我发代码来这样做吗?因为我需要或MainWindow或QApplication,比如实例变量,对不起,我不明白你想说什么。我需要在gui中使用它。h有:private:MainWindow w;};或私人:QApplication qa;};或者两者都可以使用QApplication::instance()方法随时从任何地方访问QApplication对象(它是一个单例对象)。在GUI中有一个MainWindow成员就可以了。我的观点是,您应该在创建GUI对象的地方创建QApplication对象,而不是在startGui中。因为我需要或MainWindow或QApplication,例如实例变量,对不起,我不明白您想说什么。我需要在GUI中使用它。h有:private:MainWindow w;};或私人:QApplication qa;};或者两者都可以使用QApplication::instance()方法随时从任何地方访问QApplication对象(它是一个单例对象)。在GUI中有一个MainWindow成员就可以了。我的观点是,您应该在创建GUI对象的地方创建QApplication对象,而不是在startGui内部。