我制作了一个具有 QVulkanWindowRenderer 的 Qt 桌面应用程序,并使用 Imgui 在 Vulkan 渲染器窗口内显示了一个文本框。我可以按预期用英语输入,但当我尝试将 Windows 任务栏中的语言切换为韩语时,如果光标聚焦在 Vulkan 渲染器内的 Imgui 文本字段上,并且任务栏中的语言不会更改为韩语,出现的字符仅以英文出现。在任何其他文本字段(文本编辑器、浏览器,甚至不在 Vulkan 渲染器中的 Qt 文本字段)中,更改任务栏中的语言都可以正确工作,我可以输入韩语,或者至少字符将显示为????这意味着 Windows ime 输入被正确接收,但程序没有显示它们所需的字体。 我正在使用 eventFilter 接收输入。
class MyVulkanRenderer : public QObject, public QVulkanWindowRenderer {
public:
MyVulkanRenderer(QVulkanWindow* w) : m_window(w) {
m_window->installEventFilter(this);
}
}
在重写的 eventFilter 函数中,我有这样的代码,它拾取输入事件并将其映射到 imgui 上下文。
case QEvent::KeyPress:
case QEvent::KeyRelease: {
const bool down = event->type() == QEvent::KeyPress;
QKeyEvent* ke = static_cast<QKeyEvent*>(event);
if (down)
{
key_text.append(ke->text());
if (!key_text.isEmpty()) {
for (const QChar& c : key_text) {
ImWchar u = c.unicode();
if (u)
io.AddInputCharacter(u);
}
key_text.clear();
}
}
io.AddKeyEvent(qtKeyToImguiKey(Qt::Key(ke->key())), down);
我认为问题是因为所有输入事件都经过 QtVulkanWindowRenderer,并且输入需要映射到 imgui 函数才能产生任何效果,就像我将按键事件从 Qt 映射到 imgui 时一样。我不明白的是,当用户单击使用 Windows ime 的 Windows 任务栏中的语言按钮时,如何映射事件(如果有)。我觉得单击时按钮没有改变,因为焦点位于 QVulkanWindowRenderer 上并且没有触发任何事件。
语言切换
非常感谢任何有关如何解决此问题的帮助或提示。 谢谢。