【QT学习】QT中使用虚拟键盘

  • Post author:
  • Post category:其他


背景: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