C++ 与在应用程序中创建QMathGL类相关的错误

C++ 与在应用程序中创建QMathGL类相关的错误,c++,qt,qapplication,mathgl,C++,Qt,Qapplication,Mathgl,我对MathGL库和在应用程序中创建MathGL实例有问题。每次我尝试运行它时,都会出现一个错误,即QApplication必须在QWidget之前构造(类QMathGL从中继承)。您可以在下面找到我的main代码以及与MainWindow类连接的所有函数: mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "functions.h" #include "surface.h" #include "

我对MathGL库和在应用程序中创建MathGL实例有问题。每次我尝试运行它时,都会出现一个错误,即QApplication必须在QWidget之前构造(类QMathGL从中继承)。您可以在下面找到我的main代码以及与MainWindow类连接的所有函数:

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "functions.h"
#include "surface.h"
#include "error.h"
#include <QString>
#include <QFileDialog>
#include <GL/glut.h>
#include <cmath>
#include <fstream>
#include <mgl2/qmathgl.h>

surface graph;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_draw_clicked()
{
    string s;
    bool correct = 1;
    error *errorWindow = new error(this);
    s = ui->eqEdit->text().toStdString();
    period fPeriod = period(ui->upEdit->text().toDouble(),ui->lowEdit->text().toDouble());
    functionSum fSum = functionSum(s,fPeriod,ui->accEdit->text().toDouble());
    for (int i = 0; i < fSum.accuracy; i++)
    {
        for (int j = 0; j < fSum.accuracy; j++)
        {
            if(isnan(fSum.zValues[i][j]) || isinf(fSum.zValues[i][j]))
            {
                correct = 0;
            }
        }
    }
    if(!correct)
    {
        errorWindow->show();
    }
    graph = surface(fSum);
}


void MainWindow::on_save_clicked()
{
    QString plik;
    string splik;
    plik = QFileDialog::getSaveFileName(this,"Zapisz plik",QString(),"Pliki tekstowe (*.txt)");
    splik = plik.toStdString();
    ofstream saver;
    saver.open(splik.c_str());
    if (saver.is_open())
    {
        for(int i = 0; i < graph.points.size(); i++)
        {
            saver << graph.points[i].x << " " << graph.points[i].y << " " << graph.points[i].z << endl;
        }
        saver.close();
    }
}

void MainWindow::on_load_clicked()
{
    QString plik;
    string splik;
    plik = QFileDialog::getOpenFileName(this,"Otwórz plik",QString(),"Pliki tekstowe (*.txt)");
    splik = plik.toStdString();
    ifstream loader;
    loader.open(splik.c_str());
    graph.points.clear();
    if(loader.is_open())
    {
        while(!loader.eof())
        {
            point a(0,0,0);
            loader >> a.x >> a.y >> a.z;
            graph.points.push_back(a);
        }
        loader.close();
    }
}

void MainWindow::on_plot_clicked()
{
     int a = sqrt(graph.points.size());
     mglData x(a,a);
     mglData y(a,a);
     mglData z(a,a);
     long long int k = 0;
     for (long long int i = 0;i<sqrt(graph.points.size());i++)
     {
         for (long long int j = 0;j<sqrt(graph.points.size());j++)
         {
             x.a[i+a*j] = graph.points[k].x;
             y.a[i+a*j] = graph.points[k].y;
             z.a[i+a*j] = graph.points[k].z;
             k++;
         }
     }
     mglGraph plot;
     plot.Rotate(50,60);
     plot.Light(true);
     plot.Surf(x,y,z);
     QMathGL plotter;
     plotter.setGraph(&plot);
     plotter.show();
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括“functions.h”
#包括“surface.h”
#包括“error.h”
#包括
#包括
#包括
#包括
#包括
#包括
曲面图;
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在绘图时单击()
{
字符串s;
bool-correct=1;
错误*错误窗口=新错误(此错误);
s=ui->eqEdit->text().toStdString();
period fPeriod=period(ui->upEdit->text().toDouble(),ui->lowEdit->text().toDouble());
functionSum fSum=functionSum(s,fPeriod,ui->accEdit->text().toDouble());
对于(int i=0;i显示();
}
图形=表面(fSum);
}
void主窗口::在保存时单击()
{
QString-plik;
字符串splik;
plik=QFileDialog::getSaveFileName(这是“zapiszplik”,QString(),“Pliki-tekstowe(*.txt)”;
splik=plik.toStdString();
流节约器;
saver.open(splik.c_str());
if(saver.is_open())
{
对于(int i=0;i对于(long long int i=0;我有什么帮助的答案吗?
surface
类似乎是一个全局变量,要么继承自
QWidget
,要么尝试实例化一个
QWidget
。如果没有问题,请检查所有其他源文件,并确保没有任何widget是全局变量。surface不支持它来自QWidget的rit。它只是一个表示一组点的类。好的。现在开始最小化代码。您的目标是拥有一个单独的文件(just
main.cpp
)完全最小化的测试用例。换句话说,如果你从代码中删除任何一条语句,问题应该消失。通常,当你准备这样的最小化时,你会自己找到问题的根源。不过,你正在显示的代码似乎不是这个问题的根源。旁注:1.你不会看到图因为您在本地创建了一个<代码>绘图器< /> >,然后它立即退出了作为“代码> OnOpTultTyCKEXTION/Objult> Real. 2。您不必使用代码> Cuffe())/Field>一个IFFSULL——这是C++与RAI模式的结合点,并与实例的自动存储相结合。
#include "mainwindow.h"
#include <QApplication>


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