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

小结

相关推荐
我不是懒洋洋3 分钟前
大语言模型(LLM)入门:从Transformer到ChatGPT
c语言·开发语言·c++
MY_TEUCK4 分钟前
【Java 后端 | 微服务远程调用实战】Nacos + OpenFeign 从入门到公共模块抽取
java·开发语言·微服务
love_muming13 分钟前
Java编程核心技巧全解析
java·开发语言·idea
wjm04100619 分钟前
简单谈谈ios开发中的UI
开发语言·ios·swift
slandarer23 分钟前
MATLAB | 土地利用变化桑基图及状态转移桑基图绘制
开发语言·数学建模·matlab·桑基图
L_090733 分钟前
【C++】面向对象三大特性之多态
开发语言·c++
threelab35 分钟前
Three.js 银河星系效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
程序员敲代码吗37 分钟前
探索JavaScript对象创建的灵活方式
开发语言·javascript·ecmascript
FlyWIHTSKY40 分钟前
Next.js中客户端组件和服务端组件
开发语言·javascript·ecmascript
天若有情67340 分钟前
轻量级状态事件总线 eventbusx-js 开源使用教程
开发语言·javascript·npm·开源·事件·事件总线