これが私の以前の質問です。以下のプラットフォーム依存のコードでこの問題を解決しようとしています。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);
}