C++ QT qml 学习之 做个登录界面

news2024/11/28 16:40:51

最近在学习QT,也初探到qml 做ui 的灵活性与强大,于是手痒痒,做个demo 记录下学习成果

主要内容是如何自己编写一个按钮以及qml多窗口。

参考WX桌面版,做一个登录界面,这里面按钮是写的一个组合控件,有 按下,释放,以及正常 三种状态。

import QtQuick 2.0
import QtQuick.Controls 2.4



Rectangle
{
    id:root
    width:400
    height:50
    radius:6
    property alias text:rect_text.text
    property alias tip_text:btn_tip.text
    state: rect_mouse.pressed ? "pressed" : (rect_mouse.containsMouse ? "hovered" : "normal")
    //使用方可以处理这个信号来相应按钮点击
    signal btnclicked

    Text
    {
        id:rect_text
        font.pointSize: 16
        font.bold: true
        color:"#ffffff"
        anchors.horizontalCenter:parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
        anchors.verticalCenterOffset: 0
    }

    ToolTip
    {
        id:btn_tip
        font.pointSize: 14
        delay: 500
        timeout: 2000
        x:parent.width/2
        y:parent.height
    }

    states: [
        State {
            name: "pressed"
            PropertyChanges { target: root; color: "#01968c" }
        },
        State {
            name: "normal"
            PropertyChanges { target: root; color: "#00beac" }
        },
        State {
            name: "hovered"
            PropertyChanges { target: root; color: "#20c9b3" }
        }
    ]

    MouseArea
    {
        id:rect_mouse
        anchors.fill: parent
        hoverEnabled: true //是否处理悬浮事件,默认false,只有按下鼠标键时才处理鼠标事件,为true时即使没有按下鼠标键也会作相应的处理
        preventStealing:true//默认为false,为true时可以防止当前鼠标事件被其它对象拦截。
        propagateComposedEvents:true//默认为 false,当设置为 true 时,就可以将事件传递给重叠的其他鼠标区域了
        enabled: true
        cursorShape: Qt.PointingHandCursor

        onPressed:
        {
            rect_text.anchors.verticalCenterOffset = 2
            state = "pressed"
        }

        onEntered:
        {
            if(btn_tip.text != "")
            {
                btn_tip.x = mouseX
                btn_tip.y = mouseY
                btn_tip.open()
                console.log(btn_tip.x,btn_tip.y)
            }
            state = "hovered"
        }

        onReleased:
        {
            if(rect_mouse.containsMouse)//鼠标在按钮范围才有效
                root.btnclicked()

            rect_text.anchors.verticalCenterOffset = 0
            state = "hovered"
        }

        onExited://鼠标离开时关闭
        {
            btn_tip.close()
            state = "normal"
        }
//        onClicked: {
//            //btnclicked()
//        }
    }
}

然后在新增一个ChatDlg.qml文件,里面写一个window 当作是登陆后的主界面

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.9


Window {
    id: chatWindow
    visible: true
    width: 800
    height: 600
    minimumWidth: 250
    minimumHeight: 150
    maximumWidth: 1000
    maximumHeight: 600
    color: "white"
    title: qsTr("聊天窗口")

    Row{
        id: layoutR
        anchors.centerIn: parent
        spacing: 5 //行或列的像素间隔

        Column {
            ListView {
                  id: chatGroup
                  width: 180
                  height: 500
                  //anchors.verticalCenter:   parent.verticalCenter
                  model: ["聊天1","聊天2","聊天3","聊天4","聊天5","聊天6","聊天7","聊天8","聊天9","聊天10","聊天11"]
                  spacing: 2
                  delegate: MyIconButton {
                      btn_txt: modelData
                  }
              }
        }

        Column {
            id: layoutC
            //anchors.centerIn: parent
            spacing: 5 //行或列的像素间隔
            Image {
                    id: m_Logo
                    width: 600
                    height: 250
                    anchors.left: chatGroup.right
                    fillMode: Image.PreserveAspectFit   //保持宽高比
                    source: "/new/img/048.jpg.emoji.jpg"
                    //anchors.verticalCenter:   parent.verticalCenter
                }
            Rectangle {
                        width: 600
                        height: 250
                        color: "lightgrey"
                        border.color: "grey"

                        TextEdit {
                            id: m_Input
                            width: 600
                            height: 250
                            //color: "#20c9b3"
                            //anchors.top: m_Logo.bottom
                            //anchors.horizontalCenter:   parent.horizontalCenter
                            //anchors.verticalCenter:   parent.verticalCenter
                            //anchors.left: chatGroup.right
                            //anchors.leftMargin: 5

                        }
                }

            //登录按钮
            MyButton {
                id: btnSend
                width: 168
                height: 36
                text: "发送"
                //tip_text: ""
                enabled: true
                onBtnclicked: {
                    //showAni.start()
                }
            }

        }



}


}

登录窗口设计如下:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.4


Window {
    id: mainWind
    visible: true
    width: 300
    height: 500
    minimumWidth: 250
    minimumHeight: 150
    maximumWidth: 1000
    maximumHeight: 600
    color: "white"
    title: qsTr("WX")

    //头像
    Image {
            id: m_Logo
            sourceSize.height: 100
            sourceSize.width: 100
            fillMode: Image.PreserveAspectFit   //保持宽高比
            source: "/new/img/048.jpg.emoji.jpg"
            anchors.horizontalCenter: parent.horizontalCenter
            y: parent.height/6
        }

    Text {
        id: name
        text: qsTr("小熊猫")
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: m_Logo.bottom
        anchors.topMargin: 20
    }
    //登录后弹出聊天主界面
    ChatDlg {
        id: chatDialog
        visible: false

    }

    //登录按钮
    MyButton {
        id: btn1
        width: 168
        height: 36
        text: "登录"
        tip_text: "Login your account"
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: name.bottom
        anchors.topMargin: 50
        onBtnclicked: {
            chatDialog.visible = true
            mainWind.visible = false
            //showAni.start()
        }
    }
}

按下登录按钮后弹出主界面,隐藏登录界面

你学废了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP协议的基本概念与理解!

一、什么是HTTP协议 HTTP(超文本传输协议)是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷…

Fedora CoreOS 安装部署详解

《OpenShift 4.x HOL教程汇总》 Fedora CoreOS 的裸机安装方法_fedora coreos 安装-CSDN博客 OpenShift 4 - Fedora CoreOS (1) - 最简安装_fedora core 安装_dawnsky.liu的博客-CSDN博客 OpenShift 和 CoreOS 我们知道 Red Hat Enterprise Linux CoreOS(简称RHCOS&…

SP2-1503|0152:CMD窗口的SQLPLUS命令无法登录Oracle

场景还原 今天有小伙伴把Oracle卸载后重新安装,尝试以下三种方案均无法登录数据库 1.、在使用PLSQL Developer时,输入账号密码机械能登录操作,弹出空白弹框界面 即没有任何提示错误代码 只有一个白板的框 2、利用自身的SQL PLUS登录直接窗…

【SpringBoot集成Redis + Session持久化存储到Redis】

目录 SpringBoot集成Redis 1.添加 redis 依赖 2.配置 redis 3.手动操作 redis Session持久化存储到Redis 1.添加依赖 2.修改redis配置 3.存储和读取String类型的代码 4.存储和读取对象类型的代码 5.序列化细节 SpringBoot集成Redis 1.添加 redis 依赖 …

运算放大器学习笔记

目录 一、基本定理二、基本定义三、负反馈电路四、同向放大电路五、反向放大电路六、差分放大电路 一、基本定理 【电路示意图】 开环放大公式 VOAvo(V-V-) 开环放大倍数(增益)非常大,105 或 106 输入阻抗超级大(可以理解为电…

辅助驾驶功能开发-控制篇(03)-基于PID的请求角度转扭矩算法

1 文档概述 本文档主要描述请求角度转扭矩的功能、性能要求、算法程序设计,后续可作为程序编程和功能及性能测试参考文档。 2 功能要求 转角扭矩管理(SteeringTorqueManager)将方向盘请求转角转换为电机叠加扭矩,进行横向路径跟踪,并与驾驶员方向盘手感交互,实现自适应调整…

2023年五一杯数学建模B题快递需求分析问题求解全过程论文及程序

2023年五一杯数学建模 B题 快递需求分析问题 原题再现: 网络购物作为一种重要的消费方式,带动着快递服务需求飞速增长,为我国经济发展做出了重要贡献。准确地预测快递运输需求数量对于快递公司布局仓库站点、节约存储成本、规划运输线路等具…

红魔8SPro强解BL+完美ROOT权限-刷MIUI14系统-修复指纹丢失/内存等问题

早前我们刷过红魔8pro手机,该手机支持解锁BL刷入MIU14系统,红魔8Pro由于官方并没有修改解锁BL指令,所以我们的解锁BL非常简单,只需要在fastboot下一键完成。随着红魔8SPro的上架,红魔UI6.0的发布,官方解锁指…

【数据仓库设计基础1】关系数据模型理论与数据仓库Inmon方法论

文章目录 一. 关系数据模型中的结构1.关系2.属性3.属性域4.元组5. 关系数据库6.关系表的属性7.关系数据模型中的键 二. 关系完整性1.空值(NULL)2.关系完整性规…

2022/9/13总结

Vue 路由的封装抽离 为了便于维护 ,我们通常需要将路由模块抽离出来 在vue中,如果要写路径,可以写绝对路径 使用 代表从src目录下去寻找,能避免出现很多错误 声明式导航 -- 导航链接 vue-router提供了一个全局组件router-l…

nodejs系列-使用nodejs链接MongoDB数据库问题总结

参考文档 mongodbMongoose 问题1. 不支持preferredcms_db_name、cms_db_collection选项 throw new error_1.MongoParseError(${optionWord} ${Array.from(unsupportedOptions).join(, )} ${isOrAre} not supported);^MongoParseError: options preferredcms_db_name, cms_db…

SVN 和 GIT 命令对比

参考 https://blog.csdn.net/justry_deng/article/details/82259470 # TortoiseSVN打分支、合并分支、切换分支 https://www.huliujia.com/blog/802a64152bbbe877c95c84ef2fdf3857a056b536/ # 版本控制:Git与Svn的命令对应关系 TortoiseSVN打分支、合并分支、切换…

Qt应用开发(基础篇)——菜单栏 QMenuBar

一、前言 QMenuBar类继承于QWidget,该类提供了一个水平菜单栏。 菜单栏使用 QMenuBar菜单栏,顾名思义是菜单QMenu和动作QAction的容器,一般在软件的顶部经常会见到它。菜单栏包含了一系列下拉的菜单,使用addMenu()函数添加QMenu菜…

【ICASSP 2023】ST-MVDNET++论文阅读分析与总结

主要是数据增强的提点方式。并不能带来idea启发,但对模型性能有帮助 Challenge: 少有作品应用一些全局数据增强,利用ST-MVDNet自训练的师生框架,集成了更常见的数据增强,如全局旋转、平移、缩放和翻转。 Contributi…

leetcode 673. 最长递增子序列的个数

2023.9.13 做本题之前先复习一下 最长递增子序列 ,在此基础上还要加个count数组,用于记录当前下标 最长递增子序列的个数。 本题还是有些难度,日后再来二刷。

lv4 嵌入式开发-7 文件IO(概念、打开、关闭、读、写)

目录 1 文件I/O 介绍 2 文件I/O – 文件描述符fd(File Descriptor) 3 文件I/O – open 4 文件I/O – close 5 文件I/O – read 6 文件I/O – write 7 文件IO – lseek 8 标准I/O – 思考和练习 掌握文件描述符的含义 1 文件I/O 介绍 什么是文件…

php 实现stripe支付流程

1.申请账号获取密钥key 2.申请创建商品,创建价格,创建支付, //创建商品 public function create_product(){ $_key self::STRIPE_KEY;$stripe new \Stripe\StripeClient($_key);$arr $stripe->products->create([name > $good…

Arcgis多值提取至点所有波段数值一样

Arcgis多值提取至点所有波段数值一样 问题描述 进行多值提取多波段后的结果,所有波段数值都是一样的。 原因 操作流程问题,输入栅格只选择了一个栅格文件 解决方案 实际上,每个波段都会对应一个栅格文件,要把这些添加进去 这…

【网络编程】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 1.连接管理机制 正常情况下,TCP需要经过三…

淘宝/天猫获取商品销量详情 API 返回值说明

item_get_sales-获取商品销量详情 API测试工具 taobao.item_get_sales 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_…