Статья

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

Как встроить 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 WIDGETGLUTH #define WIDGETGLUTH

#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 MYFREEGLUTH #define MYFREEGLUTH

#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 sizex {0}; int sizey {0}; int positionx {0}; int positiony {0};

}; #endif // MYFREEGLUT_H

myfreeglut.cpp

#include «myfreeglut.h»

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

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

glutInitDisplayMode(GLUTSINGLE | GLUTRGB); glutInitWindowSize(sizex, sizey); glutInitWindowPosition( positionx, positiony) ; glutCreateWindow(»line»); MyFreeGlut::Init(); glutDisplayFunc(MyFreeGlut::LineSegment()); glutMainLoop();

}

int MyFreeGlut::Size(int x, int y) { sizex =x; sizey =y; }

int MyFreeGlut::Position(int x, int y) { positionx =x; positiony =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(GLCOLORBUFFERBIT); glColor3f(1.0, 0.0, 0.0); glBegin(GLLINES); glVertex2i (180, 15); glVertex2i (10, 145); glEnd(); glFlush(); }

Для ответа вы можете авторизоваться