QT:QLabel的LED透明跑马灯

实验内容:

1 背景透明

2 三个按键设置颜色

3 auto按键自动切换颜色

4 1秒定时器

实验效果:

测试代码

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QObject>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QDebug>
#include <QPainter>
#include <QTimer>

class MyLed : public QLabel
{
    Q_OBJECT
public:
    MyLed(int w = 100,int h = 100,QWidget *parent = nullptr):QLabel(parent),m_width(w),m_height(h)
    {
        this->setWindowFlag(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
        setColor(QColor(0,0,0,0));
    }
    void setColor(const QColor & color)
    {
        QPixmap pix(m_width,m_height);
        pix.fill(Qt::transparent);

        QPainter p(&pix);
        p.setPen(QColor(0,0,0,0));
        p.setBrush(color);

        QRect rect =  pix.rect();
        int rx = (rect.width() - 2)/2;
        int ry = (rect.height() - 2)/2;
        qDebug() <<"rx = " << rx;
        qDebug() <<"ry = " << ry;
        p.drawEllipse(rect.center(),rx,ry);
        this->setPixmap(pix);
    }
private:
    QColor m_color;
    int m_width;
    int m_height;
};

#define func(num) button_##num##_click()

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        this->setWindowFlag(Qt::FramelessWindowHint);
        setAttribute(Qt::WA_TranslucentBackground);//设置背景透明

        m_timer.setInterval(1000);

        connect(&m_timer,&QTimer::timeout,[this](){
            static int count = 1;
            switch(count){
            case 1:
                this->func(1);
                break;
            case 2:
                this->func(2);
                break;
            case 3:
                this->func(3);
                break;
            }
            count++;
            if(count > 3){
                count = 1;
            }

        });

        QVBoxLayout *root = new QVBoxLayout();
        QHBoxLayout *led_layout = new QHBoxLayout();
        QHBoxLayout *button_layout = new QHBoxLayout();
        this->setWindowTitle(QString::fromUtf8("LED监视器"));


        m_led = new MyLed();
        led_layout->addStretch();
        led_layout->addWidget(m_led);
        led_layout->addStretch();

        connect(m_button_1,SIGNAL(clicked()),this,SLOT(button_1_click()));
        connect(m_button_2,SIGNAL(clicked()),this,SLOT(button_2_click()));
        connect(m_button_3,SIGNAL(clicked()),this,SLOT(button_3_click()));
        connect(m_button_auto,SIGNAL(clicked()),this,SLOT(button_auto_click()));
        //QObject::connect(m_button_1,&QPushButton::clicked,someFunction);


        button_layout->addWidget(m_button_1);
        button_layout->addWidget(m_button_2);
        button_layout->addWidget(m_button_3);
        button_layout->addWidget(m_button_auto);

        root->addLayout(led_layout);
        root->addLayout(button_layout);
        this->setLayout(root);
    }
    ~Widget(){ }
    MyLed *m_led;
    QPushButton *m_button_1 = new QPushButton("red");
    QPushButton *m_button_2 = new QPushButton("green");
    QPushButton *m_button_3 = new QPushButton("blue");
    QPushButton *m_button_auto = new QPushButton("auto");
private slots:
    void button_1_click()
    {
        qDebug() <<QString::fromLocal8Bit("red");
        m_led->setColor(QColor(255,0,0));
    }
    void button_2_click()
    {
        qDebug() <<QString::fromLocal8Bit("green");
        m_led->setColor(QColor(0,255,0));
    }
    void button_3_click()
    {
        qDebug() <<QString::fromLocal8Bit("blue");
        m_led->setColor(QColor(0,0,255));
    }
    void button_auto_click()
    {
        QPushButton *button = (QPushButton *)sender();
        qDebug() << button->text();
        if(m_timer.isActive()){
            m_timer.stop();
        }else{
            m_timer.start();
        }

    }
private:
    QTimer m_timer;

};
#endif // WIDGET_H

main.cpp

cpp 复制代码
#include "widget.h"

#include <QApplication>

void someFunction()
{
    qDebug() << QString::fromLocal8Bit("hehe");
}

int app_1(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

int app_2(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyLed w;
    w.setColor(QColor(255,0,0));
    w.show();
    return a.exec();
}

int main(int argc, char *argv[])
{
    return app_1(argc,argv);
    // return app_2(argc,argv);
}

小结

相关推荐
Evand J4 小时前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn
techdashen4 小时前
kTLS 进入 rustls 组织:把 TLS 的数据面交给内核
开发语言·php
Lhappy嘻嘻4 小时前
Java 并发编程(六)|并发进阶高频:CAS、锁升级
java·开发语言
techdashen4 小时前
Arborium:把 tree-sitter 语法高亮打包成 Rust 文档生态的基础设施
开发语言·后端·rust
尘中远5 小时前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
会周易的程序员5 小时前
microLog 后端开发指南
开发语言·c++·物联网·设计模式·日志·iot·aiot
Esaka_Forever5 小时前
Python 完整内存管理机制详解
开发语言·python·spring
星空露珠5 小时前
迷你世界UGc3.0脚本Wiki[剧情动画模块管理接口 Timeline]
开发语言·数据结构·算法·游戏·lua
未来之窗软件服务5 小时前
计算机考试-C语言 应用题—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟·计算机考试
想你依然心痛5 小时前
AtomCode在后端开发中的实战体验:Go微服务从零搭建
开发语言·微服务·golang