14.Quick QML-TextInput詳解

1.TextInput屬性
用來編輯一行文本,對應QLineEdit,除了正常輸入外,我們還可以設置echoMode屬性改為密碼顯示狀態,也可以通過validator屬性和inputMask屬性來設置驗證器或輸入掩碼,來限制文本輸入內容.也可以設置selectByMouse為true,讓滑鼠支援編輯選中的文本區域….等等.它的屬性是非常非常的多,要想熟練使用該組件,我們還是有必要過濾一遍.
TextInput的屬性如下所示:

  • acceptableInput : bool,只讀屬性,用來獲取當前輸入的內容是否合法的輸入,默認始終為true,如果我們設置了validator屬性和inputMask屬性,那麼該值則為false,除非當前文本框內容滿足輸入的要求才會為true
  • inputMask : string,用來設置輸入掩碼,限制允許的文本輸入,具體參考QLineEdit::inputMask,比如:
    • A:必須輸入A-Z,a-z
    • a:可以輸入A-Z,a-z,或者也可以忽略
    • N:必須輸入A-Z,a-z,0-9
    • n:可以輸入A-Z,a-z,0-9,或者也可以忽略
    • X:支援任何字元
    • x:可以輸入任何字元,或者也可以忽略
    • 9:只能輸入數字0-9
    • 0:可以輸入數字0-9,或者也可以忽略
    • B:只能輸入二進位數0或者1
  • 比如:
    • inputMask: “0000.00.00”: 此時acceptableInput始終為true,因為0表示可以輸入0-9,也可以忽略不輸入,
    • inputMask: “出生日期:9999-99-99”: 那麼acceptableInput為false,比如我們輸入具體日期後,才會為true
  • activeFocusOnPress : bool,默認值為ture,表示當滑鼠按下,TextInput時則獲得活動焦點(顯示游標).設置為false,則滑鼠按下,也無法編輯TextInput,除非我們設置了focus屬性為true,讓它始終獲取焦點.
  • autoScroll : bool,當文本長於寬度時,TextInput是否應滾動。默認為true,若設為false,如果超過寬度,並且clip為true的情況下,則無法滾動到我們輸入的字元位置處
  • bottomPadding : real,底部內邊距
  • canPaste : bool,只讀屬性,用來表示TextInput是否可以被粘貼,只有當TextInput是可寫狀態,並且剪貼板的內容符合格式要求,則返回true
  • canRedo : bool,只讀屬性,是否可以重做撤消操作,如果支援則返回true
  • canUndo : bool,只讀屬性,是否可以撤消操作,如果支援則返回true
  • color : color,文本顏色
  • contentHeight : real,只讀屬性,用來獲取文本的高度,需要注意的是文本的高度取決於font.pixelSize大小,而不是組件的height
  • contentWidth : real,只讀屬性,用來獲取文本的寬度(不是一個字元的寬度,而是當前輸入的所有字元的寬度)
  • cursorDelegate : Component,游標委託,用來設置自定義的游標,並且委託組件的根項必須是QQuickItem或QQuickItem派生類
  • cursorPosition : int,游標在TextInput的位置(不是像素點位置,以I表示游標,比如012I3,cursorPosition=3,I0123,cursorPosition=0)
  • cursorRectangle : rectangle,只讀屬性,用來獲取游標的像素坐標和大小
  • cursorVisible : bool,游標是否顯示,我們也可以自己設置它,比如:
  • TextInput {
        text:"TextInput"
        onCursorVisibleChanged: {
            cursorVisible = true // 就算我們取消焦點後,游標也會一直顯示
        }
    }    
  • displayText : string,只讀屬性,用來獲取當前顯示的文本,如果echoMode為TextInput.Password,那麼獲取的顯示文本始終為●●●●
  • echoMode : enumeration,指定文本應如何在TextInput中顯示,取值有以下幾種:
    • TextInput.Normal – 按原樣顯示文本。(默認)
    • TextInput.Password – 顯示與平台相關的密碼掩碼字元”●”,而不是實際字元。
    • TextInput.NoEcho – 不顯示任何內容。
    • TextInput.PasswordEchoOnEdit – 編輯時顯示輸入的字元,未編輯是顯示平台相關的密碼掩碼字元”●”
  • font.bold : bool,是否粗體
  • font.capitalization : enumeration,設置文本顯示大寫字母,取值有以下幾種:
    • Font.MixedCase – 默認,普通文本呈現
    • Font.AllUppercase – 將所有字母顯示為大寫(只改變顯示內容,但是text內容不會被改變)
    • Font.AllLowercase – 將所有字母顯示為小寫(只改變顯示內容,但是text內容不會被改變)
  • font.family : string,設置字體族
  • font.italic : bool,是否斜體
  • font.kerning : bool,字距調整功能,默認為true,設置false,會提高創建文本速度,但是會會犧牲一些外觀功能
  • font.letterSpacing : real,設置單個字母間的默認間距.正值將字母間距增加相應像素;負值將減少間距。
  • font.pixelSize : int,像素大小
  • font.pointSize : real,字體大小
  • font.strikeout : bool,是否顯示刪除線
  • font.styleName : string,字體風格名稱.
  • font.underline : bool,是否顯示下劃線
  • font.weight : enumeration,字體的權重,比如設置為Font.Bold,表示字體是粗體
  • font.wordSpacing : real,設置每個單詞間的間距
  • horizontalAlignment : enumeration,設置水平文本對齊方式
  • verticalAlignment : enumeration,設置垂直文本對齊方式
  • inputMethodHints : enumeration,向qml虛擬鍵盤提示顯示不同的輸入方式, 比如Qt.ImhUppercaseOnly(提示虛擬鍵盤只顯示大寫字母)
  • leftPadding : real,左側內邊距
  • length : int,組件長度
  • maximumLength : int,組件最大長度
  • overwriteMode : bool,覆蓋模式,默認為false,輸入文本時,是插入游標位置處,如果為true,則是將覆蓋當前文本
  • padding : real,內邊距
  • passwordCharacter : string,自定義顯示的密碼掩碼字元,比如默認顯示的是”●”,如果我們設置passwordCharacter為”*”,那麼顯示的密碼掩碼就是*
  • passwordMaskDelay : int,設置可見字元被密碼字元屏蔽之前的延遲,以毫秒為單位,設置undefined則表示沒有延遲.
  • readOnly : bool,設置是否只讀,默認為false
  • rightPadding : real,右側內邊距
  • selectByMouse: 默認為false,設置為true,則可以通過滑鼠來編輯選中文本區域
  • selectionStart : int,只讀屬性,獲取當前選中的第一個字元之前的游標位置,比如:**000***(0表示選中的意思,*表示未選中的意思),那麼返回2
  • selectionEnd : int,只讀屬性,獲取當前選中的最後一個字元之後的游標位置,如果我們要更改選中的位置,可以使用 select(start,end), selectAll()或者selectWord().
  • selectedText : string,只讀屬性,獲取當前選定中的文本,它比text.toString().substring(selectionStart,selectionEnd)效率更快
  • selectedTextColor : color,設置當前選定中的文本顏色
  • selectionColor : color,設置當前選定中的文本背景顏色
  • text : string,用戶輸入的文本,也可以自己設置
  • topPadding : real,頂部內邊距
  • validator : Validator,驗證器,設置後,只有當按下enter鍵後,如果文本符合驗證要求,才會發射accepted訊號,目前支援的驗證器有IntValidator、DoubleValidator、RegExpValidator和RegularExpressionValidator
  • wrapMode : enumeration,包裝模式,設置為TextInput.Wrap時,表示寬度不足時,可以換行

2.TextInput訊號

TextInput的訊號如下所示:

  • accepted() : 當按下返回或Enter鍵時,會發出此訊號。請注意,如果文本輸入上設置了validator或inputMask,則只有在輸入處於可接受狀態時,才會發出訊號。
  • editingFinished() :當按下返回或Enter鍵或文本輸入失去焦點時,會發出此訊號。請注意,如果文本輸入上設置了驗證器或inputMask,並且按了enter/return,則只有在輸入跟隨inputMask並且驗證器返回可接受狀態時,才會發出此訊號。
  • textEdited() : 每當編輯文本時,就會發出此訊號。與textChanged()不同,例如,通過直接更改text值或調用clear(),不會發出此訊號。

3.TextInput方法

TextInput的方法如下所示:

  • clear() : 清除文本輸入的內容
  • copy() : 將當前選定的文本複製到系統剪貼板,如果echoMode不等於TextInput.Normal,則複製將無法工作。避免密碼被盜
  • cut() : 將當前選定的文本移動到系統剪貼板,如果echoMode不等於TextInput.Normal,則無法工作。避免密碼被盜
  • deselect() : 取消當前選中
  • ensureVisible(position) : 指定可見的位置,如果clip為true,並且文本超過寬度,則可以通過該方法,滾動到要顯示的位置處
  • string getText(start, int end) : 獲取start和end之間的文本部分。
  • insert(position, string text) : 在position位置處插入文本
  • moveCursorSelection(position, SelectionMode mode) : 移動游標選中的功能,從cursorPosition到position處(如果僅移動游標,設置cursorPosition屬性即可),mode取值有:
      • TextInput.SelectCharacters : position以每個字元單位
      • TextInput.SelectWords: position以每個單詞為單位
  • paste() : 將當前系統剪貼板的內容粘貼到選中的文本或者游標編輯位置處.
  • int positionAt(x, real y, CursorPosition position) : 獲取x和y像素點所在字元在文本中的位置.position取值有:
      • TextInput.CursorBetweenCharacters :返回字元之間最接近x像素點的位置(默認值),就和游標一樣,滑鼠點在哪個位置,那麼游標就會出現在最近的字元之間位置附近.
      • TextInput.CursorOnCharacter: 返回最接近x的字元之前的位置。
  • rect positionToRectangle(pos) : 獲取pos位置處的游標應該佔用的像素點位置和大小,pos為字元位置(不是像素點位置).
  • redo() : 重做
  • remove(start, int end) : 刪除start和end之間的文本部分。
  • select(start, int end) : 選中start和end之間的文本部分,如果start或end超出範圍,則不會更改選擇。
  • selectAll() : 全選
  • selectWord() : 選中最接近當前游標位置的單詞
  • undo() : 撤銷

4.validator驗證器屬性介紹
目前支援的驗證器有IntValidator、DoubleValidator、RegExpValidator和RegularExpressionValidator,並且當按下enter鍵後,如果文本符合驗證要求,才會發射accepted訊號

IntValidator(整數驗證器)
IntValidator用來為整數值提供驗證器, 如果未設置驗證的區域,IntValidator將只接受正負號(正負號必須在文本開頭)和數字、IntValidator的屬性有bottom(整數的下限值)、top(整數的上限值)
示例如下所示(輸入10-99的值):

TextInput {
        anchors.fill: parent
        validator: IntValidator{
            bottom: 10
            top: 99
        }

        onAccepted: {
            console.log("你輸入的值為:"+text);
        }
    } 

當我們輸入文本符合驗證要求時,則列印log.

 

DoubleValidator(雙精度浮點數驗證器)
通過bottom和top 來設置輸入範圍, 通過decimals 來設置小數位個數;
示例如下所示:

TextInput {
        anchors.fill: parent
        validator: DoubleValidator {
            decimals: 2
            bottom: 10
            top: 99
        }

        onAccepted: {
            console.log("你輸入的值為:"+text);
        }
 }

 

RegularExpressionValidator (正則表達式驗證器)
比如:

  • /name:(.+?);/gi

最前面的「/」與最後面的「/」是分隔符,表示正則表達式的開始與結束。所以正則表達式匹配的內容是” str(.+?);”,而“+?”表示是至少重複一次或者多次的意思,所以匹配的內容是name:開頭,”;”結尾的匹配項。
“g”表示的是全局匹配,可以匹配到多次的情況,如果不加”g”,那麼result的匹配項最多只能有1個,i表示表示忽略大小寫(ignoreCase,)、相關的標誌還有m(multiline,表示允許跨行)
示例如下所示:

Window {
    id: wind
    width: 550;
    height: 400;
    visible: true;
    Text {
        id: hint
        color: "red"
        font.pixelSize : 20
        text: "請輸入成員名字,以\"name:\"開頭,以\";\"隔開:"
    }
    TextInput {
        id: input
        property var regx: /name:(.+?);/gi
        anchors.top: hint.bottom
        focus: true
        font.pixelSize : 20
        validator: RegularExpressionValidator {
            regularExpression: input.regx
        }
        onAccepted: {
            var result = text.match(input.regx);

            var str = "成員數量為:"+result.length
            for (var i in result) {
                var resultStr = result[i].replace(/ /g,"");  // 刪除空格
                str += "\n" + resultStr.replace(/name:/g,"");   // 刪除"name:"
            }
            resultPrint.text = str;
        }
    }

    Text {
        id: resultPrint
        anchors.top: input.bottom
        anchors.topMargin: 40
        font.pixelSize : 20
        color: "green"
        text: "等待結果"
    }
}

效果如下所示:

可以看到我們就算了”—“干擾字元,也可以識別出來.並且由於加了”g”全局匹配符,所以找到了3個成員,如果不加g,則只會匹配一次.