QT QWidget - 跑马灯

news2024/11/29 2:46:26

简介

关于前面画了个圆,怎么样也得跑个灯, 只是基于布局创建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.coloradmin.cn/o/1318380.html

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

相关文章

Python redis安装使用教程

一、项目环境 Python 3.8.xredis-5.0.14 二、Redis 安装 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 下载 Redis-x64-xxx.zip压缩包到你要安装的文件夹&#xff0c;解压即可 三、使用redis 打开一个 cmd 窗口&#xff0c;使用 cd 命令切换redis…

【C语言】实战项目——通讯录

引言 学会创建一个通讯录&#xff0c;对过往知识进行加深和巩固。 文章很长&#xff0c;要耐心学完哦&#xff01; ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 实战 建…

C# DotNetCore AOP简单实现

背景 实际开发中业务和日志尽量不要相互干扰嵌套&#xff0c;否则很难维护和调试。 示例 using System.Reflection;namespace CSharpLearn {internal class Program{static void Main(){int age 25;string name "bingling";Person person new(age, name);Conso…

Oracle RAC环境下redo log 文件的扩容

环境&#xff1a; 有一个2节点RAC每一个节点2个logfile group每一个group含2个member每一个member的大小为200M 目标&#xff1a;将每一个member的大小有200M扩充到1G。 先来看下redo log的配置&#xff1a; SQL> select * from v$log;GROUP# THREAD# SEQUENCE# …

【SpringBoot零基础入门到项目实战①】解锁现代Java开发之门:深度探究Spring Boot的背景、目标及选择理由

文章目录 引言Spring Boot的背景和目标背景目标 为什么选择Spring Boot1. 简化配置2. 内嵌式容器3. 生态系统支持4. 大量的Starter5. 广泛的社区支持6. 适用于微服务架构7. 丰富的扩展机制 实例演示创建一个简单的Spring Boot应用 拓展与深入学习1. Spring Boot Actuator2. Spr…

深度学习 Day14——P3天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

2023.12.16 关于 分布式系统 基本介绍

目录 单机架构 服务器负载过高问题 解决方法 分布式系统 引入更多的服务器节点 负载均衡 数据库读写分离 引入缓存 数据库分库分表 引入微服务 基本概念 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Modul…

力扣刷题-二叉树-二叉树左叶子之和

404 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 思路 迭代法 迭代法理解…

python学习1补充

大家好&#xff0c;这里是七七&#xff0c;这个专栏是用代码实例来学习的&#xff0c;不是去介绍很多知识的。 话不多说&#xff0c;开始今天的内容 目录 代码1 代码2 代码3 代码4 代码5 学习1的总代码 代码1 groupeddf.groupby(单品编码) result{} groupeddf.groupb…

条款5:了解c++默默编写并调用了哪些函数

如果你不自己声明&#xff0c;编译器会替你声明&#xff08;编译器版本的&#xff09;拷贝构造函数、拷贝赋值运算符和析构函数。此外&#xff0c;如果你没有声明任何构造函数&#xff0c;编译器会为你声明一个默认构造函数。 class Empty{};本质上和写成下面这样是一样的: c…

英文论文降重修改技巧 papergpt

大家好&#xff0c;今天来聊聊英文论文降重修改技巧&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 英文论文降重修改技巧 作为网站编辑&#xff0c;我们经常需要处理大量…

加密的艺术:对称加密的奇妙之处(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

菜鸟学习日记(python)——匿名函数

Python 使用 lambda 来创建匿名函数。 lambda 函数是一种小型、匿名的内联函数&#xff0c;它可以具有任意数量的参数&#xff0c;但只能有一个表达式。 匿名函数的一般格式如下&#xff1a; lambda 参数列表:表达式 表达式用于计算并返回函数结果 lambda 函数通常用于编写…

如何优雅地观察 Vue.js 3 中 localStorage 的变化?

为什么要这样做&#xff1f; 原生 localStorage 只能监听同源跨不同页面的变化。然而&#xff0c;对于单页面应用程序来说&#xff0c;这种方式并不实用。因此&#xff0c;我打算创建一个自定义钩子来监视 localStorage 中的变化。 方法 我们需要重写 localStorage 下的所有…

相机基础概念介绍

一.概念 Camera的成像原理 景物通过镜头&#xff08;LENS&#xff09;生成的光学图像投射到图像传感器(Sensor)表面上&#xff0c;然后转为模拟的电信号&#xff0c;经过 A/D&#xff08;模数转换&#xff09;转换后变为数字图像信号&#xff0c;再送到数字信号处理芯片&…

虚拟机下Ubuntu上网设置

文章目录 一、虚拟机上网的两种方式1.1 NAT模式&#xff08;Network Address Translation&#xff09;1.2 桥接模式&#xff08;Bridge Mode&#xff09;1.3 简介 二、实际配置2.1 NAT模式配置2.2 桥接模式配置 之前跟着博客配了好几个也没用&#xff0c;后来自己慢慢模式实践测…

机器学习---模型评估

1、混淆矩阵 对以上混淆矩阵的解释&#xff1a; P&#xff1a;样本数据中的正例数。 N&#xff1a;样本数据中的负例数。 Y&#xff1a;通过模型预测出来的正例数。 N&#xff1a;通过模型预测出来的负例数。 True Positives:真阳性&#xff0c;表示实际是正样本预测成正样…

波奇学Linux:进程终止

写时拷贝底层原理图 子进程谁先运行&#xff0c;由调度器决定 进程退出场景 代码运行完毕&#xff0c;结果正确&#xff1a;有返回值&#xff0c;返回0 代码运行完毕&#xff0c;结果不正确&#xff1a;有返回值&#xff0c;返回非0 代码异常终止。没有返回值 return 0的…

小姐姐跳舞,AI 视频生成太酷了

大家好&#xff0c;我是章北海 最近AI视频领域的研究进展神速&#xff0c;看得眼花缭乱。 这里老章就把最近几天看过印象深刻的四个项目介绍给大家&#xff0c;同时附上项目相关简介、论文、代码等资料&#xff0c;感兴趣的同学可以深度研究一下。 《SMPLer-X:放大表达性人体…

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…