import QtQuick 2.0import QtQuick.Layouts 1.12
import"../pad"
// PasswordKeyboard.qml
import QtQuick 2.12ColumnLayout {id: keyboardspacing: 8// 鍵盤標題Text {text: "安全輸入"font.pixelSize: 16color: "#666"Layout.alignment: Qt.AlignHCenterLayout.bottomMargin: 10}// 提示Text {text: "輸入密碼時,請確保周圍環境安全"font.pixelSize: 14color: "#ff5252"Layout.alignment: Qt.AlignHCenter}// 鍵盤區域GridLayout {Layout.alignment: Qt.AlignHCentercolumns: 4columnSpacing: 10rowSpacing: 10// 數字按鍵 1-9Repeater {model: 9Keybutton {text: index + 1width: 70height: 60onClicked: if (activeInputField) activeInputField.text += text}}// 特殊按鍵Keybutton {text: "0"width: 70height: 60onClicked: if (activeInputField) activeInputField.text += text}Keybutton {text: "?"width: 70height: 60bgColor: "#ff5252"onClicked: {if (activeInputField && activeInputField.text.length > 0) {activeInputField.text = activeInputField.text.slice(0, -1);}}}Keybutton {text: "完成"width: 70height: 60bgColor: "#4CAF50"onClicked: keyboardClosed()}}// 信號signal keyboardClosed()// 屬性property var activeInputField: null
}
// KeyButton.qml
import QtQuick 2.12Rectangle {id: buttonwidth: 60height: 50radius: 8// 公共屬性property string text: ""property color bgColor: "white"property color textColor: "#333"// 信號signal clicked()color: mouseArea.pressed ? Qt.darker(bgColor, 1.1) : bgColorborder.color: "#ddd"border.width: 1Text {text: button.textfont.pixelSize: 20font.bold: truecolor: button.textColoranchors.centerIn: parent}MouseArea {id: mouseAreaanchors.fill: parentonClicked: button.clicked()}
}
我們注意到代碼中有幾個問題需要修正:
1. 特殊按鍵部分有兩個按鈕:一個是"0"按鈕,另一個是退格按鈕(但文本是".",這可能是設計錯誤,因為通常退格按鈕用圖標或"←"表示,而小數點按鈕是".")。
2. 當前代碼中,小數點按鈕實際上被用作退格(刪除最后一個字符)功能,這顯然是不正確的。根據按鈕的文本,它應該是輸入小數點,但點擊事件卻是刪除。
3. 另外,我們注意到有一個“0”按鈕,寬度為140,而其他按鈕寬度為70,這樣布局可能會出現問題,因為GridLayout默認是左到右排列,并且我們設置了列間距。我們打算將鍵盤布局為3列,但是目前數字1-9有9個按鈕(3x3),然后下面一行應該是一個寬按鈕(0)占兩列,然后一個小按鈕(退格)占一列。但是代碼中并沒有明確設置列數(columns屬性被注釋了),而是通過flow和每個按鈕的寬度來布局。 根據代碼,我們想要3列布局,那么: 第一行:1,2,3 第二行:4,5,6 第三行:7,8,9 第四行:0(占兩列寬度)和 一個退格按鈕(占一列) 但是目前代碼中,Repeater生成了9個按鈕(1-9),然后接著是兩個按鈕:0和退格(當前顯示為小數點,但功能是退格)。 問題在于,GridLayout在沒有設置列數的情況下,會根據子項的寬度自動換行。我們期望第四行只有兩個按鈕:一個占兩列(寬度140,等于兩個70加上一個列間距10)的0按鈕,和一個占一列(70)的退格按鈕。但是,由于GridLayout的列間距為10,所以總寬度應該是:兩列寬度(70*2)加上兩個列間距(10*2)等于160,而0按鈕寬度140小于160,所以實際上0按鈕只會占據一列多,而不會自動跨兩列。 因此,我們需要為0按鈕設置Layout.columnSpan屬性,讓它橫跨兩列。同時,我們需要設置GridLayout的columns屬性為3,這樣布局才能按照3列來排列。
修改建議: 1. 取消注釋columns: 3,設置為3列。
2. 為0按鈕設置Layout.columnSpan: 2,使其橫跨兩列。 3. 將小數點按鈕的文本改為表示退格的符號(比如"←"),并調整其功能為刪除最后一個字符。同時,添加一個小數點按鈕,但是這里我們注意到,原代碼中并沒有小數點按鈕,所以我們需要添加。 4. 但是原設計似乎只有10個鍵(1-9,0,退格),而小數點按鈕缺失。根據常見數字鍵盤,通常有0、小數點、退格。因此,我們可能需要調整第四行為三個按鈕:0、小數點、退格。但這樣第四行就有三個按鈕,而0按鈕就不需要跨兩列了。或者另一種常見布局是第四行有0(占一列)、小數點(占一列)、退格(占一列)。但是這樣第四行就是三個按鈕,與前三行對齊。 考慮到原設計是0按鈕占140(兩個70的寬度),而退格按鈕占70,并且列間距10,那么0按鈕的寬度140實際上等于兩個按鈕的寬度(70*2)加上一個列間距(10)。因此,如果我們設置3列,那么0按鈕橫跨兩列,退格按鈕占一列,這樣第四行就只需要兩個按鈕(0和退格),而小數點沒有位置了。 所以,我們需要重新設計第四行,有兩種方案: 方案一:第四行三個按鈕:0、.、退格,每個按鈕寬度70。這樣0按鈕就不需要跨列了。 方案二:保持0按鈕跨兩列,然后退格按鈕占一列,但這樣就沒有小數點按鈕的位置了。 根據需求,我們需要小數點按鈕。因此,我們采用方案一:第四行三個按鈕:0、小數點、退格。 調整如下: 1. 將Repeater的9個按鈕(1-9)生成后,再添加三個按鈕:0、小數點、退格。 2. 設置GridLayout的columns為3,這樣每行三個按鈕。 3. 調整0按鈕的寬度為70(與其他按鈕一致),不再跨列。 但是,原代碼中0按鈕后面只有一個按鈕(退格,但文本是小數點)。現在我們需要添加小數點按鈕。 因此,我們將特殊按鍵部分拆分成三個按鈕:0、小數點、退格。 同時,修正退格按鈕的文本和功能: - 小數點按鈕:文本為".",點擊事件是追加小數點。 - 退格按鈕:文本可以是"←"或"退格",點擊事件是刪除最后一個字符。