2015-07-20 34 views
7

QOpenGLWidget kullanarak Qt içinde OpenGL kullanmaya çalışıyorum, ancak ilgili örnekleri bulmakta zorlanıyorum. OpenGL'de yeniyim, bu yüzden nasıl kullanacağımı öğrenmeye çalışıyorum, ancak bulduğum öğreticiler QOpenGLWidget'te özellikle iyi görünmüyor. Şu anda tek yapmak istediğim bir üçgen oluşturmak.QOpenGLWidget'te üçgeni nasıl oluştururum?

Şimdiye kadar sahip olduğum şeyler.

Başlık:

namespace Ui { 
class Widget; 
} 

class Widget : public QOpenGLWidget, protected QOpenGLFunctions 
{ 
public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 

protected: 
    void initializeGL(); 
    void resizeGL(int, int); 
    void paintGL(); 

private: 
    Ui::Widget *ui; 
}; 

Sınıf:

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

void Widget::initializeGL() 
{ 
    // Set up the rendering context, load shaders and other resources, etc.: 
    initializeOpenGLFunctions(); 
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 
} 

void Widget::resizeGL(int w, int h) 
{ 
    // Update projection matrix and other size-related settings: 
} 

void Widget::paintGL() 
{ 
    // Draw the scene: 
    glClear(GL_COLOR_BUFFER_BIT); 
} 

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

Ben sadece temel üçgen işlemek için kullanabileceği herhangi bir örnek var mı? Buradan birini denedim: https://www.khronos.org/assets/uploads/books/openglr_es_20_programming_guide_sample.pdf, ancak çalışamayacağım bir sürü hata attı.

Ayrıca OpenGL bağlamlarının QOpenGLWidget'te nasıl çalıştığını da bilmiyorum.

* DÜZENLEME: Bu nedenle, örneklerin dağıtımımın (Arch Linux) ayrı bir paketi olduğu ortaya çıkıyor. Onları yükleyebildim ve başlamak için orada bolca var gibi görünüyor.

Yardımlarınız için teşekkürler!

+0

sen sevk edilir GL (ES) örneklerini inceleyerek denediniz olduğunu Qt? QOpenGLWidget hakkında özel bir şey yok. – peppe

+0

Bu örnekleri nerede bulabilirim? – inefarius

+2

Qt ile gönderilir. OpenGL bölümü. http://doc.qt.io/qt-5/examples-widgets-opengl.html – peppe

cevap

19

QOpenGLWidgetQGLWidget'u kullanmak istemiyorsanız, bunu yapmanın yolu budur.

Qt Oluşturucu'yu açın ve Qt Widgets Uygulaması'nı seçin.

enter image description here

main.cpp

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

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

    return a.exec(); 
} 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

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

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

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 
şöyle Widget ve düğme ekleyin

Şimdi Yeni sınıf ekleyip Şimdi geri form ve widget'ındaki sağ tıklayıp gitmek

#include "oglwidget.h" 

OGLWidget::OGLWidget(QWidget *parent) 
    : QOpenGLWidget(parent) 
{ 

} 

OGLWidget::~OGLWidget() 
{ 

} 

void OGLWidget::initializeGL() 
{ 
    glClearColor(0,0,0,1); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); 
    glEnable(GL_COLOR_MATERIAL); 
} 

void OGLWidget::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_TRIANGLES); 
     glColor3f(1.0, 0.0, 0.0); 
     glVertex3f(-0.5, -0.5, 0); 
     glColor3f(0.0, 1.0, 0.0); 
     glVertex3f(0.5, -0.5, 0); 
     glColor3f(0.0, 0.0, 1.0); 
     glVertex3f(0.0, 0.5, 0); 
    glEnd(); 
} 

void OGLWidget::resizeGL(int w, int h) 
{ 
    glViewport(0,0,w,h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45, (float)w/h, 0.01, 100.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0,0,5,0,0,0,0,1,0); 
} 

oglwidget.cpp

#ifndef OGLWIDGET_H 
#define OGLWIDGET_H 

#include <QWidget> 
#include <QOpenGLWidget> 
#include <gl/GLU.h> 
#include <gl/GL.h> 

class OGLWidget : public QOpenGLWidget 
{ 
public: 
    OGLWidget(QWidget *parent = 0); 
    ~OGLWidget(); 

protected: 
    void initializeGL(); 
    void resizeGL(int w, int h); 
    void paintGL(); 
}; 

#endif // OGLWIDGET_H 
QOpenGLWidget

oglwidget.h miras edilmelidir OGLWidget adlandırın. tanıtılan widget'ları seçin ve OGLWidget tanıtılan sınıf adını yazın. Ekle düğmesine basın ve ardından tanıtın. Şimdi arka plan üzerine tıklayın ve özelliklerine gidin ve ApplicationModel'e windowModality'u değiştirin.

enter image description here

ve bu .pro dosyasıdır

enter image description here

almalısınız sonuç

#------------------------------------------------- 
# 
# Project created by QtCreator 2015-07-20T15:15:29 
# 
#------------------------------------------------- 

QT  += core gui opengl 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = test2 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp \ 
    oglwidget.cpp 

HEADERS += mainwindow.h \ 
    oglwidget.h 

FORMS += mainwindow.ui 
+0

Çok detaylı yanıt için teşekkürler. Yine de glBegin ve glEnd kullanımdan kaldırıldı mı? Ayrıca, GLU gerekli? – inefarius

+0

Bu sadece bir örnektir. Daha fazla bilgi istiyorsanız Qt'nin bazı örnekleri vardır. – CroCo

+2

Bu, QOpenGLWidget'deki işlevselliğin nasıl kullanılacağını göstermiyor. OpenGL'yi bu şekilde kullanmayı tercih ederseniz, QOpenGLWidget'i görebildiğim alt sınıflara ayırmanın bir amacı olmazdı. – steventaitinger

İlgili konular