QT QWidget - 跑马灯

简介

关于前面画了个圆,怎么样也得跑个灯, 只是基于布局创建LED Widget而非 QTableView/QTableWidget;

实现步骤

  1. 实现LED Widget
    LEDWidget.cpp
LEDWidget::LEDWidget(QWidget *parent)
    : QWidget(parent), m_on(false)
{

}

void LEDWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    QPen pen;
    pen.setColor(QColor(128, 128, 128)); // 设置线颜色为浅灰色
    painter.setPen(pen);

    // 设置LED灯的颜色和大小
//        QColor ledColor(85, 239, 196); // 红色
    int ledSize = std::max(20, width() >= height() ? height() - 10 : width() - 10);
    QLinearGradient gradient(0, 0, width(), height());
    if (m_on)
    {
        gradient.setColorAt(0, "#43e97b");
        gradient.setColorAt(1, "#38f9d7");
    }
    else
    {
        gradient.setColorAt(0, "#e6e9f0");
        gradient.setColorAt(1, "#eef1f5");
    }

    painter.setBrush(gradient);

    // 计算LED灯的位置
    int x = (width() - ledSize) / 2;
    int y = (height() - ledSize) / 2;

    // 绘制LED灯的主体
//        painter.setBrush(ledColor);
    painter.drawEllipse(x, y, ledSize, ledSize);
}

LEDWidget.h


#ifndef LEDWIDGET_H
#define LEDWIDGET_H


#include <QWidget>


class LEDWidget : public QWidget
{
public:
    LEDWidget(QWidget *parent = nullptr);

    inline void controlLed(bool on=false)
    {
        if (on != m_on)
        {
             m_on = on;
             update();
        }
    }
    inline void toggleLed()
    {
        m_on = !m_on;
        update();
    }

protected:
    void paintEvent(QPaintEvent *event) override;

    bool m_on;
};


#endif // LEDWIDGET_H

  1. 实现MarqueeLED

只需要改变数字绑定信号,自动亮灭灯

/**
 * @brief The MarqueeLED class
 * @ note 跑马灯类,  亮灯号一致则点亮,不一致则熄灭
 */
class MarqueeLED : public LEDWidget
{
public:
    MarqueeLED(QWidget *parent=nullptr) :
        LEDWidget(parent), m_num(-1)
    {

    }

    void setNum(int num) { m_num = num; }

public slots:
    void onLightUpNumberChanged(int num)
    {
        controlLed(num == m_num);
    }

private:
    int m_num;
};
  1. 功能代码
    MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGridLayout>
#include "ledwidget.h"

/**
 * @brief The MarqueeLED class
 * @ note 跑马灯类,  亮灯号一致则点亮,不一致则熄灭
 */
class MarqueeLED : public LEDWidget
{
public:
    MarqueeLED(QWidget *parent=nullptr) :
        LEDWidget(parent), m_num(-1)
    {

    }

    void setNum(int num) { m_num = num; }

public slots:
    void onLightUpNumberChanged(int num)
    {
        controlLed(num == m_num);
    }

private:
    int m_num;
};


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow), m_currIndex(0)
{
    ui->setupUi(this);

    uiInit();
}

MainWindow::~MainWindow()
{
    widgetFree();
    delete ui;
}

void MainWindow::uiInit()
{
    ui->btnStop->setEnabled(false);

    QGridLayout *ly = new QGridLayout(ui->wgtLeds);
    ui->wgtLeds->setLayout(ly);

    connect(ui->btnStart, &QPushButton::clicked, this, &MainWindow::onStart);
    connect(ui->btnStop, &QPushButton::clicked, this, &MainWindow::onStop);
    connect(&m_actTimer, &QTimer::timeout, this, &MainWindow::onActionTimerTimeout);
}

void MainWindow::widgetFree()
{
    QGridLayout *ly = qobject_cast<QGridLayout*> (ui->wgtLeds->layout());
    for (QWidget *wgt : m_ledWidgets)
    {
        ly->removeWidget(wgt);
        delete wgt;
        wgt = nullptr;
    }
    m_ledWidgets.clear();
}

void MainWindow::onActionTimerTimeout()
{
    int lightUpNum = m_currIndex;
    emit numberChanged(lightUpNum);

    ++m_currIndex;
    if ( m_currIndex >= (ui->sbColumns->value() * ui->sbRows->value()) )
        m_currIndex = 0;
}

void MainWindow::onStart()
{
    ui->btnStop->setEnabled(false);
    ui->btnStart->setEnabled(false);

    QGridLayout *ly = qobject_cast<QGridLayout*> (ui->wgtLeds->layout());
    for (int rowIndex = 0; rowIndex < ui->sbRows->value(); ++rowIndex)
    {
        for (int colIndex = 0; colIndex < ui->sbColumns->value(); ++colIndex)
        {
            MarqueeLED *wgt = new MarqueeLED(this);
            wgt->setNum(rowIndex * ui->sbColumns->value() + colIndex); // 0 ~ x
            m_ledWidgets.append(wgt);
            ly->addWidget(wgt, rowIndex, colIndex);
            connect(this, &MainWindow::numberChanged, wgt, &MarqueeLED::onLightUpNumberChanged);
        }
    }

    m_actTimer.setTimerType(Qt::PreciseTimer);
    m_actTimer.setInterval(ui->sbIntervalTime->value());

    m_actTimer.start();
    ui->btnStop->setEnabled(true);
    ui->btnStart->setEnabled(false);
}

void MainWindow::onStop()
{
    m_actTimer.stop();
    widgetFree();
    m_currIndex = 0;
    ui->btnStop->setEnabled(false);
    ui->btnStart->setEnabled(true);
}

演示

上图吧, 视频还要审核
在这里插入图片描述

代码

代码基本都在上面, 不需要特地下载
完整代码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

THEMIS---Beta Sprint Summary Essay Blog

Which course does this assignment belong to2301-MUSE社区-CSDN社区云What are the requirements for this assignmentbeta SprintThe goal of this assignmentTo summarize the beta task progress and the teams sprintsTeam NameThemisTop-of-the-line collection of essa…

单变量、双变量、多变量分析(基于iris数据集)

目录 一、数据处理 二、单变量分析 三、双变量分析 四、多变量分析 利用padas、numpy、matplotlib、seaborn库&#xff0c;对数据进行分析。 Iris数据集是非常著名的机器学习数据集之一&#xff0c;在统计学和机器学习领域被广泛应用。该数据集包含了150个样本&#xff0c;分…

如何查看PHP信息

创建一个 PHP 文件&#xff0c;比如 info.php&#xff0c;在其中添加以下代码&#xff1a; <?php phpinfo(); ?>访问这个文件&#xff08;例如&#xff0c;在浏览器中输入 http://localhost/info.php&#xff09;&#xff0c;它会显示 PHP 的所有配置信息。在这个页面…

华为配置基本QinQ示例

组网需求 如图1所示&#xff0c;网络中有两个企业&#xff0c;企业1有两个分支&#xff0c;企业2有两个分支。这两个企业的各办公地的企业网都分别和运营商网络中的SwitchA和SwitchB相连&#xff0c;且公网中存在其它厂商设备&#xff0c;其外层VLAN Tag的TPID值为0x9100。 现…

java_web_电商项目

java_web_电商项目 1.登录界面2.注册界面3. 主界面4.分页界面5.商品详情界面6. 购物车界面7.确认订单界面8.个人中心界面9.收货地址界面10.用户信息界面11.用户余额充值界面12.后台首页13.后台商品增加14.后台用户增加15.用户管理16.源码分享1.登录页面的源码2.我们的主界面 1.…

Scrapy爬虫学习

Scrapy爬虫学习一 1 scrapy框架1.1 scrapy 是什么1.2 安装scrapy 2 scrapy的使用2.1创建scrapy项目2.2 创建爬虫文件2.3爬虫文件的介绍2.4 运行爬虫文件 3 爬取当当网前十页数据3.1 dang.py&#xff1a;爬虫的主文件3.2 items.py 定义数据结构3.3 pipelines.py 管道3.4 执行命令…

万兆网络之屏蔽线序接法(中)

在介绍优质网线选购之前&#xff0c;先简单介绍一下水晶头 1毛钱一颗跟1元一颗的水晶头&#xff0c;往往是金手指厚度差别&#xff0c;你可以想象压制的时候可能会有什么情况 另外&#xff0c;一些3元一颗的镀金水晶头会有15U、30U之类的是电镀厚度单位&#xff0c;数值越大镀…

Maui blazor与sqlite开发一个增删改查

在android端增删改不能运行。也看不出来是什么&#xff0c;但运行到windows可以运行。 引入sqlite-net-pcl 开发Model using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.T…

工具在手,创作无忧:一键下载安装Auto CAD工具,让艺术创作更加轻松愉悦!

不要再浪费时间在网上寻找Auto CAD的安装包了&#xff01;因为你所需的一切都可以在这里找到&#xff01;作为全球领先的设计和绘图软件&#xff0c;Auto CAD为艺术家、设计师和工程师们提供了无限的创作潜力。不论是建筑设计、工业设计还是室内装饰&#xff0c;Auto CAD都能助…

HYDRA爆破之王(服务多)(用法简单)

#江南的江 #每日鸡汤&#xff1a;如果你向神求助&#xff0c;说明你相信神的能力。如果神没有帮助你&#xff0c;说明神相信你的能力。 #初心和目标&#xff1a;善用网络安全。。。 HYDRA 1.Hydra的简介 --------------------------------------------------------------------…

写递归函数的一些思考

当编写递归函数时&#xff0c;有几个关键的思考点可以帮助你设计和实现递归算法&#xff1a; 定义递归的基本情况&#xff1a;确定递归函数应该在何时终止&#xff0c;即递归的基本情况。这是一个递归的出口条件&#xff0c;确保递归不会无限进行下去。基本情况应该是可以直接求…

RabbitMq交换机详解

目录 1.交换机类型2.Fanout交换机2.1.声明队列和交换机2.2.消息发送2.3.消息接收2.4.总结 3.Direct交换机3.1.声明队列和交换机3.2.消息接收3.3.消息发送3.4.总结 4.Topic交换机4.1.说明4.2.消息发送4.3.消息接收4.4.总结 5.Headers交换机5.1.说明5.2.消息发送5.3.消息接收5.4.…

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址&#xff0c;而符号链接&#xff08;也称为软链接&#xff09;是指向文件路径的引用。 命令格式&#xff1a;ln [选项]... [-T] 目标&#xff08;源文件&#xff09; 链接&#xff08;目标文件&…

12.16_黑马数据结构与算法笔记Java

目录 167 B树 remove 168 B树 remove 搭架子 169 B树 remove case1-4 170 B树 remove case5-6分析 171 B树 remove case5 旋转 172 B树 remove case5 合并 173 B树 remove case6 174 B树 remove 演示1 175 B树 remove 演示2 176 哈希表 概述 177 哈希表 hash码映射索…

将html的radio单选框自定义样式为正方形和对号

将html的radio单选框自定义样式为正方形和对号 背景&#xff1a; 如何能把html的<input type"radio" name"option">改成自定义的样式呢&#xff1f;比如想要把他变成正方形&#xff0c;选中的时候是对号。默认的样式太丑了 默认样式&#xff1a; 自…

LCR 146. 螺旋遍历二维数组

解题思路&#xff1a; class Solution {public int[] spiralArray(int[][] array) {if(array.length 0) return new int[0];int l 0, r array[0].length - 1;int t 0, b array.length - 1;int x 0;int[] res new int[(r 1) * (b 1)];while(true) {for(int i l; i <…

Linux(23):Linux 核心编译与管理

编译前的任务&#xff1a;认识核心与取得核心原始码 Linux 其实指的是核心。这个【核心(kernel)】是整个操作系统的最底层&#xff0c;他负责了整个硬件的驱动&#xff0c;以及提供各种系统所需的核心功能&#xff0c;包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等&a…

C语言入门基础(二)

基本概念 地址 计算机的内存是一块用于存储数据的空间&#xff0c;由一系列连续的存储单元组成&#xff0c;就像下面这样&#xff0c; 每一个单元格都表示1个Bit&#xff0c;一个bit在EE专业的同学看来就是高低电位&#xff0c;而在CS同学看来就是0&#xff0c;1两种状态。 …

cpp_02_函数重载_动态内存分配_左值右值_引用_内联函数

1 函数重载 1.1 定义 要求&#xff1a; 1&#xff09;同一作用域内 2&#xff09;函数名相同 3&#xff09;形参表不同&#xff08;与形参个数及每个形参类型有关&#xff0c;与形参名无关&#xff09; 重载关系的函数调用哪个&#xff1a; 根据实参类型和形参类型进行匹配&…

降采样方法对NCC得分的影响因素评估

定位算法原理 关于不同的定位场景,最适合使用的算法原理,Halcon的原理文档中描述如下: 在图案缩放可用忽略,图案纹理丰富的场景,适合采用基于互相关的匹配。 输入参考图像,搜索图像,参考图像在搜索图像上滑动,得到滑动位置的NCC得分。如下图所示,高于阈值的最亮的地…