QtVulkanWindowRenderer 内渲染的 Imgui 文本框无法使用 Windows IME

问题描述 投票:0回答:1

我制作了一个具有 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 上并且没有触发任何事件。 enter image description here

语言切换

enter image description here

非常感谢任何有关如何解决此问题的帮助或提示。 谢谢。

c++ qt vulkan ime imgui
1个回答
0
投票

您可能需要为当前接收输入消息的任何线程自定义窗口事件处理程序。 这意味着要深入研究 Qt 的平台特定扩展。 这个问题和相应的答案应该能够说明您需要做什么才能让 IME 正常工作。

或者,粗略搜索 Qt 的 IME 支持会发现这篇文章 支持输入法。当然,这样做的一个问题是,如果您在图形上下文中渲染内容,但 IME 会弹出一些本机窗口来帮助选择字符,您可能必须跳过一些步骤来映射 ImGUI 的位置控制本机窗口的适当坐标系。 当我尝试将网页渲染到渲染上下文中时,我必须处理这个问题很多,但必须支持可能具有依赖于本机窗口小部件的下拉列表的表单。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.