#1695 fixed arrow key events with the Qt backend
This commit is contained in:
parent
dd01861de2
commit
d46f44b48a
@ -256,77 +256,77 @@ CV_IMPL void cvDisplayStatusBar(const char* name, const char* text, int delayms)
|
|||||||
|
|
||||||
CV_IMPL int cvWaitKey(int delay)
|
CV_IMPL int cvWaitKey(int delay)
|
||||||
{
|
{
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
if (!guiMainThread)
|
if (!guiMainThread)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
unsigned long delayms = delay <= 0 ? ULONG_MAX : delay; //in milliseconds
|
unsigned long delayms = delay <= 0 ? ULONG_MAX : delay; //in milliseconds
|
||||||
|
|
||||||
if (multiThreads)
|
if (multiThreads)
|
||||||
{
|
{
|
||||||
mutexKey.lock();
|
mutexKey.lock();
|
||||||
if (key_pressed.wait(&mutexKey, delayms)) //false if timeout
|
if (key_pressed.wait(&mutexKey, delayms)) //false if timeout
|
||||||
{
|
{
|
||||||
result = last_key;
|
result = last_key;
|
||||||
}
|
}
|
||||||
last_key = -1;
|
last_key = -1;
|
||||||
mutexKey.unlock();
|
mutexKey.unlock();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//cannot use wait here because events will not be distributed before processEvents (the main eventLoop is broken)
|
//cannot use wait here because events will not be distributed before processEvents (the main eventLoop is broken)
|
||||||
//so I create a Thread for the QTimer
|
//so I create a Thread for the QTimer
|
||||||
|
|
||||||
if (delay > 0)
|
if (delay > 0)
|
||||||
guiMainThread->timer->start(delay);
|
guiMainThread->timer->start(delay);
|
||||||
|
|
||||||
//QMutex dummy;
|
//QMutex dummy;
|
||||||
|
|
||||||
while (!guiMainThread->bTimeOut)
|
while (!guiMainThread->bTimeOut)
|
||||||
{
|
{
|
||||||
qApp->processEvents(QEventLoop::AllEvents);
|
qApp->processEvents(QEventLoop::AllEvents);
|
||||||
|
|
||||||
if (!guiMainThread)//when all the windows are deleted
|
if (!guiMainThread)//when all the windows are deleted
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
mutexKey.lock();
|
mutexKey.lock();
|
||||||
if (last_key != -1)
|
if (last_key != -1)
|
||||||
{
|
{
|
||||||
result = last_key;
|
result = last_key;
|
||||||
last_key = -1;
|
last_key = -1;
|
||||||
guiMainThread->timer->stop();
|
guiMainThread->timer->stop();
|
||||||
//printf("keypressed\n");
|
//printf("keypressed\n");
|
||||||
}
|
}
|
||||||
mutexKey.unlock();
|
mutexKey.unlock();
|
||||||
|
|
||||||
if (result!=-1)
|
if (result!=-1)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* //will not work, I broke the event loop !!!!
|
* //will not work, I broke the event loop !!!!
|
||||||
dummy.lock();
|
dummy.lock();
|
||||||
QWaitCondition waitCondition;
|
QWaitCondition waitCondition;
|
||||||
waitCondition.wait(&dummy, 2);
|
waitCondition.wait(&dummy, 2);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//to decrease CPU usage
|
//to decrease CPU usage
|
||||||
//sleep 1 millisecond
|
//sleep 1 millisecond
|
||||||
#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
|
#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
|
||||||
Sleep(1);
|
Sleep(1);
|
||||||
#else
|
#else
|
||||||
usleep(1000);
|
usleep(1000);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
guiMainThread->bTimeOut = false;
|
guiMainThread->bTimeOut = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1553,7 +1553,9 @@ CvWindow::CvWindow(QString name, int arg2)
|
|||||||
//setAttribute(Qt::WA_DeleteOnClose); //in other case, does not release memory
|
//setAttribute(Qt::WA_DeleteOnClose); //in other case, does not release memory
|
||||||
setContentsMargins(0, 0, 0, 0);
|
setContentsMargins(0, 0, 0, 0);
|
||||||
setWindowTitle(name);
|
setWindowTitle(name);
|
||||||
setObjectName(name);
|
setObjectName(name);
|
||||||
|
|
||||||
|
setFocus( Qt::PopupFocusReason ); //#1695 arrow keys are not recieved without the explicit focus
|
||||||
|
|
||||||
resize(400, 300);
|
resize(400, 300);
|
||||||
setMinimumSize(1, 1);
|
setMinimumSize(1, 1);
|
||||||
@ -2060,22 +2062,18 @@ void CvWindow::keyPressEvent(QKeyEvent *event)
|
|||||||
//see http://doc.trolltech.com/4.6/qt.html#Key-enum
|
//see http://doc.trolltech.com/4.6/qt.html#Key-enum
|
||||||
int key = event->key();
|
int key = event->key();
|
||||||
|
|
||||||
//bool goodKey = false;
|
Qt::Key qtkey = static_cast<Qt::Key>(key);
|
||||||
bool goodKey = true;
|
char asciiCode = QTest::keyToAscii(qtkey);
|
||||||
|
if (asciiCode != 0)
|
||||||
Qt::Key qtkey = static_cast<Qt::Key>(key);
|
key = static_cast<int>(asciiCode);
|
||||||
char asciiCode = QTest::keyToAscii(qtkey);
|
else
|
||||||
if (asciiCode != 0)
|
key = event->nativeVirtualKey(); //same codes as returned by GTK-based backend
|
||||||
{
|
|
||||||
key = static_cast<int>(asciiCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
//control plus (Z, +, -, up, down, left, right) are used for zoom/panning functions
|
//control plus (Z, +, -, up, down, left, right) are used for zoom/panning functions
|
||||||
if (event->modifiers() != Qt::ControlModifier && goodKey)
|
if (event->modifiers() != Qt::ControlModifier)
|
||||||
{
|
{
|
||||||
mutexKey.lock();
|
mutexKey.lock();
|
||||||
last_key = key;
|
last_key = key;
|
||||||
//last_key = event->nativeVirtualKey ();
|
|
||||||
mutexKey.unlock();
|
mutexKey.unlock();
|
||||||
key_pressed.wakeAll();
|
key_pressed.wakeAll();
|
||||||
//event->accept();
|
//event->accept();
|
||||||
@ -2813,41 +2811,41 @@ void DefaultViewPort::scaleView(qreal factor,QPointF center)
|
|||||||
//up, down, dclick, move
|
//up, down, dclick, move
|
||||||
void DefaultViewPort::icvmouseHandler(QMouseEvent *event, type_mouse_event category, int &cv_event, int &flags)
|
void DefaultViewPort::icvmouseHandler(QMouseEvent *event, type_mouse_event category, int &cv_event, int &flags)
|
||||||
{
|
{
|
||||||
Qt::KeyboardModifiers modifiers = event->modifiers();
|
Qt::KeyboardModifiers modifiers = event->modifiers();
|
||||||
Qt::MouseButtons buttons = event->buttons();
|
Qt::MouseButtons buttons = event->buttons();
|
||||||
|
|
||||||
flags = 0;
|
flags = 0;
|
||||||
if(modifiers & Qt::ShiftModifier)
|
if(modifiers & Qt::ShiftModifier)
|
||||||
flags |= CV_EVENT_FLAG_SHIFTKEY;
|
flags |= CV_EVENT_FLAG_SHIFTKEY;
|
||||||
if(modifiers & Qt::ControlModifier)
|
if(modifiers & Qt::ControlModifier)
|
||||||
flags |= CV_EVENT_FLAG_CTRLKEY;
|
flags |= CV_EVENT_FLAG_CTRLKEY;
|
||||||
if(modifiers & Qt::AltModifier)
|
if(modifiers & Qt::AltModifier)
|
||||||
flags |= CV_EVENT_FLAG_ALTKEY;
|
flags |= CV_EVENT_FLAG_ALTKEY;
|
||||||
|
|
||||||
if(buttons & Qt::LeftButton)
|
if(buttons & Qt::LeftButton)
|
||||||
flags |= CV_EVENT_FLAG_LBUTTON;
|
flags |= CV_EVENT_FLAG_LBUTTON;
|
||||||
if(buttons & Qt::RightButton)
|
if(buttons & Qt::RightButton)
|
||||||
flags |= CV_EVENT_FLAG_RBUTTON;
|
flags |= CV_EVENT_FLAG_RBUTTON;
|
||||||
if(buttons & Qt::MidButton)
|
if(buttons & Qt::MidButton)
|
||||||
flags |= CV_EVENT_FLAG_MBUTTON;
|
flags |= CV_EVENT_FLAG_MBUTTON;
|
||||||
|
|
||||||
cv_event = CV_EVENT_MOUSEMOVE;
|
cv_event = CV_EVENT_MOUSEMOVE;
|
||||||
switch(event->button())
|
switch(event->button())
|
||||||
{
|
{
|
||||||
case Qt::LeftButton:
|
case Qt::LeftButton:
|
||||||
cv_event = tableMouseButtons[category][0];
|
cv_event = tableMouseButtons[category][0];
|
||||||
flags |= CV_EVENT_FLAG_LBUTTON;
|
flags |= CV_EVENT_FLAG_LBUTTON;
|
||||||
break;
|
break;
|
||||||
case Qt::RightButton:
|
case Qt::RightButton:
|
||||||
cv_event = tableMouseButtons[category][1];
|
cv_event = tableMouseButtons[category][1];
|
||||||
flags |= CV_EVENT_FLAG_RBUTTON;
|
flags |= CV_EVENT_FLAG_RBUTTON;
|
||||||
break;
|
break;
|
||||||
case Qt::MidButton:
|
case Qt::MidButton:
|
||||||
cv_event = tableMouseButtons[category][2];
|
cv_event = tableMouseButtons[category][2];
|
||||||
flags |= CV_EVENT_FLAG_MBUTTON;
|
flags |= CV_EVENT_FLAG_MBUTTON;
|
||||||
break;
|
break;
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user