背景:QT5.10,Ubuntu16,主程序为widget。
要求:程序中需要调用打开软键盘。
方法:(1)使用QT自带的软键盘插件。
(2)自己开发一个软键盘插件,然后让程序调用该插件。
(方法一)使用QT自带的软键盘
(1)qt的官方帮助文档:https://doc.qt.io/qt-5/qtvirtualkeyboard-deployment-guide.html#integration-method
(2)使用qt自带的软键盘有两种集成方式:桌面方式以及应用方式。
- 桌面:键盘出现在桌面,即系统的屏幕上,键盘的宽度等于屏幕的宽度,不依赖于app的宽度。
- 应用:键盘嵌入到我们的app中去,键盘的宽度等于我们app的宽度
(3)桌面方式:
(3.1)在程序的main函数中,QApplication a(argc, argv);/QGuiApplication app(argc, argv);的前面,加入:
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
(3.2)如果是widget的程序:在widget定义QLineEdit后,点击输入的时候就会出现桌面的软键盘,效果如下:
main.cpp
int main(int argc, char *argv[])
{
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
// qputenv("QT_VIRTUALKEYBOARD_STYLE", QByteArray("retro"));
QApplication a(argc, argv);
MainWidget w;
w.show();
return a.exec();
}
MainWidget.cpp
MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{
setFixedSize(2000, 700);
setStyleSheet("background-color:red;");
edit = new LineEdit(this);
edit->setStyleSheet("QLineEdit{color:white;background-color:white}");
edit->setFixedSize(200, 50);
edit->move(this->width()/2-edit->width()/2, 0);
}
如果想要主动的将桌面集成的键盘隐藏,可采用:
edit为QLineEdit控件,将focus去掉就自动的关闭键盘
if(edit->hasFocus())
{
edit->clearFocus();
}
(3.3)如果是qml的程序:在qml定义TextFiled后,点击输入的时候就会出现软键盘,效果如下:
main.cpp
int main(int argc, char *argv[])
{
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
TextField {
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
}
}
如果想要将软键盘主动的隐藏,例如点击按钮键盘消失:
Qt.inputMethod.hide()
或者
InputPanel.active = false
(3.4)从3.2跟3.3可以看出,桌面集成方式的软键盘,键盘的宽度是桌面屏幕的宽度,高度会根据宽度自动变化;而且qml方式的键盘为透明。
(4)app方式:app方式就必须要使用qml的InputPanel控件,并且输入的控件textFiled跟InputPanel是在同一个qml中(同一个焦点窗口)。
(4.1)在程序的main函数中,QApplication a(argc, argv);/QGuiApplication app(argc, argv);的前面,加入:
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
(4.2) 如果程序是widget:需要使用quickwidget封装(输入控件跟键盘控件),修改(3.2)的程序。
mainwidget.cpp
MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{
setFixedSize(600, 480);
setStyleSheet("background-color:red;");
edit = new QLineEdit(this);
edit->setStyleSheet("QLineEdit{color:white;background-color:white}");
edit->setFixedSize(200, 50);
edit->move(this->width()/2-edit->width()/2, 0);
edit->setVisible(false);
//edit->installEventFilter(this);
keyboad = new QQuickWidget(this);
keyboad->setResizeMode(QQuickWidget::SizeRootObjectToView);
keyboad->setSource(QUrl("qrc:/file/VisualKeyTool.qml"));
keyboad->setFixedSize(this->width(),this->height()/2);
keyboad->move(0, this->height()- keyboad->height());
}
VisualKeyTool.qml:
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.VirtualKeyboard 2.2
Item {
TextField {
id:appcontainer
focus: true
onPressed: {
vkb.visible = true; //当选择输入框的时候才显示键盘
}
}
TextField {
id:appcontainer1
anchors.right: parent.right
onPressed: {
vkb.visible = true; //当选择输入框的时候才显示键盘
}
}
InputPanel {
id: vkb
visible: false
y: Qt.inputMethod.visible ? parent.height - vkb.height : parent.height
anchors.left: parent.left
anchors.right: parent.right
}
}
注意:不能单独的将inputpanel封装成widget,必须跟输入控件一块,例如该程序中mainwidget中edit已经不可用。
(4.3)如果程序是qml,修改(3.3)程序:
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.VirtualKeyboard 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
TextField {
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
onPressed: {
vkb.visible = true; //当选择输入框的时候才显示键盘
}
}
InputPanel {
id: vkb
visible: false
anchors.right: parent.right
anchors.left: parent.left
anchors.bottom: parent.bottom
//这种集成方式下点击隐藏键盘的按钮是没有效果的,
//只会改变active,因此我们自己处理一下
onActiveChanged: {
if(!active) { visible = false; }
}
}
}
(4.4)app集成方式的软键盘,键盘的宽度是程序的宽度,高度会根据宽度自动变化。
(方法二)自己开发封装插件
转自:https://blog.csdn.net/onlyshi/article/details/78408000
备注:自己试了,点击输入框后键盘一闪而过,一直不知道怎么回事。
参考链接:
https://blog.csdn.net/a844651990/article/details/79032650
https://blog.csdn.net/Zhu_Zhu_2009/article/details/92795002