Qt Python binding -- #512
authorYannick Verdie <no@email>
Wed, 18 Aug 2010 11:02:11 +0000 (11:02 +0000)
committerYannick Verdie <no@email>
Wed, 18 Aug 2010 11:02:11 +0000 (11:02 +0000)
modules/highgui/src/window_QT.cpp
modules/highgui/src/window_QT.h

index 9307841cb20bc30ac67eb38ce4e6560c6d5f75c2..7aa54da8f75caeba979a58a8745c06010f930537 100755 (executable)
@@ -547,10 +547,23 @@ CV_IMPL void cvResizeWindow(const char* name, int width, int height )
 
 }
 
-//TODO: implement the real one, not a wrapper
 CV_IMPL int cvCreateTrackbar2( const char* name_bar, const char* window_name, int* val, int count, CvTrackbarCallback2 on_notify, void* userdata )
 {
-       return cvCreateTrackbar( name_bar, window_name, val, count, (CvTrackbarCallback)on_notify );
+       if (!guiMainThread) \r
+               CV_Error( CV_StsNullPtr, "NULL guiReceiver (please create a window)" ); \r
+\r
+       QMetaObject::invokeMethod(guiMainThread, \r
+                                                               "addSlider2", \r
+                                                               Qt::AutoConnection, \r
+                                                               Q_ARG(QString, QString(name_bar)), \r
+                                                               Q_ARG(QString, QString(window_name)), \r
+                                                               Q_ARG(void*, (void*)val), \r
+                                                               Q_ARG(int, count), \r
+                                                               Q_ARG(void*, (void*)on_notify), \r
+                                                               Q_ARG(void*, (void*)userdata) \r
+       ); \r
+\r
+       return 1;//dummy value 
 }
 
 CV_IMPL int cvStartWindowThread()
@@ -1016,6 +1029,34 @@ void GuiReceiver::addButton(QString button_name, int button_type, int initial_bu
        b->addButton( button_name,(CvButtonCallback) on_change, userdata, button_type, initial_button_state);
 }
 
+void GuiReceiver::addSlider2(QString bar_name, QString window_name, void* value, int count, void* on_change, void *userdata)
+{
+       QBoxLayout *layout = NULL;
+       QPointer<CvWindow> w;
+       if (window_name != "")
+       {
+               w = icvFindWindowByName( window_name.toLatin1().data()  );
+
+               if (!w)
+                       return;
+       }else{
+               if (global_control_panel)
+                       layout = global_control_panel->myLayout;
+       }
+
+       QPointer<CvTrackbar> t = icvFindTrackbarByName( bar_name.toLatin1().data() , window_name.toLatin1().data(), layout );
+
+       if (t)//trackbar exists
+               return;
+
+       if (!value)
+               CV_Error(CV_StsNullPtr, "NULL value pointer" );
+
+       if (count<= 0)//count is the max value of the slider, so must be bigger than 0
+               CV_Error(CV_StsNullPtr, "Max value of the slider must be bigger than 0" );
+
+       CvWindow::addSlider2(w,bar_name,(int*)value,count,(CvTrackbarCallback2) on_change, userdata);
+}
 
 void GuiReceiver::addSlider(QString bar_name, QString window_name, void* value, int count, void* on_change)
 {
@@ -1051,8 +1092,25 @@ int GuiReceiver::start()
        return qApp->exec();
 }
 
+CvTrackbar::CvTrackbar(CvWindow* arg, QString name, int* value, int count, CvTrackbarCallback2 on_change, void* data )
+{
+       callback = NULL;
+       callback2 = on_change;
+       userdata = data;
+
+       construc_trackbar(arg,name, value, count);
+}
 
 CvTrackbar::CvTrackbar(CvWindow* arg, QString name, int* value, int count, CvTrackbarCallback on_change )
+{
+       callback = on_change;
+       callback2 = NULL;
+       userdata = NULL;
+
+       construc_trackbar(arg,name, value, count);
+}
+
+void CvTrackbar::construc_trackbar(CvWindow* arg, QString name, int* value, int count)
 {
        type=type_CvTrackbar;
        myparent = arg;
@@ -1060,7 +1118,6 @@ CvTrackbar::CvTrackbar(CvWindow* arg, QString name, int* value, int count, CvTra
        setObjectName(name_bar);
        dataSlider = value;
 
-       callback = on_change;
        slider = new QSlider(Qt::Horizontal);
        slider->setFocusPolicy(Qt::StrongFocus);
        slider->setMinimum(0);
@@ -1135,7 +1192,16 @@ void CvTrackbar::update(int myvalue)
 
        *dataSlider = myvalue;
        if (callback)
+       {
                callback(myvalue);
+               return;
+       }
+
+       if (callback2)
+       {
+               callback2(myvalue,userdata);
+               return;
+       }
 }
 
 void CvTrackbar::setLabel(int myvalue)
@@ -1422,8 +1488,6 @@ CvWindow::CvWindow(QString arg, int arg2)
 
 CvWindow::~CvWindow()
 {
-       printf("delete w\n");
-
        QLayoutItem *child;
 
        if (myGlobalLayout)
@@ -1664,6 +1728,32 @@ void CvWindow::setMouseCallBack(CvMouseCallback m, void* param)
        myview->setMouseCallBack(m,param);
 }
 
+//addSlider2 is static
+void CvWindow::addSlider2(CvWindow* w,QString name, int* value, int count,CvTrackbarCallback2 on_change, void* userdata)
+{
+       QPointer<CvTrackbar> t = new CvTrackbar(w,name,value, count, on_change, userdata);
+       t->setAlignment(Qt::AlignHCenter);
+
+       QPointer<QBoxLayout> myLayout;
+
+       if (w)
+       {
+               myLayout = w->myBarLayout;
+       }
+       else
+       {
+               myLayout = global_control_panel->myLayout;
+
+               //if first one, enable control panel
+               if (myLayout->count() == 0)
+                       guiMainThread->enablePropertiesButtonEachWindow();
+       }
+
+       myLayout->insertLayout( myLayout->count(),t);
+
+
+}
+
 //addSlider is static
 void CvWindow::addSlider(CvWindow* w,QString name, int* value, int count,CvTrackbarCallback on_change)
 {
index 9094d24fbea5b874e609219cff7f974ab6f3d583..fc138cd89d356e73c8505d916122428afdd8b296 100644 (file)
@@ -127,6 +127,7 @@ public slots:
     void destroyWindow(QString name);\r
     void destroyAllWindow();\r
     void addSlider(QString trackbar_name, QString window_name, void* value, int count, void* on_change);\r
+       void addSlider2(QString trackbar_name, QString window_name, void* value, int count, void* on_change, void *userdata);\r
     void moveWindow(QString name, int x, int y);\r
     void resizeWindow(QString name, int width, int height);\r
     void showImage(QString name, void* arr);\r
@@ -229,7 +230,8 @@ class CvTrackbar :  public CvBar
 {\r
     Q_OBJECT\r
 public:\r
-    CvTrackbar(CvWindow* parent, QString name, int* value, int count, CvTrackbarCallback on_change = NULL);\r
+    CvTrackbar(CvWindow* parent, QString name, int* value, int count, CvTrackbarCallback on_change);\r
+       CvTrackbar(CvWindow* parent, QString name, int* value, int count, CvTrackbarCallback2 on_change, void* data);\r
     ~CvTrackbar();\r
 \r
     //QString trackbar_name;\r
@@ -241,10 +243,13 @@ private slots:
 \r
 private:\r
     void setLabel(int myvalue);\r
+       void construc_trackbar(CvWindow* arg, QString name, int* value, int count);\r
     QString createLabel();\r
     QPointer<QPushButton > label;\r
     CvTrackbarCallback callback;\r
+       CvTrackbarCallback2 callback2;//look like it is use by python binding\r
     int* dataSlider;\r
+       void* userdata;\r
 \r
 };\r
 \r
@@ -281,6 +286,7 @@ public:
     CvWindow(QString arg2, int flag = CV_WINDOW_NORMAL);\r
     ~CvWindow();\r
     static void addSlider(CvWindow* w,QString name, int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL));\r
+       static void addSlider2(CvWindow* w,QString name, int* value, int count, CvTrackbarCallback2 on_change CV_DEFAULT(NULL), void* userdata CV_DEFAULT(0));\r
     void setMouseCallBack(CvMouseCallback m, void* param);\r
     void updateImage(void* arr);\r
     void displayInfo(QString text, int delayms );\r