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
Qt Code:
  1. #ifndef GLWIDGET_H
  2. #define GLWIDGET_H
  3.  
  4. #include <QGLWidget>
  5. #include <QtOpenGL>
  6. #include <opencv2/opencv.hpp>
  7. #include <QMutex>
  8. using namespace cv;
  9.  
  10. class GLWidget : public QGLWidget
  11. {
  12. Q_OBJECT
  13. public:
  14. GLWidget();
  15. void sendImage(Mat *img);
  16. protected:
  17. void initializeGL();
  18. void paintGL();
  19. void resizeGL(int width, int height);
  20. private:
  21. QImage qframe;
  22. QMutex mutex;
  23.  
  24. };
  25.  
  26. #endif // GLWIDGET_H
To copy to clipboard, switch view to plain text mode 

glwidget.cpp
Qt Code:
  1. #include "glwidget.h"
  2. #include <QMutexLocker>
  3.  
  4. GLWidget::GLWidget() : QGLWidget(QGLFormat(QGL::SampleBuffers)) {
  5. setMinimumSize(320,240);
  6. }
  7.  
  8. void GLWidget::initializeGL() {
  9. glClearColor(0.0f,0.0f,0.0f,1.0f);
  10. }
  11. void GLWidget::paintGL() {
  12. glClear (GL_COLOR_BUFFER_BIT);
  13. glClearColor (0.0,0.0,0.0,1.0);
  14. if (!qframe.isNull()) {
  15. qframe = qframe.scaled(this->size(), Qt::KeepAspectRatio,Qt::SmoothTransformation);
  16. glDisable(GL_DEPTH_TEST);
  17. glMatrixMode(GL_PROJECTION);
  18. glLoadIdentity();
  19. gluOrtho2D(0,qframe.width(),qframe.height(),0);
  20. glMatrixMode(GL_MODELVIEW);
  21. glLoadIdentity();
  22. glEnable(GL_TEXTURE_2D);
  23. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  24. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  25. glTexImage2D( GL_TEXTURE_2D, 0, 4, qframe.width(), qframe.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, qframe.bits() );
  26. glBegin(GL_QUADS);
  27. glTexCoord2f(0,0); glVertex2f(0,qframe.height());
  28. glTexCoord2f(0,1); glVertex2f(0,0);
  29. glTexCoord2f(1,1); glVertex2f(qframe.width(),0);
  30. glTexCoord2f(1,0); glVertex2f(qframe.width(),qframe.height());
  31. glEnd();
  32. glDisable(GL_TEXTURE_2D);
  33. glFlush();
  34. }
  35. // qDebug() << "Drawing...";
  36. }
  37.  
  38. void GLWidget::resizeGL(int w, int h) {
  39. glViewport (0, 0, (GLsizei)w, (GLsizei)h);
  40. glMatrixMode (GL_PROJECTION);
  41. glLoadIdentity ();
  42. gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
  43. glMatrixMode (GL_MODELVIEW);
  44. // qDebug() << "Resizing...";
  45. }
  46.  
  47. void GLWidget::sendImage(Mat* img) {
  48. QMutexLocker l(&mutex);
  49. cvtColor(*img, *img, CV_GRAY2RGB);
  50. imwrite("ki.png", *img);
  51. qframe = QImage((const unsigned char*)(img->data), img->cols, img->rows, img->step, QImage::Format_RGB888).rgbSwapped();
  52. qframe = QGLWidget::convertToGLFormat(qframe);
  53. this->updateGL();
  54. }
To copy to clipboard, switch view to plain text mode 

mainwindow.h
Qt Code:
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QMainWindow>
  5. #include "borderlayout.h"
  6. #include "glwidget.h"
  7. #include "voxel.h"
  8. #include <QToolBar>
  9.  
  10. namespace Ui {
  11. class MainWindow;
  12. }
  13.  
  14. class MainWindow : public QMainWindow
  15. {
  16. Q_OBJECT
  17.  
  18. public:
  19. explicit MainWindow(QWidget *parent = 0);
  20. ~MainWindow();
  21.  
  22. public slots:
  23. void refresh(int num);
  24.  
  25. private:
  26. Ui::MainWindow *ui;
  27. BorderLayout *layout;
  28. QToolBar *leftToolbar;
  29. QToolBar *rightToolbar;
  30. QHBoxLayout *centralLayout;
  31. BorderLayout *leftImage;
  32. BorderLayout *rightImage;
  33. GLWidget *rgl;
  34. GLWidget *lgl;
  35. QSlider *lslider;
  36. QSlider *rslider;
  37. QHBoxLayout *box1;
  38. QHBoxLayout *box2;
  39. Voxel left;
  40. Voxel right;
  41. };
  42.  
  43. #endif // MAINWINDOW_H
To copy to clipboard, switch view to plain text mode 

mainwindow.cpp
Qt Code:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QDebug>
  4.  
  5. using namespace cv;
  6.  
  7. MainWindow::MainWindow(QWidget *parent) :
  8. QMainWindow(parent),
  9. ui(new Ui::MainWindow)
  10. {
  11. ui->setupUi(this);
  12. layout = new BorderLayout;
  13. leftToolbar = new QToolBar;
  14. leftToolbar->setOrientation(Qt::Vertical);
  15. leftToolbar->addAction("Hello");
  16. rightToolbar = new QToolBar;
  17. rightToolbar->setOrientation(Qt::Vertical);
  18. rightToolbar->addAction("Hello");
  19. rightToolbar->addAction("Heo");
  20. layout->addWidget(leftToolbar, BorderLayout::West);
  21. layout->addWidget(rightToolbar, BorderLayout::East);
  22. centralLayout = new QHBoxLayout();
  23. rightImage = new BorderLayout();
  24. leftImage = new BorderLayout();
  25. lgl = new GLWidget();
  26. rgl = new GLWidget();
  27. box1 = new QHBoxLayout();
  28. box2 = new QHBoxLayout();
  29. box1->addWidget(lgl);
  30. box2->addWidget(rgl);
  31. leftImage->add(box1, BorderLayout::Center);
  32. rightImage->add(box2, BorderLayout::Center);
  33. lslider = new QSlider(Qt::Horizontal);
  34. rslider = new QSlider(Qt::Horizontal);
  35.  
  36. connect(lslider,SIGNAL(valueChanged(int)),this, SLOT(refresh(int)));
  37. leftImage->addWidget(lslider,BorderLayout::South);
  38. rightImage->addWidget(rslider, BorderLayout::South);
  39. centralLayout->addLayout(leftImage);
  40. centralLayout->addLayout(rightImage);
  41. layout->add(centralLayout, BorderLayout::Center);
  42. ui->centralWidget->setLayout(layout);
  43. left.beolvas("airjet.hdr");
  44. lslider->setRange(0,left.numReteg()-1);
  45. /*for(int i = 0; i<59; i++){
  46.   qDebug() << sum(left[i]).val[0];
  47.   }
  48.   imshow("kep",left[20]);*/
  49. }
  50.  
  51. MainWindow::~MainWindow()
  52. {
  53. delete ui;
  54. delete layout;
  55. delete centralLayout;
  56. delete leftToolbar;
  57. delete rightToolbar;
  58. delete rightImage;
  59. delete leftImage;
  60. delete box1;
  61. delete box2;
  62. delete lgl;
  63. delete rgl;
  64. delete lslider;
  65. delete rslider;
  66. }
  67.  
  68. void MainWindow::refresh(int n){
  69. if(sender()==lslider){
  70. Mat a = left[n];
  71. lgl->sendImage(&a);
  72. Mat b = left[n];
  73. rgl->sendImage(&b);
  74. }else{
  75. Mat a = right[n];
  76. rgl->sendImage(&a);
  77. }
  78. }
To copy to clipboard, switch view to plain text mode 

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.
window.png

What's wrong?