1. 程式人生 > 實用技巧 >QML 常用控制元件:TextInput, TextField, TextEdit, TextArea(編輯框)用法及自定義

QML 常用控制元件:TextInput, TextField, TextEdit, TextArea(編輯框)用法及自定義

本文主要介紹基本元素 TextInput, TextField, TextEdit, TextArea 等的基本屬性。Textlnput 與 TextField 為行編輯控制元件,TextEdit 與 TextArea 為塊編輯控制元件。

一、Textinput

Textinput 用於編輯一行文字,類似於 QLineEdit,除了顯示游標和文字外,預設並沒有邊框等裝飾性效果,所以在使用時一般要為其新增一個視覺化的外觀。

Window {
    visible: true
    width: 320
    height: 240

    Row {
        spacing: 10
        anchors.centerIn: parent

        Text { 
        	text: qsTr("請輸入密碼:") ;
        	font.pointSize: 15
            verticalAlignment: Text.AlignVCenter
        }

        Rectangle {
            width: 100
            height: 24
            color: "lightgrey"
            border.color: "grey"

            TextInput {
                anchors.fill: parent
                anchors.margins: 2
                font.pointSize: 15
                focus: true
            }
        }
    }
}

Textinput 預設並沒有邊框,所以上面使用 Rectangle 作為其邊框,程式執行效果如下圖所示:


下面介紹其一些屬性:

  • font 分組屬性允許你設定 Textlnput 元素所用字型的各種屬性,包括字型族(family)、大小(pixelSize、pointSize)、粗細(bold、weight)、斜體(italic)、下畫線(underline)等。
  • horizontalAlignment 和 verticalAlignment 用於設定文字對齊方式,wrapMode 設定文字超過控制元件寬度時的換行策略,color 設定文字顏色,contentWidth、contentHeight 返回文字的寬、高。
  • 當用戶按了回車鍵或確認鍵,或者編輯框失去焦點時,會發出 accepted 和 editingFinished 訊號,開發者可以實現 onAccepted 和 onEditingFinished 訊號處理器來處理。

1.1 自適應輸入框尺寸

按照前面的程式碼已經為 TextInput 設定了一個基本的外觀,但是如果輸入過多的內容時,會顯示到背景之外,如下圖所示:


所以要根據輸入的內容來動態改變輸入框背景的尺寸,這個可以通過 contentWidthcontentHeight 屬性來根據輸入內容的寬高設定背景矩形的大小,將前面程式碼更改如下:

Rectangle {
    width: input.contentWidth<100 ? 100 : input.contentWidth + 10
    height: input.contentHeight + 5
    color: "lightgrey"
    border.color: "grey"

    TextInput {
        id: input
        anchors.fill: parent
        anchors.margins: 2
        font.pointSize: 15
        focus: true
    }
}

執行效果如下圖所示:


1.2 輸入掩碼

可以使用輸入掩碼 inputMask 來限制輸入的內容,輸入掩碼就是使用一些特殊的字元來限制輸入的格式和內容,舉個簡單的例子,你想讓使用者輸入類似於 "2014-01-30" 這種格式的日期, 可以將 inputMask 設定為 "0000-00-00"。可用的掩碼字元如下表所示。

字元(必須輸入) 字元(可留空) 含義
A a 只能輸入A-Z,a-z
N n 只能輸入A-Z,a-z,0-9
X x 可以輸入任意字元
9 0 只能輸入0-9
D d 只能輸入1-9
# 只能輸入加號(+),減號(-),0-9
H h 只能輸入十六進位制字元,A-F,a-f,0-9
B b 只能輸入二進位制字元,0或1
字元 含義
> 後面的字母字元自動轉換為大寫
< 後面的字母字元自動轉換為小寫
停止字母字元的大小寫轉換
[ ] { } 括號中的內容會直接顯示出來
\ 將該表中的特殊字元正常顯示用作分隔符

下面來看示例程式碼:

Rectangle {
    width: input.contentWidth<100 ? 100 : input.contentWidth + 10
    height: input.contentHeight + 5
    color: "lightgrey"
    border.color: "grey"

    TextInput {
        id: input
        anchors.fill: parent
        anchors.margins: 2
        font.pointSize: 15
        focus: true

        inputMask: ">AA_9_a"
        onEditingFinished: text2.text = text
    }
}

Text { id: text2}

當輸入完成後可以按下回車鍵,這時會呼叫 onEditingFinished 訊號處理器,在其中可以對輸入的文字進行處理。注意,只有當所有必須輸入的字元都輸入後,按下回車鍵才可以呼叫該訊號處理器,比如這裡的掩碼字元 9 要求必須輸入一個數字,如果不輸入而是直接留空,那麼按下回車鍵也沒有效果。程式碼執行效果如下圖所示:


1.3 驗證器

除了使用掩碼,還可以使用整數驗證器 IntValidatorDoubleValidator(非整數驗證器)RegExpValidator(正則表示式驗證器)。下面的程式碼可以限制在 TextInput 中只能輸入 11 到 31 之間的整數:

validator: IntValidator{ bottom: 11; top: 31; }

對於正則表示式的使用,可以參考網上教程。


1.4 回顯方式

TextInput專案的 echoMode 屬性指定了文字的顯示方式,可用的方式有:

  • TextInput.Normal:直接顯示文字(預設方式);
  • TextInput.Password:使用密碼掩碼字元(根據不同平臺顯示效果不同)來代替真實的字元;
  • TextInput.NoEcho:不顯示輸入的內容;
  • TextInput.PasswordEchoOnEdit:使用密碼掩碼字元,但在輸入時顯示真實字元。

下面來看示例程式碼:

TextInput {
    id: input
    focus: true
    echoMode: TextInput.PasswordEchoOnEdit

    onEditingFinished: {
        input.focus = false
        text2.text = text
    }
}

程式碼先設定了 TextInput 獲得焦點,這樣輸入字元會直接顯示,等輸入完成按下回車鍵以後使 TextInput 失去焦點,這樣輸入的字元會用密碼掩碼顯示。效果如下圖所示:


如果 echoMode 不為 Textlnput.Normal,那麼 displayText 屬性就儲存顯示給使用者的文字,而 text 屬性則儲存實際輸入的文字,比如你設定 passwordCharacter 為 *, echoMode為TextInput.Password,那麼displayText屬性內儲存的就是一串 *。


二、TextEdit

TextEdit 是 Qt Quick 提供的多行文字編輯框,它的大多數屬性與 Textinput 類似。下面只說不同之處:

  • 文字顏色

    TextInput 的文字顏色使用 color 屬性指定,TextField 的文字顏色使用 textColor 屬性指定。

  • 背景色

    TextInput 沒有背景,是透明的,能夠與父控制元件無縫結合;而 TextField 有背景,其背景色可通過 TextFieldStyle 的 background 屬性來設定,其他屬性都一樣。

  • 富文字
    Textlnput 不支援使用 HTML 標記的富文字,而 TextEdit 可以。

示例如下:

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    TextEdit {
        width: 240
        textFormat: Text.RichText
        text: "<b>Hello</b> <i>World!</i>"
        font.family: "Helvetica"
        font.pointSize: 20
        color: "blue"
        focus: true
        anchors.centerIn: parent
    }
}


執行程式碼可以看到,TextEdit 沒有提供滾動條、游標跟隨和其它在可視部件中通常具有的行為。為了更加人性化的體驗,我們可以使用 Flickable 來為其提供滾動,實現游標跟隨。下面來看一段示例程式碼:

Window {
    visible: true
       width: 640
       height: 480

       Flickable {
           id: flick

           anchors.fill: parent
           contentWidth: edit.paintedWidth
           contentHeight: edit.paintedHeight
           clip: true

           function ensureVisible(r)
           {
               if (contentX >= r.x)
                   contentX = r.x;
               else if (contentX+width <= r.x+r.width)
                   contentX = r.x+r.width-width;
               if (contentY >= r.y)
                   contentY = r.y;
               else if (contentY+height <= r.y+r.height)
                   contentY = r.y+r.height-height;
           }

           TextEdit {
               id: edit
               width: flick.width
               height: flick.height
               font.pointSize: 15
               wrapMode: TextEdit.Wrap
               focus: true
               onCursorRectangleChanged:
                   flick.ensureVisible(cursorRectangle)
           }
       }

       Rectangle {
           id: scrollbar
           anchors.right: flick.right
           y: flick.visibleArea.yPosition * flick.height
           width: 10
           height: flick.visibleArea.heightRatio * flick.height
           color: "lightgrey"
       }
}

這裡使用的 Flickable 型別到後面會詳細講解。在 TextEdit 中可以設定 selectByMouse 屬性為 true 來使滑鼠可以選取文字內容,可以直接通過鍵盤快捷鍵實現文字的複製、貼上、撤銷等操作,當然也可以使用相應的函式來完成。執行效果如下圖所示:


參考:

《Qt Quick核心程式設計》第9章

QML學習(五)—<TextInput和TextEdit輸入欄>