提交 35772655 编写于 作者: K Kumataro

highgui: Qt: waitKey() supports Cyrillic/Japanese keyboard layout

上级 1a24e316
......@@ -2194,23 +2194,58 @@ void CvWindow::displayPropertiesWin()
global_control_panel->hide();
}
static bool isTranslatableKey(Qt::Key key)
{
// https://github.com/opencv/opencv/issues/21899
// https://doc.qt.io/qt-5/qt.html#Key-enum
// https://doc.qt.io/qt-6/qt.html#Key-enum
// https://github.com/qt/qtbase/blob/dev/src/testlib/qasciikey.cpp
bool ret = false;
switch ( key )
{
// Special keys
case Qt::Key_Escape:
case Qt::Key_Tab:
case Qt::Key_Backtab:
case Qt::Key_Backspace:
case Qt::Key_Enter:
case Qt::Key_Return:
ret = true;
break;
// latin-1 keys.
default:
ret = (
( ( Qt::Key_Space <= key ) && ( key <= Qt::Key_AsciiTilde ) ) // 0x20--0x7e
||
( ( Qt::Key_nobreakspace <= key ) && ( key <= Qt::Key_ssharp ) ) // 0x0a0--0x0de
||
( key == Qt::Key_division ) // 0x0f7
||
( key == Qt::Key_ydiaeresis ) // 0x0ff
);
break;
}
return ret;
}
//Need more test here !
void CvWindow::keyPressEvent(QKeyEvent *evnt)
{
//see http://doc.trolltech.com/4.6/qt.html#Key-enum
int key = evnt->key();
const Qt::Key qtkey = static_cast<Qt::Key>(key);
Qt::Key qtkey = static_cast<Qt::Key>(key);
char asciiCode = QTest::keyToAscii(qtkey);
if (asciiCode != 0)
key = static_cast<int>(asciiCode);
else
key = evnt->nativeVirtualKey(); //same codes as returned by GTK-based backend
if ( isTranslatableKey( qtkey ) )
key = static_cast<int>( QTest::keyToAscii( qtkey ) );
else
key = evnt->nativeVirtualKey(); //same codes as returned by GTK-based backend
//control plus (Z, +, -, up, down, left, right) are used for zoom/panning functions
if (evnt->modifiers() != Qt::ControlModifier)
{
if (evnt->modifiers() != Qt::ControlModifier)
{
mutexKey.lock();
last_key = key;
mutexKey.unlock();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册