Qt 启动界面

纯代码画的启动界面,具体代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QPaintEvent>
#include <QPainter>
#include <QMainWindow>
#include <QtMath>
#include <QList>
#include <QTimer>
#include <QFont>
#include <QScreen>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void paintEvent(QPaintEvent *event);
private:
    Ui::MainWindow *ui;
    QTimer* timer = 0;
    QTimer* timer2 = 0;
    int indexOffse = 0;
    QString showText = "";
    QList<QColor> colorList;
    QList<int>radiusList;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground);
    colorList.clear();
    colorList.append(QColor(255,255,255));
    colorList.append(QColor(245,253,255));
    colorList.append(QColor(240,252,255));
    colorList.append(QColor(222,243,249));
    colorList.append(QColor(202,241,252));
    colorList.append(QColor(189,236,249));
    colorList.append(QColor(180,237,252));
    colorList.append(QColor(161,231,255));
    radiusList.clear();
    int radius = 8;
    for(int i =0; i < 8; i++)
    {
        radiusList.append(radius + 1*i);
    }
    showText = "加载中..  ";
    timer = new QTimer(this);
    timer2 = new QTimer(this);
    connect(timer,&QTimer::timeout,[=]{
        indexOffse--;
        if(indexOffse <0)
            indexOffse = 7;
        update();
    });
    connect(timer2,&QTimer::timeout,[=]{
        int len = showText.right(4).simplified().length();
        if(len >=4)
            len = 0;
        showText = "加载中";
        for(int i = 0; i < 4; i++)
        {
            if(i < len+1)
                showText += ".";
            else
                showText += " ";
        }
        update();
    });
    timer->start(60);
    timer2->start(200);
    QScreen *mScreen = QGuiApplication::screens().first();
    resize(mScreen->size());
}

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


void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

    int width = this->width();
    int height = this->height();


    painter.save();
    painter.fillRect(this->rect(),QColor(0,0,0,2));

    QList<QSize> sizeList;
    qreal k = qSin( 45 * 3.1415926 / 180);
    int centerWidth = 200;
    int centerHeight = 200;
    int centerX = (width) * 0.5;
    int centerY = (height) * 0.5;
    int rLen = 30;
    sizeList.append(QSize(centerX-rLen,  centerY));
    sizeList.append(QSize(centerX-rLen*k,  centerY- rLen*k));
    sizeList.append(QSize(centerX ,  centerY - rLen));
    sizeList.append(QSize(centerX+rLen*k ,  centerY-rLen*k ));
    sizeList.append(QSize(centerX +rLen ,  centerY ));
    sizeList.append(QSize(centerX +rLen*k,  centerY +rLen*k));
    sizeList.append(QSize(centerX ,  centerY +rLen));
    sizeList.append(QSize(centerX -rLen*k,  centerY+rLen*k ));

    painter.setPen(QColor(0,0,0,100));
    painter.setBrush(QColor(0,0,0,100));
    painter.drawRoundedRect(QRect(centerX-centerWidth*0.5,centerY-centerHeight*0.5,centerWidth ,centerHeight), 20,20);

    auto paintEllips = [=](QPainter& painter,QColor color, int radius, QSize size)
    {
        int x1 = size.width() - 0.5*radius;
        int y1 =  size.height() - 0.5*radius;
        painter.setPen(color);
        painter.setBrush(color);
        painter.drawEllipse(x1,y1, radius,radius);
    };

    for(int i =0; i < sizeList.count(); i++)
    {
        int index =( i + indexOffse) % 8;
        paintEllips(painter, colorList[index],radiusList[index],sizeList[i]);
    }
    painter.setPen(QColor(255,255,255));
    painter.setBrush(QColor(255,255,255));
    QTextOption textO;
    textO.setAlignment(Qt::AlignCenter);
    QFont font = painter.font();
    font.setPointSize(16);
    painter.setFont(font);
    painter.drawText(QRectF(centerX-centerWidth*0.4,centerY+centerHeight*0.2,centerWidth*0.8 ,centerHeight*0.2),showText, textO);

    painter.restore();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值