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);
}

小结

相关推荐
xushichao19895 分钟前
实时数据压缩库
开发语言·c++·算法
liurunlin8889 分钟前
Go环境搭建(vscode调试)
开发语言·vscode·golang
故事和你9125 分钟前
sdut-python-实验四-python序列结构(21-27)
大数据·开发语言·数据结构·python·算法
SuperEugene29 分钟前
TypeScript+Vue 实战:告别 any 滥用,统一接口 / Props / 表单类型,实现类型安全|编码语法规范篇
开发语言·前端·javascript·vue.js·安全·typescript
liuyao_xianhui33 分钟前
优选算法_模拟_提莫攻击_C++
开发语言·c++·算法·动态规划·哈希算法·散列表
.select.1 小时前
c++ 移动赋值/移动构造函数
开发语言·c++
我是鶸1 小时前
secml-malware python library 源码分析及实践
开发语言·python
setmoon2141 小时前
C++代码规范化工具
开发语言·c++·算法
不想看见4041 小时前
C++/Qt 代码规范指南
开发语言·qt
li星野1 小时前
QT模拟题:QT项目实践与架构设计(120分钟)
开发语言·qt