PDA

View Full Version : QGLWidget don't draw in its place in the layout



entee
14th October 2011, 16:57
Hi,

I have a reimplemented QGLWidget, which I added to a Layout. But it draw from the top-left corner of the window, not in its place in the layout.
My code:
glwidget.h

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>
#include <QtOpenGL>
#include <opencv2/opencv.hpp>
#include <QMutex>
using namespace cv;

class GLWidget : public QGLWidget
{
Q_OBJECT
public:
GLWidget();
void sendImage(Mat *img);
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
private:
QImage qframe;
QMutex mutex;

};

#endif // GLWIDGET_H

glwidget.cpp

#include "glwidget.h"
#include <QMutexLocker>

GLWidget::GLWidget() : QGLWidget(QGLFormat(QGL::SampleBuffers)) {
setMinimumSize(320,240);
}

void GLWidget::initializeGL() {
glClearColor(0.0f,0.0f,0.0f,1.0f);
}
void GLWidget::paintGL() {
glClear (GL_COLOR_BUFFER_BIT);
glClearColor (0.0,0.0,0.0,1.0);
if (!qframe.isNull()) {
qframe = qframe.scaled(this->size(), Qt::KeepAspectRatio,Qt::SmoothTransformation);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,qframe.width(),qframe.height(),0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D( GL_TEXTURE_2D, 0, 4, qframe.width(), qframe.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, qframe.bits() );
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex2f(0,qframe.height());
glTexCoord2f(0,1); glVertex2f(0,0);
glTexCoord2f(1,1); glVertex2f(qframe.width(),0);
glTexCoord2f(1,0); glVertex2f(qframe.width(),qframe.height());
glEnd();
glDisable(GL_TEXTURE_2D);
glFlush();
}
// qDebug() << "Drawing...";
}

void GLWidget::resizeGL(int w, int h) {
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
// qDebug() << "Resizing...";
}

void GLWidget::sendImage(Mat* img) {
QMutexLocker l(&mutex);
cvtColor(*img, *img, CV_GRAY2RGB);
imwrite("ki.png", *img);
qframe = QImage((const unsigned char*)(img->data), img->cols, img->rows, img->step, QImage::Format_RGB888).rgbSwapped();
qframe = QGLWidget::convertToGLFormat(qframe);
this->updateGL();
}


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "borderlayout.h"
#include "glwidget.h"
#include "voxel.h"
#include <QToolBar>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

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

public slots:
void refresh(int num);

private:
Ui::MainWindow *ui;
BorderLayout *layout;
QToolBar *leftToolbar;
QToolBar *rightToolbar;
QHBoxLayout *centralLayout;
BorderLayout *leftImage;
BorderLayout *rightImage;
GLWidget *rgl;
GLWidget *lgl;
QSlider *lslider;
QSlider *rslider;
QHBoxLayout *box1;
QHBoxLayout *box2;
Voxel left;
Voxel right;
};

#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

using namespace cv;

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
layout = new BorderLayout;
leftToolbar = new QToolBar;
leftToolbar->setOrientation(Qt::Vertical);
leftToolbar->addAction("Hello");
rightToolbar = new QToolBar;
rightToolbar->setOrientation(Qt::Vertical);
rightToolbar->addAction("Hello");
rightToolbar->addAction("Heo");
layout->addWidget(leftToolbar, BorderLayout::West);
layout->addWidget(rightToolbar, BorderLayout::East);
centralLayout = new QHBoxLayout();
rightImage = new BorderLayout();
leftImage = new BorderLayout();
lgl = new GLWidget();
rgl = new GLWidget();
box1 = new QHBoxLayout();
box2 = new QHBoxLayout();
box1->addWidget(lgl);
box2->addWidget(rgl);
leftImage->add(box1, BorderLayout::Center);
rightImage->add(box2, BorderLayout::Center);
lslider = new QSlider(Qt::Horizontal);
rslider = new QSlider(Qt::Horizontal);

connect(lslider,SIGNAL(valueChanged(int)),this, SLOT(refresh(int)));
leftImage->addWidget(lslider,BorderLayout::South);
rightImage->addWidget(rslider, BorderLayout::South);
centralLayout->addLayout(leftImage);
centralLayout->addLayout(rightImage);
layout->add(centralLayout, BorderLayout::Center);
ui->centralWidget->setLayout(layout);
left.beolvas("airjet.hdr");
lslider->setRange(0,left.numReteg()-1);
/*for(int i = 0; i<59; i++){
qDebug() << sum(left[i]).val[0];
}
imshow("kep",left[20]);*/
}

MainWindow::~MainWindow()
{
delete ui;
delete layout;
delete centralLayout;
delete leftToolbar;
delete rightToolbar;
delete rightImage;
delete leftImage;
delete box1;
delete box2;
delete lgl;
delete rgl;
delete lslider;
delete rslider;
}

void MainWindow::refresh(int n){
if(sender()==lslider){
Mat a = left[n];
lgl->sendImage(&a);
Mat b = left[n];
rgl->sendImage(&b);
}else{
Mat a = right[n];
rgl->sendImage(&a);
}
}


BorderLayout is come from qt example.

I think these are the relevant code.


I made a screenshot from my window.
The GLWidgets should be above the sliders.
6979

What's wrong?

finetjul
15th October 2011, 19:01
Try with a QGridLayout, you should get the same result.