Как встроить freeglut (библиотека примитивов на си) в qt класс qwidget?

timob256 timob256 22 Сентября 2022

Как встроить freeglut (библиотека примитивов на си) в qt класс qwidget.

Я знаю что в куте есть QOpenGLQWidget который может немного больше чем freeglut. Но для себя я хочу уметь встраивать freeglut окно в QWidget.

даже не знаю в какую сторону «копать» и не имею ни каких похожих примеров ( была у меня попытка вывести ogre 3d в виджете куте, но там так и не удалось избавиться от определенных артефактов).

Вот код:

main.cpp

#include "widgetglut.h"

#include <QApplication>
#include <QScreen>
#include <QDebug>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
     WidgetGlut w;
    //выставляем подстройку к размеру экрана
    QSize screenSize = qApp->screens().at(0)->availableSize();
    const int width = screenSize.width() / 2.5;
    const int height = screenSize.height() * 0.5;
    w.setGeometry((screenSize.width() - width) / 2.0,
                  (screenSize.height() - height) / 2.0,
                  width,
                  height);
    w.setWindowTitle("куте + бесплатный глут");

    w.setScale((float)width, (float)height);

    w.show();
    return a.exec();
}

widgetglut.h

#ifndef WIDGETGLUT_H
#define WIDGETGLUT_H

#include <QWidget>
#include "myfreeglut.h"

class WidgetGlut : public QWidget
{
    Q_OBJECT
public:
    WidgetGlut(QWidget *parent = 0);
    ~WidgetGlut();

protected:

private:


protected:
  QGridLayout* gl_layaout;
};

#endif // WIDGETGLUT_H

widgetglut.cpp

#include "widgetglut.h"

WidgetGlut::WidgetGlut(QWidget *parent)
    : QWidget(parent)
{
    gl_layaout = new QGridLayout(parent);
    MyFreeGlut * glutWindow = new MyFreeGlut ();
    glutWindow->Size(this->width,this->height);
    glutWindow->Position(this->x,this->y);

    QWidget *container = QWidget::createWindowContainer(glutWindow);
    gl_layaout->addWidget(container);

    this->setLayout(gl_layaout);

}

WidgetGlut::~WidgetGlut()
{

}

myfreeglut.h

#ifndef MYFREEGLUT_H
#define MYFREEGLUT_H

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <GL/freeglut.h>

class   MyFreeGlut
{
    public:
        MyFreeGlut() ;
        ~MyFreeGlut();

    int Size(int x, int y);
    int Plaise(int x, int y);

    void Init(void);
    void LineSegment(void);

    private:
    int    _size_x                      {0};
    int    _size_y                      {0};
    int    _position_x               {0};
    int    _position_y               {0};

};
#endif // MYFREEGLUT_H

myfreeglut.cpp

#include "myfreeglut.h"

MyFreeGlut::MyFreeGlut() 
{
      glutInit(&argc, argv);  //  как вызвать объявление freeglut корректно ? 

//   glutInitContextVersion(4, 3);
//   glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);

   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize(_size_x, _size_y);
   glutInitWindowPosition( _position_x, _position_y) ;
   glutCreateWindow("line");
   MyFreeGlut::Init();
  glutDisplayFunc(MyFreeGlut::LineSegment());
  glutMainLoop();

}

int MyFreeGlut::Size(int x, int y) 
{
    _size_x =x;
    _size_y =y;
}

int MyFreeGlut::Position(int x, int y) 
{
    _position_x =x;
    _position_y =y;
}

void MyFreeGlut::Init(void)
{
  glClearColor(1.0, 1.0, 1.0, 0.0);
  glMatrixMode(GL_PROJECTION);
  gluOrtho2D(0.0, 200.0, 0.0, 160.0);
}
void MyFreeGlut::LineSegment(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 0.0, 0.0);
  glBegin(GL_LINES);
  glVertex2i (180, 15);
  glVertex2i (10, 145);
  glEnd();
  glFlush();
}
Для ответа вы можете авторизоваться