网上大多是用scroll部件来解决输入框被遮挡的问题,但是c++界面类好像不能用,主要我闲太麻烦。。。
直接上干货
效果如图(红色边框是为了方便大家查看布局手动加的)
环境说明:
1. qt5.15.0 arm交叉编译版本(静态库版本)
1. .pro文件中添加如下:
其中 contains(QT_ARCH, arm){} 我是为了判断arm平台,大家可以根据实际需求使用或删除
contains(QT_ARCH, arm) {
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/include/QtVirtualKeyboard/$$[QT_VERSION]/QtVirtualKeyboard/private
LIBS += -L$$[QT_INSTALL_PREFIX]/qml/QtQml -lqmlplugin
}
手动添加 qmlplugin插件是由于5.15.0的bug,部署到arm板子上后报以下警告,并且不能使用虚拟键盘,貌似qt6已经修复了(但我没有试过)。
[qrc:/QtQuick/VirtualKeyboard/content/InputPanel.qml::32]qrc:/QtQuick/VirtualKeyboard/content/InputPanel.qml:32:1: module "QtQml" plugin "qmlplugin" not found
import QtQml 2.14
^
2. main.cpp文件修改如下
2.1 添加头文件
#include <QtVirtualKeyboard>
#include "settings_p.h"
2.2 重点来了,main函数开头添加如下内容
int main(int argc, char *argv[])
{
// 设置虚拟键盘为全屏模式,避免遮挡输入框
QtVirtualKeyboard::Settings::instance()->setFullScreenMode(true);
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
QApplication a(argc, argv);
....................
MainWindow w;
w.show();
return a.exec();
}
此处参考了官方提供的示例basic,后来研究了一下代码,fullScreenMode是Settings类的静态变量,会影响到整个qtvirtualkeyboard。
官方示例只有最大化窗口时且要大于16:9的尺寸,才会触发fullScreenMode。
Binding {
target: VirtualKeyboardSettings
property: "fullScreenMode"
//value: appContainer.height > 0 && (appContainer.width / appContainer.height) > (16.0 / 9.0)
value: true
restoreMode: Binding.RestoreBinding
}
3. 总结
这个方法有点取巧,QML内建virtualkeyboard则无需如此,只是我前期代码都是用C++界面类写的,改动的工作量太大,所以如此操作的。
此方法也避免了很多嵌入式平台不支持多个顶层窗口,打开虚拟键盘时,除虚拟键盘显示的部分外,其它区域显示纯色(我的是蓝色)背景。