android - 在 qml 应用程序中禁用 Android 键盘

标签 android c++ qt keyboard qml

我正在将现有的 QML/C++ 应用程序移植到 Android 系统。该应用程序已在 Android 平板电脑上运行,但我在使用 Android 键盘时遇到问题。 由于我的 QML/C++ 应用程序实现了自己的键盘,我想禁用 Android 键盘。 我试图在 AndroidManifest.xml 文件中添加 android:windowSoftInputMode="stateAlwaysHidden" 行,但当我按下编辑框时键盘仍然出现。 由于我正在移植现有应用程序,因此我不想编辑应用程序本身的代码。我唯一可以编辑的是 AndroidManifest.xml、QtApplication.java 和 QtActivity.java 文件。 QtApplicationQtActivity 派生自 ApplicationActivity Android 类。

是否可以在应用程序启动时为整个应用程序全局禁用 Android 键盘(通过编辑 list 文件或覆盖 onCreateonStart 或类似功能)? ApplicationActivity 类中是否有我可以覆盖它们并因此禁用 native 键盘的函数?

最佳答案

一段时间后,我找到了解决方案,实际上是解决此问题的方法。这个想法是使用一个请求软件输入面板 (QEvent::RequestSoftwareInputPanel) 的事件。此事件由 QML/C++ 应用程序发送到主机 Android 系统。 因此,我实现了一个名为 SIPRequestEater 的事件过滤器。

    class SIPRequestEater: public QObject
    {
        Q_OBJECT
    protected:
        bool eventFilter(QObject *obj, QEvent *event)
        {
            if(event->type() == QEvent::RequestSoftwareInputPanel)
            {
                // filter out RequestSoftwareInputPanel event
                return true;
            }
            else
            {
                // standard event processing
                return QObject::eventFilter(obj, event);
            }
        }
    };

此过滤器必须安装到 QCoreApplicationQCoreApplication::run 之前被称为。

QCoreApplication *coreApp = QCoreApplication::instance();
SIPRequestEater *sipRequestEater = new SIPRequestEater();
coreApp->installEventFilter(sipRequestEater);

它也可以安装在 QApllication 上.

问题是,这个过滤器没有捕捉到 QEvent::RequestSoftwareInputPanel事件。我对此的解释是,过滤器与 QCoreApplication::installEventFilter(<filter>) 一起安装。是仅针对输入事件的过滤器,从 Android 到 QML 应用程序。 QEvent::RequestSoftwareInputPanel其实是在往另一个方向走,从QML应用到Android系统。我没有发现是否可以过滤/禁用输出事件。因此,我决定过滤掉事件中的焦点 QEvent::FocusIn这实际上导致QEvent::RequestSoftwareInputPanel .对于我们的应用程序,这可以正常工作。 Android 键盘不再出现,我们的编辑文本字段仍然获得焦点,因为我们有自己的焦点和键盘实现。我相信这不是适合每个人的完美解决方案,这就是为什么我将其称为解决方法。 如果有人知道,如何过滤掉输出事件,特别是QEvent::RequestSoftwareInputPanel ,请张贴在这里。 filter的最终实现是:

class SIPRequestEater: public QObject
{
    Q_OBJECT
protected:
    bool eventFilter(QObject *obj, QEvent *event)
    {
        if(event->type() == QEvent::FocusIn)
        {
            // filter out FocusIn event
            return true;
        }
        else
        {
            // standard event processing
            return QObject::eventFilter(obj, event);
        }
    }
};

关于android - 在 qml 应用程序中禁用 Android 键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31275870/

相关文章:

android - 首次运行时在 ViewPager 中预加载 fragment 的 View

android - 有没有办法避免 admob 阻止包含多个广告的横幅或插播广告?

c++ - std::move 两个双端队列 - 输入与输出迭代器

QMainWindow 中的 QToolbar - 向工具栏发出其位置变化的信号

c++ - QWidgetWindow 在 Qt5 的事件过滤器中作为 QObject

c++ - Qt/C++ 中对 class::slot 的 undefined reference

android - Realm Java 作为对原生 Android 库的依赖绑定(bind)到 Xamarin

安卓 : How to Allow Only One Touch?

c++ - 在 C++20 中是否不再允许在 std 中为程序定义类型专门化函数模板?

c++ - C++中使用前声明的规则是什么?