data/attach/1907/cng5jfrhmilwfmi97ghrg3o5wx9wc85g.jpg
作者使用的是qt5.6版本,一开始以为5.6不支持虚拟键盘,因为在官方网站上下载的源代码编不过,但是后来灵机一动,找到了github上的qt仓库,顺利下载了qt5.6版本的虚拟键盘,一次性编译通过。
github地址:
https://github.com/qt/qtvirtualkeyboard/tree/5.6
编译和部署过程可以参照qt官方文档:
http://doc.qt.io/qt-5/qtvirtualkeyboard-index.html
简单地说就是qmake,make ,make install.就可以了
然后在引用虚拟键盘的时候需要在main函数加入
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
这段语言。
然后在你的程序中加入textField ,我这里用的是qml,如果是widget应该是lineEdit.
我显示在windows下测试的,现象很完美,点击textfield之后,虚拟键盘就弹出了。
然后我将程序部署到嵌入式linux下,运行之后,崩溃。键盘没有弹出。程序直接崩溃。
报错:
Application stops with 'EGLFS: OpenGL windows cannot be mixed with others.'
这句话的意思是opengl下不可以弹出多个window,虚拟键盘是一个新的窗口,所以崩溃了。
官方的解释如下:
OpenGL and Qt Quick 2 applications can only have one fullscreen window existing at a time. Trying to create another OpenGL window, or trying to mix an OpenGL window with a raster one will display the above message and abort the application.
Note: For raster windows (software rendered content based on QWidget or
QPainter),
there is no such limitation.
说明widget是不受此影响的,只有opengl受影响。
然后google了一下,找到了方法,就是让虚拟键盘不要新开一个窗口,而是在原来的窗口中出现,代码如下:
import QtQuick 2.0
import QtQuick.VirtualKeyboard 2.1
Item {
id: root
Item {
id: appContainer
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
anchors.bottom: inputPanel.top
...
}
InputPanel {
id: inputPanel
y: Qt.inputMethod.visible ? parent.height - inputPanel.height : parent.height
anchors.left: parent.left
anchors.right: parent.right
}
}
需要指出的是这里import路径每个版本是不一样的,qt5.6就不是这个路径,如果这么写会报错,qt5.6的路径是:
import QtQuick.Enterprise.VirtualKeyboard 2.0
用inputpanel来装载虚拟键盘,就不会崩溃了。
附一张虚拟键盘在板子上的照片:
效果是不是很赞?