Qt + OpenGL

0

Znam się trochę na OpenGl i tak samo słabo na Qt. Dlatego mam do was małe pytanie.
Otóż mam widget opengl w okienku Qt i wszystko dobrze działa. Natomiast nie mam pojęcia jak połączyć z sobą glwidget(widget OGL`a) i jakiś inny(np. Button).
Kod o którym mowa:

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();
    int xy;
    
private:
    Ui::MainWindow *ui;





};

#endif // MAINWINDOW_H

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


 

glwidget.h

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>
#include <QTimer>



class GLWidget : public QGLWidget
{

public:
    explicit GLWidget(QWidget *parent );

    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);

private:
    int xy2;
    QTimer tim;

public slots:



};

#endif // GLWIDGET_H
 

glwidget.cpp

 #include "glwidget.h"
#include <GL/glut.h>



GLWidget::GLWidget(QWidget * parent) : QGLWidget(parent)
{
    connect(&tim,SIGNAL(timeout()),this,SLOT(updateGL()));

    tim.start(16);
}

void GLWidget::initializeGL()
{
    glClearColor(0 , 0 , 0 , 0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
}

void GLWidget::paintGL()
{    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable( GL_SCISSOR_TEST );
 glScissor(-5,-5,900,5000);
glColor3f( 0, 0.5, 0.0 );
glRotatef(0.8,1,1,0);
glViewport(150,-50 ,600,600);
 glutSolidTeapot(0.5);

glMatrixMode(GL_PROJECTION);
//gluLookAt(0,0,3 ,0,0,0, 0,1,0);


}

void GLWidget::resizeGL(int w, int h)
{
    //glViewport(0,0,w,h);

    /*glLoadIdentity();
    gluPerspective(45,(float)w/h,2,10);

    gluLookAt(0,0,3 ,0,0,0, 0,1,0);*/
}

void GLWidget::Alert()
{
this->hide();
}

void GLWidget::Alert2()
{

}

I Main

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <GL/glut.h>


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

Chciałbym aby byle jaka wartość z MainWindow została przekazana do glwidget. Próbowałem to zrobić na chyba wszystkie moje sposoby, lecz żaden nie działa. Dlatego zwracam się do Was z prośbą o wskazanie mi jak to zrobić.
Z góry dziękuje za pomoc.

PS. Podobne pytanie zamieściłem również na innym forum, za co z góry przepraszam, ale niestety tam nie doczekałem się odpowiedzi.

0

Witam ponownie, spróbowałem zrobić coś takiego:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>


namespace Ui {
class MainWindow;
}
class GLWidget;
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    int xy;
    
private:
    Ui::MainWindow *ui;
GLWidget *Widget;


};
#endif // MAINWINDOW_H


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


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

    Widget = new GLWidget;
    connect(ui->pushButton,SIGNAL(clicked()),Widget,SLOT(click()));

}

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

Lecz niestety pojawia się błąd:
błąd 'GLWidget' : no appropriate default constructor available
W czym problem? ;/

0

zamień :

0

Zamień:
Widget = new GLWidget;

Na
Widget = new GLWidget();

Może zadziała jeżeli jest taki konstruktor.

0

Niestety błąd nadal ten sam ;(
Próbowałem również tak:
mainwindow

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



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


    connect(ui->pushButton,SIGNAL(clicked()),ui->widget,SLOT(ui->widget->click()));


}

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

glwidget

#include "glwidget.h"
#include <GL/glut.h>



GLWidget::GLWidget(QWidget * parent) : QGLWidget(parent)
{
    connect(&tim,SIGNAL(timeout()),this,SLOT(updateGL()));

    tim.start(50);
     qDebug("asd");
}

void GLWidget::initializeGL()
{
    glClearColor(0 , 0 , 0 , 0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
}

void GLWidget::paintGL()
{    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable( GL_SCISSOR_TEST );
 glScissor(-5,-5,900,5000);
glColor3f( 0, 0.5, 0.0 );
glRotatef(0.8,1,1,0);
glViewport(150,-50 ,600,600);
 glutSolidTeapot(0.5);

glMatrixMode(GL_PROJECTION);
//gluLookAt(0,0,3 ,0,0,0, 0,1,0);


}

void GLWidget::resizeGL(int w, int h)
{
    //glViewport(0,0,w,h);

    /*glLoadIdentity();
    gluPerspective(45,(float)w/h,2,10);

    gluLookAt(0,0,3 ,0,0,0, 0,1,0);*/
}

void GLWidget::click()
{ qDebug("asd");

}

Ale w logu drukuję, że No such slot QGLWidget::ui->widget->click()
Chyba już mi się skończyły wszystkie pomysły.

0

Tak jak napisane w komunikacie, nie masz pewnie zdefiniowanego slota, pokaż definicje GLWidget

0
connect(ui->pushButton,SIGNAL(clicked()),ui->widget,SLOT(ui->widget->click()));

zmień na:

connect(ui->pushButton,SIGNAL(clicked()),ui->widget,SLOT(click()));
0

Niestety, ale nadal to samo:
No such slot QGLWidget::click() in ..\nienazwany2\mainwindow.cpp:14
Headery:

#include "glwidget.h"
#include <GL/glut.h>



GLWidget::GLWidget(QWidget * parent) : QGLWidget(parent)
{
    connect(&tim,SIGNAL(timeout()),this,SLOT(updateGL()));

    tim.start(0);
     qDebug("asd");
}

void GLWidget::initializeGL()
{
    glClearColor(0 , 0 , 0 , 0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT7);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
}

void GLWidget::paintGL()
{    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable( GL_SCISSOR_TEST );
 glScissor(-5,-5,900,5000);
glColor3f( 0, 1, 0.0 );

glViewport(100,-150 ,800,800);
 glRotatef(1,1,1,0);
 glutSolidCube(0.5);

glMatrixMode(GL_PROJECTION);
//gluLookAt(0,0,3 ,0,0,0, 0,1,0);


}

void GLWidget::resizeGL(int w, int h)
{
    //glViewport(0,0,w,h);

    /*glLoadIdentity();
    gluPerspective(45,(float)w/h,2,10);

    gluLookAt(0,0,3 ,0,0,0, 0,1,0);*/
}

void GLWidget::click()
{ qDebug("asd");

}

mainwindow

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>
#include <QTimer>



class GLWidget : public QGLWidget
{

public:
    GLWidget(QWidget *parent );

    void initializeGL();
    void paintGL();
    void resizeGL(int w, int h);

private:
    int xy2;
    QTimer tim;

public slots:
    void click();

};

#endif // GLWIDGET_H
0

w klasie dodaj jeszcze Q_OBJECT bo nie widzę nigdzie. Poza tym wyczyść projekt i przebuduj go gdy wprowadzasz takie zmiany.

0

Powiedz dokladniej co chcesz zrobic bo sposobow jest kilka. Mozna uzyc sendEvent(object, event), mozna tez wywolac po prostu metode z widgeta ktora cos tam robi.

0

Dzięki matek3005.
Teraz jest już wszystko jak należy :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1