嵌入式linux下使用qt virtualkeyboard

2019-07-13 04:06发布

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来装载虚拟键盘,就不会崩溃了。 附一张虚拟键盘在板子上的照片:

效果是不是很赞?