Qml 实现仿前端的 Notification (悬浮出现页面上的通知消息)

news2025/1/10 17:01:40

【写在前面】

        经常接触前端的朋友应该经常见到下面的控件:

        在前端中一般称它为 Notification 或 Message,但本质是一种东西,即:悬浮弹出式的消息提醒框

        这种组件一般具有以下特点:

        1、全局/局部显示:它不依赖于具体的页面元素,可以在整个页面的任意位置显示。

        2、自动消失:默认情况下,消息会在一定时间后自动消失,也可以设置为不自动消失。

        3、多种类型:支持多种类型的消息,如成功(Success)、警告(Warning)、错误(Error)和 消息(Message)等。

        4、可配置:可以自定义消息的显示位置、持续时间、内容等。

        然鹅 Qml 中并未提供类似的组件,因此我便仿照前端实现了出来,并且更加简单易用。


【正文开始】

        先来看看 Qml Notification 效果图:

         实现起来相当简单,只需要 Column + Repeater 即可:

    Column {
        anchors.top: parent.top
        anchors.topMargin: 10
        anchors.horizontalCenter: parent.horizontalCenter
        spacing: 10

        Repeater {
            id: repeater
            model: ListModel {
                id: listModel
            }
            delegate: Rectangle {
                width: root.backgroundWidth
                height: __column.height + root.topMargin + root.bottomMargin
                radius: root.backgroundRadius
                color: root.backgroundColor
                clip: true

                Component.onCompleted: {
                    __timer.interval = timeout;
                    __timer.start();
                }

                NumberAnimation on height {
                    id: __removeAniamtion
                    to: 0
                    running: false
                    duration: 500
                    alwaysRunToEnd: true
                    onFinished: {
                        listModel.remove(index);
                    }
                }

                Timer {
                    id: __timer
                    onTriggered: {
                        __removeAniamtion.start();
                    }
                }

                Column {
                    id: __column
                    width: parent.width
                    anchors.centerIn: parent
                    spacing: root.titleSpacing

                    Row {
                        anchors.horizontalCenter: parent.horizontalCenter
                        spacing: 5

                        Text {
                            id: __icon
                            font.family: fontAwesome.name
                            font.pointSize: root.titleFont.pointSize
                            color: {
                                switch (type) {
                                case Notification.Success: return "green";
                                case Notification.Warning: return "orange";
                                case Notification.Message: return "gray";
                                case Notification.Error: return "red";
                                default: return "";
                                }
                            }
                            text: {
                                switch (type) {
                                case Notification.Success: return "\uf058";
                                case Notification.Warning: return "\uf071";
                                case Notification.Message: return "\uf05a";
                                case Notification.Error: return "\uf057";
                                default: return "";
                                }
                            }
                        }

                        Text {
                            id: __title
                            font: root.titleFont
                            color: root.titleColor
                            text: title
                            wrapMode: Text.WrapAnywhere
                        }
                    }

                    Text {
                        id: __message
                        width: parent.width - 16
                        anchors.horizontalCenter: parent.horizontalCenter
                        font: root.messageFont
                        color: root.messageColor
                        text: message
                        horizontalAlignment: Text.AlignHCenter
                        wrapMode: Text.WrapAnywhere
                    }
                }

                Text {
                    anchors.right: parent.right
                    anchors.top: parent.top
                    anchors.margins: 6
                    text: "×"
                    font.bold: true

                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            __timer.stop();
                            __removeAniamtion.restart();
                        }
                    }
                }
            }
        }
    }

         然后使用 notify() 来添加通知消息:

    function notify(title, message, type = Notification.None, timeout = 3000) {
        listModel.append({
                             title: title,
                             message: message,
                             type: type,
                             timeout: timeout
                         });
    }

        其中参数说明:

        title:标题,即通知顶端的标题。

        message:消息,即通知中间的内容。

        type:类型,即该通知的类型。

        timeout:超时,即该通知显示的时长,-1 则是无限。


【如何使用】

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15

Window {
    width: 800
    height: 600
    visible: true
    title: qsTr("Notification Test")

    Notification {
        id: topNotification
        z: 100
        backgroundWidth: 240
        anchors.top: parent.top
        anchors.horizontalCenter: parent.horizontalCenter
        titleFont.pointSize: 11
        messageFont.pointSize: 11
    }

    Column {
        anchors.centerIn: parent
        spacing: 10

        Row {
            spacing: 10

            Button {
                text: qsTr("成功")
                onClicked: {
                    topNotification.notify(qsTr("成功"), qsTr("这是一条成功的提示消息"), Notification.Success);
                }
            }

            Button {
                text: qsTr("警告")
                onClicked: {
                    topNotification.notify(qsTr("警告"), qsTr("这是一条警告的提示消息"), Notification.Warning);
                }
            }

            Button {
                text: qsTr("消息")
                onClicked: {
                    topNotification.notify(qsTr("消息"), qsTr("这是一条消息的提示消息"), Notification.Message);
                }
            }

            Button {
                text: qsTr("错误")
                onClicked: {
                    topNotification.notify(qsTr("错误"), qsTr("这是一条错误的提示消息"), Notification.Error);
                }
            }
        }
    }
}

        Notification 可放置在任意位置,然后设置字体背景等等即可。

        当然,这种方式是悬浮在当前页面的,如果想要悬浮在全局页面,则必须将其置于主窗口的顶部,具体方法如下:

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15

Window {
    width: 800
    height: 600
    visible: true
    title: qsTr("Notification Test")

    Page { z: 1 }

    Page { z: 1 }

    Notification {
        id: topNotification
        z: 100
        backgroundWidth: 240
        anchors.top: parent.top
        anchors.horizontalCenter: parent.horizontalCenter
        titleFont.pointSize: 11
        messageFont.pointSize: 11
    }
}

         需要保证其他页面 z-order 小于 Notification 组件。


【结语】

        最后:项目链接(多多star呀..⭐_⭐):

        Github 地址:

QmlControls/Notification at master · mengps/QmlControls · GitHubQtQml 控件 & 实用工具. Contribute to mengps/QmlControls development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/mengps/QmlControls/tree/master/Notification        CSDN 的:

https://download.csdn.net/download/u011283226/89662116icon-default.png?t=N7T8https://download.csdn.net/download/u011283226/89662116

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

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

相关文章

基于单片机的信号发生器设计

本设计采用了STM32F103C8T6单片机作为控制核心,通过控制DDS模块产生不同频率且高稳定和低失真的信号,再通过放大电路对信号的幅值进行放大。此外通过按键可以使用户对频率进行调节以及对输出波形进行切换,由于AD9833输出的幅值是固定的&#…

启动docker镜像

1、运行容器 2、当前运行的进程 3、当前位置和启动时间 4、cat/etc/redhat-release查看版本 5.镜像是模版,容器是实例 6.容器中没有命令运 7.容器总是能轻易获取 8.配置yum 9.安装http 10.修改index⽂件 11.httpd -k start 12.访问 13.退出就没有服务了 14…

细谈LCM驱动电压VGHVGL电路原理

前言: ***在液晶显示屏驱动电路中,VGH电压负责对TFT栅极电容进行充电开启,并使电容电压保持一个场周期,VGL电压负责TFT栅极的关闭。 如果VGH和VGL电压出现不稳或者幅度变化,都会引起图像显示故障,例如花屏…

委托发布 | 进迭时空联合移动云能力中心实现业界首个RISC-V IO虚拟化方案

仟江水商业电讯(8月22日 北京 委托发布)虚拟化是云计算技术基石,是RISC-V走进云计算等高性能计算场景的必然要求。RISC-V国际基金会2021年制定了Hypervisor 1.0规范,2023年制定了AIA 1.0规范和IOMMU 1.0规范,这3个规范…

CentOS 7使用RPM安装MySQL5.7

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1:下载MySQL5.7的rpm安装包2:卸载已安装的MySQL(没安装过则跳过)3:MySQL安装环境准备4:安…

网络竞赛可视化:打造线上赛事

通过图扑网络竞赛可视化,可以实时跟踪和分析参赛者的表现,直观展示比赛进程和结果。这不仅提高了观赛体验,还帮助组织者更有效地管理和优化赛事。

STM32——SPI通信协议以及软件读写

1、SPI协议 SPI相对于I2C传输速度更快;设计简单,通信协议使用硬件线比较多,有些资源浪费 以下设备需要进行共地,如果从机没有独立的供电源,主机需要给供电 SS线低电平有效,主机只能选择一个从机 推挽输出…

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

SpringCloudAlibaba Seata分布式事务

分布式事务 事务是数据库的概念,数据库事务(ACID:原子性、一致性、隔离性和持久性); 分布式事务的产生,是由于数据库的拆分和分布式架构(微服务)带来的,在常规情况下,我们在一个进…

自己动手写CPU_step4_逻辑运算|移位指令

序 上一篇中我们解决了流水线的数据相关问题,本篇将添加多条逻辑运算和移位运算指令,这些指令的格式严格按照MIPS的指令格式设计。 MIPS指令格式 由于本人也是处于学习的一个过程,如有不对之处,还请大牛指正。 就逻辑运算和移位运…

【软件逆向】第11课,软件逆向安全工程师之windows API函数,每天5分钟学习逆向吧!

资料获取 关注作者,备注课程编号,获取本课配套课件和工具程序。 干货开始-windows API函数。 微软官方提供的应用程序接口,是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件提供的能力。 地址:h…

java基础 之 了解final

文章目录 定义使用及规则修饰类修饰方法修饰变量修饰成员变量修饰局部变量final与static共同修饰变量final修饰的变量和普通变量的区别 本篇文章代码就不附上了,建议大家实际敲一敲,更能加快理解 定义 final表示”最后的,最终的“含义&#…

精益思维赋能机器人行业的三大维度

在日新月异的科技浪潮中,机器人行业正以前所未有的速度蓬勃发展,成为推动产业升级与转型的关键力量。然而,如何在激烈的市场竞争中脱颖而出,实现高效、灵活与可持续的发展?精益思维,这一源自制造业的管理哲…

【el-switch更改高、宽、颜色样式】深入浅出element ui的switch同页面存在多个更改样式互不影响

1.技术: “vue”: “^2.6.14”, “element-ui”: “^2.15.6”, 2.需求: 同一个页面存在多个switch组件时, 需要更改各自的高度、宽度、选择颜色、非选中颜色等样式, 并且样式隔离互不影响! 3.效果图: 4.重要…

C++动态规划(背包问题)

目录 一:动态规划是什么 二.动态规划的运用 (1).用动态规划解决重复子问题 (2).动态规划使用的条件与流程 Ⅰ.动态规划的使用条件: Ⅱ.动态规划的使用流程 (3).背包问题 三.…

IO进程(学习)2024.8.22

信号 信号函数 信号处理函数 #include <signal.h> sighandler_t signal(int signum, sighandler_t handler); 功能&#xff1a;信号处理函数 参数&#xff1a;signum&#xff1a;要处理的信号 handler&#xff1a;信号处理方式 SIG…

基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真&#xff0c;仿真输出电机转速跟踪曲线&#xff0c;PID控制器输出曲线以及Te输出曲线。 2.系统仿真结果 &…

kafka的一个有趣问题(BUG)

这是我的第104篇原创文章 问题由来 在使用kafka时&#xff0c;创建topic&#xff0c;对某个topic进行扩分区的操作&#xff0c;想必大家肯定都使用过。尤其是集群进行扩容时&#xff0c;对流量较大的topic进行扩分区操作。一般而言&#xff0c;期望的效果是&#xff1a;新扩的分…

AI在医学领域:HYDEN一种针对医学图像和报告的跨模态表示学习方法

近年来&#xff0c;跨模态文本-图像表示学习在诸多领域取得了显著的突破&#xff0c;尤其是在零样本学习和图像-文本检索等任务上。这一成果的取得很大程度上归功于大量弱监督的图像-文本配对数据的利用&#xff0c;这些数据有效地增强了视觉-语言表示学习的能力。在医学成像领…

如何保证每次生成的都同一张人脸?AI绘画Stable Diffusion的Reference only插件人物一致性教程

Ai绘画有一个很现实的问题&#xff0c;要保证每次画出的都是同一个人物的话&#xff0c;很费劲。 Midjourney就不必说了&#xff0c;人物的高度一致性一直得不到很好的解决。而在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;常用办法是通过同一个Seed值&#xf…