Qt bug with buttons
authorYannick Verdie <no@email>
Thu, 19 Aug 2010 10:36:57 +0000 (10:36 +0000)
committerYannick Verdie <no@email>
Thu, 19 Aug 2010 10:36:57 +0000 (10:36 +0000)
modules/highgui/src/window_QT.cpp
modules/highgui/src/window_QT.h

index 43848ce..aa4fb21 100755 (executable)
@@ -599,6 +599,7 @@ CV_IMPL int cvCreateTrackbar( const char* name_bar, const char* window_name, int
 \r
 CV_IMPL int cvCreateButton(const char* button_name,CvButtonCallback on_change, void* userdata , int button_type, int initial_button_state )\r
 {\r
+\r
        if (!guiMainThread)\r
                CV_Error( CV_StsNullPtr, "NULL guiReceiver (please create a window)" );\r
 \r
@@ -998,6 +999,7 @@ void GuiReceiver::resizeWindow(QString name, int width, int height)
 void GuiReceiver::enablePropertiesButtonEachWindow()\r
 {\r
        CvWindow* w;\r
+       CvWinModel* temp;\r
 \r
        //For each window, enable window property button\r
        foreach (QWidget *widget, QApplication::topLevelWidgets())\r
@@ -1005,9 +1007,13 @@ void GuiReceiver::enablePropertiesButtonEachWindow()
 \r
                if (widget->isWindow() && !widget->parentWidget ())//is a window without parent\r
                {\r
-                       w = (CvWindow*) widget;\r
-                       //active window properties button\r
-                       w->vect_QActions[9]->setDisabled(false);\r
+                       temp = (CvWinModel*) widget;\r
+                       if (temp->type == type_CvWindow)\r
+                       {\r
+                               w = (CvWindow*) widget;\r
+                               //active window properties button\r
+                               w->vect_QActions[9]->setDisabled(false);\r
+                       }\r
                }\r
        }\r
 }\r
@@ -1017,16 +1023,16 @@ void GuiReceiver::addButton(QString button_name, int button_type, int initial_bu
 \r
        if (!global_control_panel)\r
                return;\r
-\r
        QPointer<CvButtonbar> b;// = icvFindButtonbarByName(  button_name.toLatin1().data(), global_control_panel->myLayout );\r
 \r
        //if (b)//button with this name already exist\r
        //    return;\r
 \r
+\r
        if (global_control_panel->myLayout->count() == 0)//if that is the first button attach to the control panel, create a new button bar\r
        {\r
+\r
                b = CvWindow::createButtonbar(button_name);//the bar has the name of the first button attached to it\r
-               \r
                enablePropertiesButtonEachWindow();\r
 \r
        }else{\r
@@ -2135,10 +2141,10 @@ ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
 \r
 #endif\r
 \r
-       image2Draw_ipl=cvCreateImage(cvSize(viewport()->width(),viewport()->height()),IPL_DEPTH_8U,3);\r
-       \r
+       image2Draw_mat = cvCreateMat( viewport()->width(),viewport()->height(), CV_8UC3 );\r
+\r
        nbChannelOriginImage = 0;\r
-       cvZero(image2Draw_ipl);\r
+       cvZero(image2Draw_mat);\r
 \r
        setInteractive(false);\r
        setMouseTracking (true);//receive mouse event everytime\r
@@ -2147,8 +2153,9 @@ ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3)
 \r
 ViewPort::~ViewPort()\r
 {\r
-       if (image2Draw_ipl)\r
-               cvReleaseImage(&image2Draw_ipl);\r
+       if (image2Draw_mat)\r
+               \r
+               cvReleaseMat(&image2Draw_mat);\r
 \r
        \r
 //#if defined( HAVE_QT_OPENGL )\r
@@ -2309,34 +2316,37 @@ inline bool ViewPort::isSameSize(IplImage* img1,IplImage* img2)
        return img1->width == img2->width && img1->height == img2->height;\r
 }\r
 \r
-void ViewPort::updateImage(void* arr)\r
+void ViewPort::updateImage(const CvArr *arr)\r
 {\r
        //if (!arr)\r
        //CV_Error(CV_StsNullPtr, "NULL arr pointer (in showImage)" );\r
        CV_Assert(arr)\r
 \r
-       IplImage* tempImage = (IplImage*)arr;\r
+       CvMat * mat, stub;\r
+       int origin=0;\r
 \r
-       if (!isSameSize(image2Draw_ipl,tempImage))\r
-       {\r
-               cvReleaseImage(&image2Draw_ipl);\r
+       if( CV_IS_IMAGE_HDR( arr ))\r
+               origin = ((IplImage*)arr)->origin;\r
 \r
-               //the image in ipl (to do a deep copy with cvCvtColor)\r
-               image2Draw_ipl=cvCreateImage(cvGetSize(tempImage),IPL_DEPTH_8U,3);\r
+       mat = cvGetMat(arr, &stub);\r
 \r
-               //the ipl image in qt format (with shared memory)\r
-               //image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);\r
+       //IplImage* tempImage = (IplImage*)arr;\r
 \r
-               //nbChannelOriginImage = tempImage->nChannels;\r
+       if( CV_IS_IMAGE_HDR( arr ))\r
+               origin = ((IplImage*)arr)->origin;\r
+\r
+       if (!CV_ARE_SIZES_EQ(image2Draw_mat,mat))\r
+       {\r
+               cvReleaseMat(&image2Draw_mat);\r
+               //the image in ipl (to do a deep copy with cvCvtColor)\r
+               image2Draw_mat = cvCreateMat( mat->rows, mat->cols, CV_8UC3 );\r
 \r
                updateGeometry();\r
        }\r
 \r
-       nbChannelOriginImage = tempImage->nChannels;\r
-\r
+       nbChannelOriginImage = cvGetElemType(mat);\r
 \r
-       //cvCvtColor(tempImage,image2Draw_ipl,CV_BGR2RGB);//will not work if tempImage is 1 channel !!\r
-       cvConvertImage(tempImage,image2Draw_ipl,CV_CVTIMG_SWAP_RB );\r
+       cvConvertImage(mat,image2Draw_mat,(origin != 0 ? CV_CVTIMG_FLIP : 0) + CV_CVTIMG_SWAP_RB );\r
 \r
        viewport()->update();\r
 }\r
@@ -2596,8 +2606,8 @@ void ViewPort::icvmouseProcessing(QPointF pt, int cv_event, int flags)
 \r
 QSize ViewPort::sizeHint() const\r
 {\r
-       if(image2Draw_ipl)\r
-               return QSize(image2Draw_ipl->width,image2Draw_ipl->height);\r
+       if(image2Draw_mat)\r
+               return QSize(image2Draw_mat->cols,image2Draw_mat->rows);\r
        else\r
                return QGraphicsView::sizeHint();\r
 }\r
@@ -2606,13 +2616,13 @@ void ViewPort::resizeEvent ( QResizeEvent *event)
 {\r
 \r
        controlImagePosition();\r
-       ratioX=width()/float(image2Draw_ipl->width);\r
-       ratioY=height()/float(image2Draw_ipl->height);\r
+       ratioX=width()/float(image2Draw_mat->cols);\r
+       ratioY=height()/float(image2Draw_mat->rows);\r
 \r
        \r
        if(param_keepRatio == CV_WINDOW_KEEPRATIO)//to keep the same aspect ratio\r
        {\r
-               QSize newSize = QSize(image2Draw_ipl->width,image2Draw_ipl->height);\r
+               QSize newSize = QSize(image2Draw_mat->cols,image2Draw_mat->rows);\r
                newSize.scale(event->size(),Qt::KeepAspectRatio);\r
 \r
                //imageWidth/imageHeight = newWidth/newHeight +/- epsilon\r
@@ -2692,22 +2702,23 @@ void ViewPort::paintEvent(QPaintEvent* event)
 \r
 void ViewPort::draw2D(QPainter *painter)\r
 {\r
-       image2Draw_qt = QImage((uchar*) image2Draw_ipl->imageData, image2Draw_ipl->width, image2Draw_ipl->height,QImage::Format_RGB888);\r
+       image2Draw_qt = QImage((uchar*) image2Draw_mat->data.ptr, image2Draw_mat->cols, image2Draw_mat->rows,QImage::Format_RGB888);\r
        image2Draw_qt_resized = image2Draw_qt.scaled(viewport()->width(),viewport()->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);\r
        painter->drawImage(0,0,image2Draw_qt_resized);\r
        //painter->drawImage(0,0,image2Draw_qt_resized);\r
 }\r
 \r
+//only if CV_8UC1 or CV_8UC3\r
 void ViewPort::drawStatusBar()\r
 {\r
        if (mouseCoordinate.x()>=0 &&\r
                mouseCoordinate.y()>=0 &&\r
-               mouseCoordinate.x()<image2Draw_ipl->width &&\r
-               mouseCoordinate.y()<image2Draw_ipl->height)\r
+               mouseCoordinate.x()<image2Draw_mat->cols &&\r
+               mouseCoordinate.y()<image2Draw_mat->rows)\r
        {\r
                QRgb rgbValue = image2Draw_qt.pixel(mouseCoordinate);\r
 \r
-               if (nbChannelOriginImage==3)\r
+               if (nbChannelOriginImage==CV_8UC3 )\r
                {\r
                        centralWidget->myStatusBar_msg->setText(tr("<font color='black'>Coordinate: %1x%2 ~ </font>")\r
                                .arg(mouseCoordinate.x())\r
@@ -2716,7 +2727,10 @@ void ViewPort::drawStatusBar()
                                tr("<font color='green'>G:%4 </font>").arg(qGreen(rgbValue))+//.arg(value.val[1])+\r
                                tr("<font color='blue'>B:%5</font>").arg(qBlue(rgbValue))//.arg(value.val[2])\r
                                );\r
-               }else{\r
+               }\r
+\r
+               if (nbChannelOriginImage==CV_8UC1)\r
+               {\r
                        //all the channel have the same value (because of cvconvertimage), so only the r channel is dsplayed\r
                        centralWidget->myStatusBar_msg->setText(tr("<font color='black'>Coordinate: %1x%2 ~ </font>")\r
                                .arg(mouseCoordinate.x())\r
index 2ed7693..c0f2dc5 100644 (file)
@@ -377,7 +377,7 @@ class ViewPort : public QGraphicsView
 public:\r
     ViewPort(CvWindow* centralWidget, int mode = CV_MODE_NORMAL, int keepRatio = CV_WINDOW_KEEPRATIO);\r
     ~ViewPort();\r
-    void updateImage(void* arr);\r
+    void updateImage(const CvArr *arr);\r
     void startDisplayInfo(QString text, int delayms);\r
     void setMouseCallBack(CvMouseCallback m, void* param);\r
     void setOpenGLCallback(CvOpenGLCallback func,void* userdata, double arg3, double arg4, double arg5);\r
@@ -391,7 +391,8 @@ public:
 \r
     int param_keepRatio;\r
 \r
-    IplImage* image2Draw_ipl;\r
+    //IplImage* image2Draw_ipl;\r
+       CvMat* image2Draw_mat;\r
     QImage image2Draw_qt;\r
     QImage image2Draw_qt_resized;\r
     int mode_display;//opengl or native\r