2015-07-20 14 views
7

Tôi đang cố gắng sử dụng OpenGL bên trong Qt sử dụng QOpenGLWidget, nhưng tôi đang gặp khó khăn trong việc tìm kiếm bất kỳ ví dụ có liên quan nào. Tôi mới sử dụng OpenGL, vì vậy tôi đang cố gắng tìm hiểu cách sử dụng nó, nhưng các hướng dẫn mà tôi thấy dường như không áp dụng đặc biệt tốt trong QOpenGLWidget. Ngay bây giờ, tất cả những gì tôi muốn làm là vẽ một hình tam giác để bắt đầu.Làm cách nào để hiển thị hình tam giác trong QOpenGLWidget?

Đây là những gì tôi có cho đến nay.

Tiêu đề:

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; 
}; 

Class:

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; 
} 

Có bất kỳ ví dụ tôi có thể sử dụng để chỉ làm một tam giác cơ bản? Tôi đã thử một từ đây: https://www.khronos.org/assets/uploads/books/openglr_es_20_programming_guide_sample.pdf, nhưng nó đã ném rất nhiều lỗi mà tôi không thể làm việc ra ngoài.

Tôi cũng không biết ngữ cảnh OpenGL hoạt động như thế nào trong QOpenGLWidget.

* CHỈNH SỬA: Vì vậy, hóa ra là các ví dụ là một gói riêng biệt trên bản phân phối của tôi (Arch Linux). Tôi đã có thể cài đặt chúng, và có vẻ như có rất nhiều thứ để bắt đầu.

Cảm ơn sự giúp đỡ của bạn!

+0

Các bạn đã cố gắng nghiên cứu các ví dụ GL (ES) được vận chuyển với Qt? Không có gì đặc biệt về QOpenGLWidget. – peppe

+0

Tôi có thể tìm thấy những ví dụ này ở đâu? – inefarius

+2

Chúng được giao với Qt. Phần OpenGL. http://doc.qt.io/qt-5/examples-widgets-opengl.html – peppe

Trả lời

19

Nếu bạn muốn sử dụng QOpenGLWidget không QGLWidget, thì đây là cách để thực hiện.

Mở Qt Creator và chọn Ứng dụng tiện ích con Qt. Thêm nút Widget và đẩy như sau

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 

Bây giờ thêm New Class và đặt tên cho nó OGLWidget cần được thừa hưởng từ QOpenGLWidget

oglwidget.h

#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 

oglwidget.cpp

#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); 
} 

Bây giờ quay trở lại với hình thức và nhấp chuột phải vào widget. Chọn các tiện ích được quảng bá và nhập tên lớp được quảng bá OGLWidget. Nhấn nút thêm và sau đó quảng bá. Bây giờ bấm vào nền và đi đến các thuộc tính của nó và thay đổi windowModality để ApplicationModel.

enter image description here

và đây là kết quả bạn sẽ nhận được

enter image description here

file .pro

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

Cảm ơn phản hồi rất chi tiết. Tuy nhiên, không phải glBegin và glEnd đã phản đối? Ngoài ra, GLU có cần thiết không? – inefarius

+0

Đây là một ví dụ điển hình. Qt có một số ví dụ trong trường hợp bạn muốn biết thêm chi tiết. – CroCo

+2

Điều này không cho thấy cách sử dụng chức năng trong QOpenGLWidget. Nếu bạn sẽ chọn sử dụng OpenGL như thế này sẽ không có bất kỳ mục đích trong phân lớp QOpenGLWidget mà tôi có thể nhìn thấy. – steventaitinger

Các vấn đề liên quan