Results 1 to 2 of 2

Thread: QGLWidget don't draw in its place in the layout

  1. #1
    Join Date
    Oct 2011
    Posts
    5
    Qt products
    Qt4
    Platforms
    Unix/X11

    Question QGLWidget don't draw in its place in the layout

    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?

  2. #2
    Join Date
    Oct 2009
    Posts
    4
    Qt products
    Qt4
    Platforms
    MacOS X Unix/X11 Windows

    Default Re: QGLWidget don't draw in its place in the layout

    Try with a QGridLayout, you should get the same result.

Similar Threads

  1. QGLWidget: Draw 100% of image (even when hidden)
    By JohnnyRep in forum Qt Programming
    Replies: 5
    Last Post: 28th January 2016, 14:46
  2. Replies: 1
    Last Post: 27th August 2011, 15:10
  3. Replies: 10
    Last Post: 10th February 2011, 23:31
  4. Replies: 0
    Last Post: 25th May 2009, 10:00
  5. Using QGLWidget paint engine to draw regular widgtes?
    By high_flyer in forum Qt Programming
    Replies: 11
    Last Post: 9th October 2006, 12:06

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.