1

这是我以前的问题。我正在尝试使用下面的平台相关代码来解决这个问题。在 Windows 上,一切正常。但是在 Linux 上,我无法获得语言名称,只能获得国家/地区。另外,我不知道什么消息(在 Linux 上)与键盘布局更改事件相关联。我将此解决方案用于 Linux 部分。

bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
#ifdef Q_OS_WIN
    MSG* msg = reinterpret_cast<MSG*>(message);
    if(msg && msg->message == WM_INPUTLANGCHANGE)
    {
        HKL hkl_id = GetKeyboardLayout(0);
        int lang_id =  LOWORD(hkl_id);
        wchar_t buf[11] = {0};
        GetLocaleInfo( MAKELCID(lang_id, SORT_DEFAULT), 
                       LOCALE_SISO639LANGNAME, 
                       buf, 
                       10);
        qDebug() << QString::fromWCharArray(buf);  // "EN"
    }
#endif // Q_OS_WIN
#ifdef Q_OS_LINUX
    xcb_generic_event_t* ev = reinterpret_cast<xcb_generic_event_t *>(message);
    if(ev)
    {
        switch (ev->response_type & ~0x80)
        {
        case XCB_KEY_PRESS:
        {
            qDebug() << endl;
            XKeyboard xkb;
            qDebug() << QString::fromStdString(xkb.currentGroupSymbol());  // "US"
        }
        break;
        }
    }
#endif // Q_OS_LINUX
    return QMainWindow::nativeEvent(eventType, message, result);
}
4

0 回答 0