static CvWinProperties* global_control_panel = NULL;
//end static and global
+// Declaration
+Qt::ConnectionType autoBlockingConnection();
+
+// Implementation - this allows us to do blocking whilst automatically selecting the right
+// behaviour for in-thread and out-of-thread launches of cv windows. Qt strangely doesn't
+// cater for this, but does for strictly queued connections.
+Qt::ConnectionType autoBlockingConnection() {
+ return (QThread::currentThread() != QApplication::instance()->thread())
+ ? Qt::BlockingQueuedConnection
+ : Qt::DirectConnection;
+}
CV_IMPL CvFont cvFontQt(const char* nameFont, int pointSize,CvScalar color,int weight,int style, int spacing)
{
QMetaObject::invokeMethod(guiMainThread,
"putText",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(void*, (void*) img),
Q_ARG(QString,QString(text)),
Q_ARG(QPoint, QPoint(org.x,org.y)),
double result = -1;
QMetaObject::invokeMethod(guiMainThread,
"getRatioWindow",
- //Qt::DirectConnection,
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_RETURN_ARG(double, result),
Q_ARG(QString, QString(name)));
QMetaObject::invokeMethod(guiMainThread,
"setRatioWindow",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)),
Q_ARG(double, prop_value));
}
double result = -1;
QMetaObject::invokeMethod(guiMainThread,
"getPropWindow",
- //Qt::DirectConnection,
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_RETURN_ARG(double, result),
Q_ARG(QString, QString(name)));
QMetaObject::invokeMethod(guiMainThread,
"setPropWindow",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)),
Q_ARG(double, prop_value));
}
QMetaObject::invokeMethod(guiMainThread,
"toggleFullScreen",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)),
Q_ARG(double, prop_value));
}
QMetaObject::invokeMethod(guiMainThread,
"isFullScreen",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_RETURN_ARG(double, result),
Q_ARG(QString, QString(name)));
QMetaObject::invokeMethod(guiMainThread,
"displayInfo",
- Qt::AutoConnection,
- //Qt::DirectConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)),
Q_ARG(QString, QString(text)),
Q_ARG(int, delayms));
QMetaObject::invokeMethod(guiMainThread,
"saveWindowParameters",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)));
}
QMetaObject::invokeMethod(guiMainThread,
"loadWindowParameters",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)));
}
QMetaObject::invokeMethod(guiMainThread,
"displayStatusBar",
- Qt::AutoConnection,
- //Qt::DirectConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)),
Q_ARG(QString, QString(text)),
Q_ARG(int, delayms));
guiMainThread->bTimeOut = false;
}
-
return result;
}
static CvTrackbar* icvFindTrackBarByName(const char* name_trackbar, const char* name_window, QBoxLayout* layout = NULL)
{
QString nameQt(name_trackbar);
-
if ((!name_window || !name_window[0]) && global_control_panel) //window name is null and we have a control panel
layout = global_control_panel->myLayout;
{
if (!guiMainThread)
guiMainThread = new GuiReceiver;
-
- if (multiThreads)
+ if (QThread::currentThread() != QApplication::instance()->thread()) {
+ multiThreads = true;
QMetaObject::invokeMethod(guiMainThread,
"createWindow",
- Qt::BlockingQueuedConnection,
+ Qt::BlockingQueuedConnection, // block so that we can do useful stuff once we confirm it is created
Q_ARG(QString, QString(name)),
Q_ARG(int, flags));
- else
+ } else {
guiMainThread->createWindow(QString(name), flags);
+ }
- return 1; //Dummy value
+ return 1; //Dummy value - probably should return the result of the invocation.
}
QMetaObject::invokeMethod(guiMainThread,
"destroyWindow",
- //Qt::BlockingQueuedConnection,
- Qt::AutoConnection,
+ Qt::AutoConnection, // if another thread is controlling, let it handle it without blocking ourselves here
Q_ARG(QString, QString(name)));
}
{
if (!guiMainThread)
return;
-
QMetaObject::invokeMethod(guiMainThread,
"destroyAllWindow",
- //Qt::BlockingQueuedConnection,
- Qt::AutoConnection);
+ Qt::AutoConnection // if another thread is controlling, let it handle it without blocking ourselves here
+ );
}
{
if (!guiMainThread)
CV_Error( CV_StsNullPtr, "NULL guiReceiver (please create a window)" );
-
QMetaObject::invokeMethod(guiMainThread,
"moveWindow",
- //Qt::BlockingQueuedConnection,
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)),
Q_ARG(int, x),
Q_ARG(int, y));
}
-
CV_IMPL void cvResizeWindow(const char* name, int width, int height)
{
if (!guiMainThread)
CV_Error( CV_StsNullPtr, "NULL guiReceiver (please create a window)" );
-
QMetaObject::invokeMethod(guiMainThread,
"resizeWindow",
- //Qt::BlockingQueuedConnection,
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name)),
Q_ARG(int, width),
Q_ARG(int, height));
QMetaObject::invokeMethod(guiMainThread,
"addSlider2",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name_bar)),
Q_ARG(QString, QString(window_name)),
Q_ARG(void*, (void*)val),
QMetaObject::invokeMethod(guiMainThread,
"addSlider",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(name_bar)),
Q_ARG(QString, QString(window_name)),
Q_ARG(void*, (void*)value),
QMetaObject::invokeMethod(guiMainThread,
"addButton",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(button_name)),
Q_ARG(int, button_type),
Q_ARG(int, initial_button_state),
{
if (!guiMainThread)
guiMainThread = new GuiReceiver;
-
- QMetaObject::invokeMethod(guiMainThread,
- "showImage",
- //Qt::BlockingQueuedConnection,
- Qt::DirectConnection,
- Q_ARG(QString, QString(name)),
- Q_ARG(void*, (void*)arr));
+ if (QThread::currentThread() != QApplication::instance()->thread()) {
+ multiThreads = true;
+ QMetaObject::invokeMethod(guiMainThread,
+ "showImage",
+ autoBlockingConnection(),
+ Q_ARG(QString, QString(name)),
+ Q_ARG(void*, (void*)arr)
+ );
+ } else {
+ guiMainThread->showImage(QString(name), (void*)arr);
+ }
}
QMetaObject::invokeMethod(guiMainThread,
"setOpenGlDrawCallback",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(window_name)),
Q_ARG(void*, (void*)callback),
Q_ARG(void*, userdata));
QMetaObject::invokeMethod(guiMainThread,
"setOpenGlContext",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(window_name)));
}
QMetaObject::invokeMethod(guiMainThread,
"updateWindow",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_ARG(QString, QString(window_name)));
}
{
QMetaObject::invokeMethod(guiMainThread,
"isOpenGl",
- Qt::AutoConnection,
+ autoBlockingConnection(),
Q_RETURN_ARG(double, result),
Q_ARG(QString, QString(name)));
}
timer = new QTimer(this);
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timeOut()));
timer->setSingleShot(true);
+ if ( doesExternalQAppExist ) {
+ moveToThread(QApplication::instance()->thread());
+ }
}
void GuiReceiver::destroyWindow(QString name)
{
+
QPointer<CvWindow> w = icvFindWindowByName(name);
if (w)
CvWindow::CvWindow(QString name, int arg2)
{
type = type_CvWindow;
- moveToThread(qApp->instance()->thread());
param_flags = arg2 & 0x0000000F;
param_gui_mode = arg2 & 0x000000F0;
//use to compute mouse coordinate, I need to update the ratio here and in resizeEvent
ratioX = width() / float(image2Draw_mat->cols);
ratioY = height() / float(image2Draw_mat->rows);
-
updateGeometry();
}