Qt Quick 登录界面代码学习笔记
一、整体项目结构说明
先看你的项目文件结构,帮你理清每个文件的作用:
DemoLoginForm
├── DemoLoginForm.pro # Qt项目配置文件,管理依赖、编译规则
├── Sources
│ └── main.cpp # 程序入口,负责启动QML引擎
├── Resources
│ ├── qml.qrc # 资源文件,把图片、qml文件打包进程序
│ └── /
│ ├── image # 存放图片资源
│ │ ├── BgImage.png
│ │ ├── lock.svg
│ │ └── mail.svg
│ ├── Utils # 存放自定义QML组件
│ │ └── Custominput.qml
│ └── main.qml # 主界面QML文件
└── Other files
核心逻辑:main.cpp 启动程序 → 加载 main.qml 主界面 → main.qml 调用 Utils/Custominput.qml 自定义输入框组件。
二、Custominput.qml 代码逐行解析
这是你报错的自定义输入框组件,我们一行一行看懂它:
qml
// 1. 导入Qt Quick核心模块,版本2.0
// 说明:所有基础的UI控件(Rectangle、Image、TextField等)都来自这个模块
import QtQuick 2.0
// 2. 导入Qt Quick Controls控件模块,版本2.12
// 说明:TextField(文本输入框)属于这个模块,必须导入才能使用
import QtQuick.Controls 2.12
// 3. 定义自定义组件Custominput,继承自系统自带的TextField控件
// 说明:TextField是系统自带的单行文本输入框,我们给它加样式和图标,变成自己的组件
TextField {
// 4. 给组件设置id为control,方便后续在组件内部引用自己
id:control
// 5. 设置组件的默认高度为40像素(implicitHeight是控件的推荐高度)
implicitHeight: 40
// 6. 设置输入框内文字的颜色为深灰色(#1e1e1e是十六进制颜色代码,接近黑色)
color: "#1e1e1e"
// 7. 设置输入框内文字的字号为12号
font.pointSize: 12
// 8. 设置输入框右侧内边距为40像素(防止文字和右侧图标重叠)
rightPadding:40
// 9. 自定义输入框的背景样式,替换TextField默认的背景
background: Rectangle{
// 10. 让背景矩形填满父控件(也就是TextField本身)
anchors.fill: parent
// 11. 设置背景颜色为浅灰色(#f1f1f1)
color: "#f1f1f1"
// 12. 设置背景矩形的圆角半径为10像素,实现圆角效果
radius: 10
}
// 13. 在输入框内添加一个图片控件,用来显示图标
Image{
// 14. 设置图片的位置锚点:右对齐、垂直居中,距离右侧15像素
anchors{
right: parent.right
rightMargin: 15
verticalCenter: parent.verticalCenter
}
// 15. 设置图片的宽度和高度都是20像素
width: 20
height: 20
// 16. 设置图片的资源路径(qrc:/开头是Qt资源文件的路径,指向image文件夹下的mail.svg)
source: "qrc:/image/mail.svg"
// 17. 设置图片的填充模式为PreserveAspectCrop:保持图片宽高比,裁剪超出部分来填满控件
fillMode: Image.PreserveAspectCrop
}
}
三、main.qml 代码逐行解析
这是你的主界面文件,程序启动后会先加载这个文件:
qml
// 1. 导入Qt Quick核心模块,版本2.14
import QtQuick 2.14
// 2. 导入窗口模块,版本2.14,提供Window窗口控件
import QtQuick.Window 2.14
// 3. 导入布局模块,版本1.12,提供ColumnLayout等布局控件
import QtQuick.Layouts 1.12
// 4. 导入控件模块,版本2.12,提供Label、Text等基础控件
import QtQuick.Controls 2.12
// 5. 导入Utils文件夹,这样才能使用里面的Custominput自定义组件
import "Utils"
// 6. 定义主窗口,继承自Window控件
Window {
// 7. 给窗口设置id为window,方便后续引用
id:window
// 8. 设置窗口可见(默认是false,不设置的话程序运行看不到窗口)
visible: true
// 9. 设置窗口宽度为400像素,高度为700像素
width: 400
height: 700
// 10. 设置窗口标题为"Hello World"(显示在窗口标题栏)
title: qsTr("Hello World")
// 11. 设置窗口标志:普通窗口 + 无边框(FramelessWindowHint)
// 说明:去掉了系统自带的标题栏,需要自己实现关闭/最小化按钮
flags: Qt.Window|Qt.FramelessWindowHint
// 12. 设置窗口的x坐标:屏幕宽度的一半减去窗口宽度的一半,实现水平居中
x:(Screen.width-width)/2
// 13. 设置窗口的y坐标:屏幕高度的一半减去窗口高度的一半,实现垂直居中
y:(Screen.height-height)/2
// 14. 设置窗口背景颜色为透明,配合外层Rectangle实现自定义背景
color: "transparent"
// 15. 添加一个矩形控件,作为窗口的主背景
Rectangle{
// 16. 让矩形填满父控件(也就是整个窗口)
anchors.fill: parent
// 17. 设置矩形背景颜色为极浅的灰白色(#fafafa)
color: "#fafafa"
// 18. 设置矩形的圆角半径为40像素,实现大圆角效果
radius: 40
// 19. 添加列布局控件,让里面的子控件垂直排列
ColumnLayout{
// 20. 设置布局的锚点:左右贴边、顶部贴边,内边距20像素
anchors{
left:parent.left
right: parent.right
top: parent.top
margins: 20
}
// 21. 添加图片控件,作为顶部背景图
Image {
id: imageone
// 22. 图片资源路径,指向资源文件里的BgImage.png
source: "qrc:/image/BgImage.png"
// 23. 让图片填满布局的宽度
Layout.fillWidth: true
// 24. 设置图片的高度为200像素
Layout.preferredHeight: 200
}
// 25. 添加Label控件,显示欢迎标题
Label{
text: qsTr("Welcome back")
// 26. 设置文字的字体属性:字号20,半粗体
font{
pointSize: 20
weight:Font.DemiBold
}
// 27. 设置文字水平居中
Layout.alignment: Qt.AlignHCenter
}
// 28. 添加Text控件,显示副标题
Text {
text: qsTr("sign in to access your account")
// 29. 设置文字颜色为中灰色(#777)
color: "#777"
// 30. 设置文字的字体属性:字号16,正常粗细
font{
pointSize: 16
weight:Font.Normal
}
// 31. 设置文字水平居中
Layout.alignment: Qt.AlignHCenter
}
// 32. 添加一个空的Item控件,用来撑开垂直方向的间距
Item {
Layout.preferredHeight: 30
}
// 33. 被注释掉的矩形控件(可以取消注释看效果)
// Rectangle{
// Layout.fillWidth: true
// Layout.preferredHeight: 10
// color: "#ef3f5f"
// }
// 34. 调用我们自定义的Custominput输入框组件
Custominput{
// 35. 让输入框填满布局的宽度
Layout.fillWidth: true
}
}
}
// 36. 添加一个快捷键Action,按Ctrl+q可以退出程序
Action{
shortcut:"Ctrl+q"
onTriggered:Qt.quit()
}
}
四、你之前报错的原因解析
你之前的报错是:
qrc:/Utils/Custominput.qml:6:12: Invalid property assignment: color expected
从你贴的代码来看,现在的 Custominput.qml 第6行是 color: "#1e1e1e",写法是完全正确的,所以现在这个错误已经解决了。
补充说明:
- 你之前的错误大概率是
color属性的赋值格式不对(比如没加引号、颜色代码写错),现在已经修正了。 - 现在的代码里,
main.qml已经正确导入了Utils文件夹,所以Custominput组件可以正常识别,不会再报Type Custominput unavailable的错误了。
五、给小白的额外学习小贴士
qsTr()是什么?
qsTr()是Qt的国际化函数,把字符串包起来,方便后续做多语言版本,不影响当前显示效果。anchors锚点是什么?
QML里用anchors来控制控件的位置和对齐,比如anchors.fill: parent就是让控件填满父控件,anchors.centerIn: parent就是让控件在父控件中居中。Layout.fillWidth是什么?
只有放在ColumnLayout/RowLayout等布局控件里的子控件,才能用Layout.fillWidth让自己填满布局的宽度。qrc:/路径是什么?
是Qt资源文件的路径,只要文件被加到qml.qrc里,就可以用qrc:/开头的路径访问,不用关心文件实际放在电脑的哪个文件夹。
六、当前代码运行效果说明
现在的代码运行后,会出现一个400×700的无边框窗口,包含:
- 顶部的背景图片
- 居中的"Welcome back"标题和副标题
- 一个带邮件图标的圆角输入框
- 按
Ctrl+q可以直接关闭程序
要不要我帮你把这个笔记整理成更适合保存的Markdown格式,再补充几个常见的QML报错和修复方法?