Qt Quick 登录界面代码学习笔记

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",写法是完全正确的,所以现在这个错误已经解决了。

补充说明:

  1. 你之前的错误大概率是color属性的赋值格式不对(比如没加引号、颜色代码写错),现在已经修正了。
  2. 现在的代码里,main.qml已经正确导入了Utils文件夹,所以Custominput组件可以正常识别,不会再报Type Custominput unavailable的错误了。

五、给小白的额外学习小贴士

  1. qsTr() 是什么?
    qsTr() 是Qt的国际化函数,把字符串包起来,方便后续做多语言版本,不影响当前显示效果。
  2. anchors 锚点是什么?
    QML里用anchors来控制控件的位置和对齐,比如anchors.fill: parent就是让控件填满父控件,anchors.centerIn: parent就是让控件在父控件中居中。
  3. Layout.fillWidth 是什么?
    只有放在ColumnLayout/RowLayout等布局控件里的子控件,才能用Layout.fillWidth让自己填满布局的宽度。
  4. qrc:/ 路径是什么?
    是Qt资源文件的路径,只要文件被加到qml.qrc里,就可以用qrc:/开头的路径访问,不用关心文件实际放在电脑的哪个文件夹。

六、当前代码运行效果说明

现在的代码运行后,会出现一个400×700的无边框窗口,包含:

  • 顶部的背景图片
  • 居中的"Welcome back"标题和副标题
  • 一个带邮件图标的圆角输入框
  • Ctrl+q可以直接关闭程序

要不要我帮你把这个笔记整理成更适合保存的Markdown格式,再补充几个常见的QML报错和修复方法?

相关推荐
Brilliantwxx1 小时前
【C++】priority_queue以及 仿函数 的学习
开发语言·c++·笔记·学习·算法
宠..1 小时前
VS Code 修改 C++ 标准同时修改错误检测标准
java·linux·开发语言·javascript·c++·python·qt
小+不通文墨1 小时前
树莓派4b-wiringpi库的安装和使用
驱动开发·经验分享·笔记·嵌入式硬件·学习
江公望1 小时前
Qt QRegularExpression正则类,10分钟讲清楚
qt
xuhaoyu_cpp_java1 小时前
SpringMVC学习(三)
java·经验分享·笔记·学习·spring
学机械的鱼鱼2 小时前
【学习笔记】XTDrone2 目录结构说明
笔记·学习
宠..2 小时前
下拉列表框事件绑定
开发语言·qt·microsoft
05候补工程师2 小时前
【矩阵代数】伴随矩阵、逆矩阵与秩的逻辑关系全梳理
笔记·线性代数·考研·矩阵
Hua-Jay2 小时前
OpenCV联合C++/Qt 学习笔记(十八)----二维码检测及积分图像
c++·笔记·qt·opencv·学习