在qml应用程序中禁用Android键盘
Disable Android keyboard in qml application
我正在将现有的QML/c++应用程序移植到Android系统。该应用程序已经在安卓平板电脑上运行,但我的安卓键盘有问题。由于我的QML/c++应用程序已经实现了自己的键盘,我想禁用Android键盘。我试图在AndroidManifest.xml文件中添加android:windowSoftInputMode="stateAlwaysHidden"
行,但当我按下编辑框时,键盘仍然出现。因为我移植的是一个现有的应用程序,所以我不想编辑应用程序本身的代码。我唯一能编辑的是AndroidManifest.xml, QtApplication.java和qtactical .java文件。QtApplication
和QtActivity
来源于Application
和Activity
Android类。
是否有可能在应用程序启动时全局禁用Android键盘(与编辑清单文件或覆盖onCreate
, onStart
或类似功能)?在Application
和Activity
类中是否有任何函数可以覆盖它们并因此禁用本机键盘?
经过一段时间后,我找到了解决方案,实际上是解决这个问题的方法。这个想法是使用一个请求软件输入面板(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);
}
}
};
这个过滤器必须在QCoreApplication::run
被调用之前安装到QCoreApplication
。
QCoreApplication *coreApp = QCoreApplication::instance();
SIPRequestEater *sipRequestEater = new SIPRequestEater();
coreApp->installEventFilter(sipRequestEater);
也可以安装在QApllication
上。
问题是,这个过滤器没有捕获QEvent::RequestSoftwareInputPanel
事件。我对此的解释是,从Android到QML应用程序,与QCoreApplication::installEventFilter(<filter>)
一起安装的过滤器仅用于输入事件。QEvent::RequestSoftwareInputPanel
实际上是另一个方向,从QML应用程序到Android系统。我不知道是否可以过滤/禁用输出事件。因此,我决定过滤掉事件QEvent::FocusIn
中的焦点,这实际上会导致QEvent::RequestSoftwareInputPanel
。对于我们的应用程序,这应该是正常的。Android键盘不再出现,我们的编辑文本字段仍然获得焦点,因为我们有自己的焦点和键盘实现。我相信这不是适合所有人的完美解决方案,这就是为什么我称之为变通方案。如果有人知道,如何过滤输出事件,特别是QEvent::RequestSoftwareInputPanel
,请张贴在这里。过滤器的最终实现是:
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);
}
}
};
QApplication::setAutoSipEnabled(false)禁用软件虚拟键盘自动弹出。你可以使用"Q_OS_ANDROID"预处理器指令来避免修改其他目标平台上的行为:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef Q_OS_ANDROID
a.setAutoSipEnabled(false);
#endif
(...)
}
您可以使用以下代码以编程方式显示或隐藏虚拟键盘:
QInputMethod* input;
input = QGuiApplication::inputMethod();
if(input->isVisible())
{
input->setVisible(false);
}
else
{
input->setVisible(true);
}
下面是使用Qt.inputMethod的另一种方法-在虚拟键盘可见时立即隐藏它,例如通过在qml根项
中添加visblechanged处理程序Component.onCompleted: {
Qt.inputMethod.visibleChanged.connect(function () {
if (Qt.inputMethod.visible)
Qt.inputMethod.hide()
})
}
通过这种方法,还可以添加用户界面设置来选择使用什么键盘(系统或内置应用程序)。
:
我发现在隐藏之前,系统虚拟键盘有时会闪烁,尤其是在点击文本输入框太多的时候。在c++中处理visibechange并不能解决这个问题,但似乎使它不那么频繁了。
QObject::connect(QGuiApplication::inputMethod(), &QInputMethod::visibleChanged, [] {
QGuiApplication::inputMethod()->hide();
});
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 物理键盘上的触发器按键
- 如何使用ndk-build.cmd构建Android.so文件
- Android NDK传感器向事件队列报告奇怪的间隔
- 如何使用C/C++在MacOSX中获得键盘布局
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- OpenCV Android C++ imwrite not found
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- Android Studio 中带有静态库的原生C++代码
- 视窗键盘输入 c++
- 如何在 Android Studio 4 中编译 C/C++ 原生代码
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- Android 在编译二进制文件时重建静态库
- 我只想在Android 4.4中使用C++11库
- 无法将标准库导入本机 android 项目中的头文件
- 如何监控Android和iOS上的所有击键操作,如Windows键盘记录器
- Android模拟HID键盘
- Qt Android:当我在QLineEdit中输入时,虚拟键盘一直切换到大写
- 在qml应用程序中禁用Android键盘