qt-键盘输入法

切换输入法

// 输入法变量
HKL g_hCurKL;

/*
0x0409的专业名称是Language Identifier,详见:
https://msdn.microsoft.com/en-us/library/dd318693(v=vs.85).aspx
*/
void disableIME()
{
LOGI((QString("disableIME enter:")).toStdString().c_str());
g_hCurKL = GetKeyboardLayout(0);
LoadKeyboardLayout((LPCWSTR)QString("0x0409").utf16(), KLF_ACTIVATE);
}

void enableIME()
{
LOGI((QString("enableIME enter:")).toStdString().c_str());
ActivateKeyboardLayout(g_hCurKL, 0);
}

特殊按键

web site

组合键

void MyWidget::keyPressEvent(QKeyEvent *event)
{
// 捕捉 Ctrl + Alt + A 组合键;
if (event->key() == Qt::Key_A && event->modifiers() == (Qt::AltModifier | Qt::ControlModifier))
{
// 开始截图;
startCatureImage();
}
...
}

键盘事件,输入法状态下

bool remoteCom::eventFilter(QObject *obj, QEvent *ev)
{
if (QEvent::KeyPress == ev->type())
{
//英文输入法
QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>(ev);
switch (keyEvent->key())
{
case Qt::Key_0:
case Qt::Key_Backspace:
break;
default:
break;
}
}else if(QEvent::InputMethod== ev->type())
{
// 中文或其他输入法
QInputMethodEvent *keyEvent = dynamic_cast<QInputMethodEvent *>(ev);
QString strInput = keyEvent->commitString();
//strInput 是键盘输入值
}
return true;
}

发送键盘按下消息

QKeyEvent tabKey(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier);
QCoreApplication::sendEvent(m_textEditIn, &tabKey);


/*
https://www.codeproject.com/Articles/7305/Keyboard-Events-Simulation-using-keybd-event-funct
将Qt::key的值转为windows bVk的值,即调用keybd_event需要的键盘值
keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY, 0);//按键按下
keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);//按键松开
*/
int translateKeyCode(int key)
{
int k = key;
bool legal = true;
if(k >= Qt::Key_0 && k <= Qt::Key_9)
{
}
else if(k >= Qt::Key_A && k <= Qt::Key_Z)
{
}
else if(k >= Qt::Key_F1 && k <= Qt::Key_F24)
{
k &= 0x000000ff;
k += 0x40;
}
else if(k == Qt::Key_Tab)
{
k = 0x09;
}
else if(k == Qt::Key_Backspace)
{
k = 0x08;
}
else if(k == Qt::Key_Return)
{
k = 0x0d;
}
else if(k <= Qt::Key_Down && k >= Qt::Key_Left)
{
int off = k - Qt::Key_Left;
k = 0x25 + off;
}
else if(k == Qt::Key_Shift)
{
k = 0x10;
}
else if(k == Qt::Key_Control)
{
k = 0x11;
}
else if(k == Qt::Key_Alt)
{
k = 0x12;
}
else if(k == Qt::Key_Meta)
{
k = 0x5b;
}
else if(k == Qt::Key_Insert)
{
k = 0x2d;
}
else if(k == Qt::Key_Delete)
{
k = 0x2e;
}
else if(k == Qt::Key_Home)
{
k = 0x24;
}
else if(k == Qt::Key_End)
{
k = 0x23;
}
else if(k == Qt::Key_PageUp)
{
k = 0x21;
}
else if(k == Qt::Key_Down)
{
k = 0x22;
}
else if(k == Qt::Key_CapsLock)
{
k = 0x14;
}
else if(k == Qt::Key_NumLock)
{
k = 0x90;
}
else if(k == Qt::Key_Space)
{
k = 0x20;
}
else
legal = false;

if(!legal)
return 0;
return k;
}