Qt fixed bug with OpenGL, and save issue reported in #520
authorYannick Verdie <no@email>
Sat, 14 Aug 2010 18:36:53 +0000 (18:36 +0000)
committerYannick Verdie <no@email>
Sat, 14 Aug 2010 18:36:53 +0000 (18:36 +0000)
CMakeLists.txt
modules/highgui/src/window_QT.cpp

index a84cfc8..a752b2d 100644 (file)
@@ -532,12 +532,14 @@ if (WITH_QT)
 \r
 \r
                #if (NOT WIN32)\r
+               if (WITH_QT_OPENGL)\r
                        if (QT_QTOPENGL_FOUND AND OPENGL_FOUND)\r
                                set(HAVE_QT_OPENGL 1)\r
                                add_definitions(-DHAVE_QT_OPENGL)\r
-                               link_directories("${OPENGL_LIBRARIES}")\r
+                               #link_directories("${OPENGL_LIBRARIES}")\r
                                set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${OPENGL_LIBRARIES})\r
                        endif()\r
+                endif()\r
         #endif()\r
         \r
     endif()\r
index 75af80c..864f46e 100755 (executable)
@@ -804,10 +804,12 @@ void GuiReceiver::setPropWindow(QString name, double arg2 )
        case  CV_WINDOW_NORMAL:
                w->myGlobalLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
                w->param_flags = flags;
+
                break;
        case  CV_WINDOW_AUTOSIZE:
                w->myGlobalLayout->setSizeConstraint(QLayout::SetFixedSize);
                w->param_flags = flags;
+
                break;
        default:;
        }
@@ -1584,6 +1586,9 @@ void CvWindow::createGlobalLayout()
 
        if (param_flags == CV_WINDOW_AUTOSIZE)
                myGlobalLayout->setSizeConstraint(QLayout::SetFixedSize);
+
+       if (param_flags == CV_WINDOW_NORMAL)
+               myGlobalLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
 }
 
 void CvWindow::createBarLayout()
@@ -1625,6 +1630,7 @@ void CvWindow::createShortcuts()
 void CvWindow::createView(int mode, int ratio)
 {
        //mode = CV_MODE_NORMAL or CV_MODE_OPENGL
+       //ratio = CV_WINDOW_KEEPRATIO or CV_WINDOW_FREERATIO
        myview = new ViewPort(this, mode,ratio);//parent, mode_display, keep_aspect_ratio
        myview->setAlignment(Qt::AlignHCenter);
 }
@@ -1947,11 +1953,12 @@ void CvWindow::icvSaveTrackbars(QSettings *settings)
 ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
 {
        centralWidget = arg,
-               setParent(centralWidget);
+       setParent(centralWidget);
        mode_display = arg2;
        param_keepRatio = arg3;
 
-       setupViewport(centralWidget);
+
+       //setAlignment(Qt::AlignLeft | Qt::AlignTop);
        setContentsMargins(0,0,0,0);
 
        setObjectName(QString::fromUtf8("graphicsView"));
@@ -1965,6 +1972,8 @@ ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
        mouseCoordinate = QPoint(-1,-1);
        on_openGL_draw3D = NULL;
 
+       //no border
+       setStyleSheet( "QGraphicsView { border-style: none; }" ); 
 
 #if defined( HAVE_QT_OPENGL )
        
@@ -1994,12 +2003,16 @@ ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
                zmax = DEFAULT_ZMAX;
                initGL();
        }
-       
+#else
+       setViewport(centralWidget);
 #endif
 
-       image2Draw_ipl=cvCreateImage(cvSize(centralWidget->width(),centralWidget->height()),IPL_DEPTH_8U,3);
-       image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
-       image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
+       image2Draw_ipl=cvCreateImage(cvSize(viewport()->width(),viewport()->height()),IPL_DEPTH_8U,3);
+       //image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
+       //image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
+       
+       //setupViewport(viewport());//centralWidget
+       //setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
 
        nbChannelOriginImage = 0;
        cvZero(image2Draw_ipl);
@@ -2044,9 +2057,13 @@ void ViewPort::saveView()
        {
                QString extension = fileName.right(3);
 
+
 #if defined( HAVE_QT_OPENGL )
                image2Draw_qt_resized = ((QGLWidget*)viewport())->grabFrameBuffer();
 #else
+               //   (no need anymore) create the image resized to receive the 'screenshot'
+               //    image2Draw_qt_resized = QImage(viewport()->width(), viewport()->height(),QImage::Format_RGB888);
+               
                QPainter saveimage(&image2Draw_qt_resized);
                this->render(&saveimage);
 #endif
@@ -2169,21 +2186,25 @@ void ViewPort::updateImage(void* arr)
        //CV_Error(CV_StsNullPtr, "NULL arr pointer (in showImage)" );
        CV_Assert(arr)
 
-               IplImage* tempImage = (IplImage*)arr;
+       IplImage* tempImage = (IplImage*)arr;
 
        if (!isSameSize(image2Draw_ipl,tempImage))
        {
                cvReleaseImage(&image2Draw_ipl);
+
+               //the image in ipl (to do a deep copy with cvCvtColor)
                image2Draw_ipl=cvCreateImage(cvGetSize(tempImage),IPL_DEPTH_8U,3);
-               image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
-               image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
 
+               //the ipl image in qt format (with shared memory)
+               //image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
 
                nbChannelOriginImage = tempImage->nChannels;
+
                updateGeometry();
        }
 
-       cvConvertImage(tempImage,image2Draw_ipl,CV_CVTIMG_SWAP_RB );
+       cvCvtColor(tempImage,image2Draw_ipl,CV_BGR2RGB);
+       //cvConvertImage(tempImage,image2Draw_ipl,CV_CVTIMG_SWAP_RB );
 
        viewport()->update();
 }
@@ -2445,6 +2466,7 @@ QSize ViewPort::sizeHint() const
 {
        if(image2Draw_ipl)
        {
+               //qDebug()<<centralWidget->param_name<<" "<<image2Draw_ipl->width<<" "<<image2Draw_ipl->height;
                return QSize(image2Draw_ipl->width,image2Draw_ipl->height);
        } else {
                return QGraphicsView::sizeHint();
@@ -2458,6 +2480,7 @@ void ViewPort::resizeEvent ( QResizeEvent *event)
        ratioX=width()/float(image2Draw_ipl->width);
        ratioY=height()/float(image2Draw_ipl->height);
 
+       
        if(param_keepRatio == CV_WINDOW_KEEPRATIO)//to keep the same aspect ratio
        {
                QSize newSize = QSize(image2Draw_ipl->width,image2Draw_ipl->height);
@@ -2519,7 +2542,7 @@ void ViewPort::paintEvent(QPaintEvent* event)
                if (param_matrixWorld.m11()>=threshold_zoom_img_region)
                {
                        if (centralWidget->param_flags == CV_WINDOW_NORMAL)
-                               startDisplayInfo("WARNING: The values displayed are the resized image's values. If you want the original image's values, use CV_WINDOW_AUTORESIZE", 1000);
+                               startDisplayInfo("WARNING: The values displayed are the resized image's values. If you want the original image's values, use CV_WINDOW_AUTOSIZE", 1000);
 
                        drawImgRegion(&myPainter);
                }
@@ -2540,8 +2563,10 @@ void ViewPort::paintEvent(QPaintEvent* event)
 
 void ViewPort::draw2D(QPainter *painter)
 {
-       image2Draw_qt_resized = image2Draw_qt.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
+       image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);
+       image2Draw_qt_resized = image2Draw_qt.scaled(viewport()->width(),viewport()->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
        painter->drawImage(0,0,image2Draw_qt_resized);
+       //painter->drawImage(0,0,image2Draw_qt_resized);
 }
 
 void ViewPort::drawStatusBar()