我有一個 QML TextField,想將長度限制為 16 個字符。
TextField {
id: myTextField
maximumLength: 16
}
假設我在一個 15 個字符長的字串的末尾輸入了一個多位元組字符,如“??”,表情符號被修剪并結果為?,這是一個位元組(在本例中為 0x3f)。我不確定 0x3f 來自哪里,因為在內部QString使用 UTF-16,所以這可能是 UTF-8 和 UTF-16 之間來回轉換的結果。
我現在看到避免這種多位元組字符修剪的唯一方法是實作我自己的方法QValidator,然后我需要使用 ICU 等支持 Unicode 的庫檢查字串的長度。
我現在的問題:還有其他更簡單的方法可以避免我在這里遺漏的修剪嗎?
uj5u.com熱心網友回復:
首先,讓我們看一下??表情符號:
import QtQuick
import QtQuick.Controls
Page {
Column {
Text { text: "??" } // ??
Text { text: "\u{1f60a}" } // ??
Text { text: "\u{d83d}\u{de0a}" } // ??
Text { text: "\u{d83d}" } // ?
Text { text: "\u{de0a}" } // ?
Text { text: "?" } // ?
Text { text: "\u{fffd}" } // ?
}
}
它是一個代碼點字符 \u{1f60a},由 \u{d83d} 和 \u{de0a} 組成。因為您在粘貼表情符號時將 maximumLength 設定為 16,所以您只會獲得其中一個字符,即 Qt 識別為非字符的 \u{d83d} ,因此它將其替換為 \u{fffd} ,它是“的占位符字符”我不知道”。
如果您想將輸入限制為 16 個“字符”但又想消除“我不知道”字符,您可以使用 RegularExpressionValidator。
maximumLength: 16
validator: RegularExpressionValidator {
regularExpression: /[^?]{0,16}/u
}
或者,如果您想將自己限制為 16 個代碼點字符,您可以執行以下操作:
validator: RegularExpressionValidator {
regularExpression: /.{0,16}/u
}
這是前者的完整作業示例:
import QtQuick
import QtQuick.Controls
Page {
TextField {
id: myTextField
anchors.centerIn: parent
width: parent.width / 2
text: "????????????????"
maximumLength: 16
validator: RegularExpressionValidator {
regularExpression: /[^?]{0,16}/u
}
}
Text {
anchors.horizontalCenter: parent.horizontalCenter
y: parent.height * 3 / 4
text: myTextField.length
}
}
您可以在線試用!
uj5u.com熱心網友回復:
最簡單的解決方案似乎是實施QValidator
QValidator::State MyValidator::validate(QString & input, int & pos) const
{
Q_UNUSED(pos)
if(input.length() <= 16)
return Acceptable;
return Invalid;
}
不需要 ICU 或其他圖書館。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/528358.html
上一篇:qt5qml,當Text控制元件文本被修剪時,如何替換“...”的字符
下一篇:讓另一個小部件處理Qt中的事件
