QML 虛擬鍵盤(VirtualKeyboard )


簡介

Qt 官方開源了一個虛擬鍵盤的示例,該示例提供兩種使用方式:一種用於桌面平台,另一種用於嵌入式平台,示例采用嵌入式平台方式顯示。它們區別是前者脫離窗口應用於全局,后者依附於窗口。

  • 示例在 QtCreator 軟件可以找到:

img

  • 或在以下 Qt 安裝目錄找到:

    C:\Qt\{你的Qt版本}\Examples\{你的Qt版本}\virtualkeyboard\basic
    
  • Qt 示例官方文檔

    https://doc.qt.io/qt-5/qtvirtualkeyboard-basic-example.html
    

使用

(1)先在 .pro 文件中添加插件:

QT += quickwidgets
CONFIG += link_pkgconfig

# 使用靜態插件
static {
    QT += svg
    QTPLUGIN += qtvirtualkeyboardplugin
}

(2)在 main.cpp 中添加以下代碼,但要在QApplication a(argc, argv);前面:

qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));

(3)最后 QML 文件導入模塊:

import QtQuick.VirtualKeyboard 2.1

然后 TetxInput 派生類的控件,獲得焦點即可調出虛擬鍵盤(桌面平台)。

根據不同的輸入方式顯示不同的鍵盤

TextField {
    id: digitsField
    width: parent.width
    placeholderText: "Digits only field" /* 輸入為空時顯示的提示文字 */
    inputMethodHints: Qt.ImhDigitsOnly   /* 輸入策略 */
    enterKeyAction: EnterKeyAction.Next  /* 鍵盤確定鍵策略 */
    onAccepted: textArea.focus = true    /* 結束輸入操作行為 */
}

常用值有:

img

改寫demo

這是我根據示例修改的一個 QML demo(嵌入式平台),代碼如下:

import QtQuick 2.10
import QtQuick.Window 2.3
import QtQuick.Controls 2.3
import QtQuick.VirtualKeyboard 2.1
import QtQuick.VirtualKeyboard.Settings 2.1

Window {
    id: root
    visible: true
    width: 1000
    height: 600
    color: "#F6F6F6"

    // 使窗口強制獲得焦點
    MouseArea {
        anchors.fill: parent
        onClicked: forceActiveFocus()
    }

    TextField {
        id: textUser
        placeholderText: "請輸入用戶名"
        font.family: "Microsoft YaHei"
        font.pixelSize: 28
        topPadding: 10
        anchors.top: parent.top
        anchors.topMargin: 40
        anchors.left: parent.left
        anchors.leftMargin: 40

        background: Rectangle {
            implicitWidth: 424
            implicitHeight: 50
            radius: 4
            border.color: parent.focus  ? "#498ff8" : "#C4DBFC"
        }

        // 當選擇輸入框的時候才顯示鍵盤
        onPressed: {
            inputX = x
            inputY = y + height
            inputPanel.visible = true
        }
    }

    TextField {
        id: textPasswd
        placeholderText: "請輸入密碼"
        font.family: "Microsoft YaHei"
        font.pixelSize: 28
        topPadding: 10
        anchors.top: parent.top
        anchors.topMargin: 120
        anchors.left: parent.left
        anchors.leftMargin: 40

        background: Rectangle {
            implicitWidth: 424
            implicitHeight: 50
            radius: 4
            border.color: parent.focus  ? "#498ff8" : "#C4DBFC"
        }

        // 當選擇輸入框的時候才顯示鍵盤
        onPressed: {
            inputX = x
            inputY = y + height
            inputPanel.visible = true
        }
    }

    property int inputX: 0 // 鍵盤x坐標(動態)
    property int inputY: root.height // 鍵盤y坐標(動態)

    // 嵌入式虛擬鍵盤
    InputPanel {
        id: inputPanel
        z: 99
        //更改x,y即可更改鍵盤位置
        x: textUser.x
        y: root.height
        //更改width即可更改鍵盤大小
        width: root.width - 100
        visible: false

        externalLanguageSwitchEnabled: false

        states: State {
            name: "visible"
            when: inputPanel.active
            PropertyChanges {
                target: inputPanel
                // 將鍵盤頂部放在屏幕底部會使其隱藏起來
                x: inputX
                y: inputY
            }
        }

        Component.onCompleted: {
            //VirtualKeyboardSettings.locale = "eesti" // 復古鍵盤樣式
            VirtualKeyboardSettings.wordCandidateList.alwaysVisible = true
        }

        // 這種集成方式下點擊隱藏鍵盤的按鈕是沒有效果的,只會改變active,因此我們自己處理一下
        onActiveChanged: {
            if(!active) { visible = false }
        }
    }

}

效果如下:



程序下載

GitHub下載地址為:https://github.com/confidentFeng/QML_Demo/tree/master/basic

重新編譯,設置語言僅為中英文

Qt 官方提供的示例和插件均是全語言的,不僅僅是中英文,還有阿拉伯語、韓語、日語等不常用的語言,導致只需要中英文切換的情況下,很麻煩。

在邊查前人博客,邊查官方文檔,嘗試去解決這個問題,發現除了重新編譯 qtvirtualkeyboard 模塊,qmake 的時候qmake CONFIG+="lang-en_GB lang-zh_CN" 只編譯配置中英文的情況,其它諸如通過 VirtualKeyboardSettings 設置,或者修改 .pro 工程文件的方法均無效。

由於時間問題,暫未嘗試重新編譯 qtvirtualkeyboard 插件,若有同學感興趣,可以參考:

虛擬鍵盤美化

官方提供的虛擬鍵盤除了黑底的經典皮膚以外,只支持一個復古皮膚,如果這兩種都不喜歡的話,只能通過修改源碼來美化了,具體可以參考:QtVirtualKeyboard 虛擬鍵盤美化

注意事項

  • 如果要使用官方虛擬鍵盤,確保安裝 Qt 的時候勾選了 Qt Virtual Keyboard 選項;
  • 鍵盤大小是根據寬度自動計算的,所以,應用程序應該只設置 InputPanel 的寬度和 y 坐標,而不設置高度;
  • 可以通過動畫設置鍵盤的彈出效果的,具體參考:QML之虛擬鍵盤簡單使用

參考:

知乎:Qt官方示例-虛擬鍵盤使用

Qt 5.9 qml 使用自帶虛擬鍵盤

QML 使用虛擬鍵盤

在Qt quick 中添加qt自帶的虛擬鍵盤

Qt Virtual Keyboard

VirtualKeyboardSettings QML Type



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM