From a3582b478098d12e179d13e99eb920b857741b8f Mon Sep 17 00:00:00 2001 From: Yannick Verdie Date: Wed, 18 Aug 2010 11:02:11 +0000 Subject: [PATCH] Qt Python binding -- #512 --- modules/highgui/src/window_QT.cpp | 100 ++++++++++++++++++++++++++++-- modules/highgui/src/window_QT.h | 8 ++- 2 files changed, 102 insertions(+), 6 deletions(-) diff --git a/modules/highgui/src/window_QT.cpp b/modules/highgui/src/window_QT.cpp index 9307841cb2..7aa54da8f7 100755 --- a/modules/highgui/src/window_QT.cpp +++ b/modules/highgui/src/window_QT.cpp @@ -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) + CV_Error( CV_StsNullPtr, "NULL guiReceiver (please create a window)" ); + + QMetaObject::invokeMethod(guiMainThread, + "addSlider2", + Qt::AutoConnection, + Q_ARG(QString, QString(name_bar)), + Q_ARG(QString, QString(window_name)), + Q_ARG(void*, (void*)val), + Q_ARG(int, count), + Q_ARG(void*, (void*)on_notify), + Q_ARG(void*, (void*)userdata) + ); + + 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 w; + if (window_name != "") + { + w = icvFindWindowByName( window_name.toLatin1().data() ); + + if (!w) + return; + }else{ + if (global_control_panel) + layout = global_control_panel->myLayout; + } + + QPointer 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 t = new CvTrackbar(w,name,value, count, on_change, userdata); + t->setAlignment(Qt::AlignHCenter); + + QPointer 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) { diff --git a/modules/highgui/src/window_QT.h b/modules/highgui/src/window_QT.h index 9094d24fbe..fc138cd89d 100644 --- a/modules/highgui/src/window_QT.h +++ b/modules/highgui/src/window_QT.h @@ -127,6 +127,7 @@ public slots: void destroyWindow(QString name); void destroyAllWindow(); void addSlider(QString trackbar_name, QString window_name, void* value, int count, void* on_change); + void addSlider2(QString trackbar_name, QString window_name, void* value, int count, void* on_change, void *userdata); void moveWindow(QString name, int x, int y); void resizeWindow(QString name, int width, int height); void showImage(QString name, void* arr); @@ -229,7 +230,8 @@ class CvTrackbar : public CvBar { Q_OBJECT public: - CvTrackbar(CvWindow* parent, QString name, int* value, int count, CvTrackbarCallback on_change = NULL); + CvTrackbar(CvWindow* parent, QString name, int* value, int count, CvTrackbarCallback on_change); + CvTrackbar(CvWindow* parent, QString name, int* value, int count, CvTrackbarCallback2 on_change, void* data); ~CvTrackbar(); //QString trackbar_name; @@ -241,10 +243,13 @@ private slots: private: void setLabel(int myvalue); + void construc_trackbar(CvWindow* arg, QString name, int* value, int count); QString createLabel(); QPointer label; CvTrackbarCallback callback; + CvTrackbarCallback2 callback2;//look like it is use by python binding int* dataSlider; + void* userdata; }; @@ -281,6 +286,7 @@ public: CvWindow(QString arg2, int flag = CV_WINDOW_NORMAL); ~CvWindow(); static void addSlider(CvWindow* w,QString name, int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL)); + static void addSlider2(CvWindow* w,QString name, int* value, int count, CvTrackbarCallback2 on_change CV_DEFAULT(NULL), void* userdata CV_DEFAULT(0)); void setMouseCallBack(CvMouseCallback m, void* param); void updateImage(void* arr); void displayInfo(QString text, int delayms ); -- GitLab