Qt 摇奖

现在最大的骗局就是买彩票中奖,中奖号完全可以人为干预,哈哈。。。

录制_2022_09_14_09_52_39_764

一 、 界面布局

顶部Qlabel 提升控件 MyQLabel 

下面是完整代码 

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->pushButton->setText("开 始");
    ui->result_label->setStyleSheet("background-color: rgb(250, 255, 255);font-size:35px;color:blue");

    connect(ui->L6,&MyQLabel::stoped,this,&MainWindow::on_showValue);
}

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

void MainWindow::on_pushButton_clicked()
{
    if (ui->pushButton->text() == "开 始")
    {
        ui->L1->start( (QRandomGenerator::global()->bounded(3) + 2)* 3 + 8);        // [0,10) 随机数据);
        ui->L2->start( (QRandomGenerator::global()->bounded(1) + 2)* 3 + 7);        // [0,10) 随机数据);
        ui->L3->start( (QRandomGenerator::global()->bounded(2) + 2)* 3 + 5);        // [0,10) 随机数据);
        ui->L4->start( (QRandomGenerator::global()->bounded(3) + 2)* 3 + 6) ;        // [0,10) 随机数据);
        ui->L5->start( (QRandomGenerator::global()->bounded(2) + 2)* 3 + 4);        // [0,10) 随机数据);
        ui->L6->start( (QRandomGenerator::global()->bounded(1) + 2)* 3 + 9);        // [0,10) 随机数据);
        ui->pushButton->setText("停 止");
        ui->result_label->clear();
    }
    else
    {
        ui->pushButton->setEnabled(false);

        ui->L1->stop(0);
        ui->L2->stop(500);
        ui->L3->stop(1000);
        ui->L4->stop(2000);
        ui->L5->stop(2500);
        ui->L6->stop(3000);
    }
}

void MainWindow::on_showValue()
{
    ui->pushButton->setText( "开 始");
    //          qDebug () <<   ui->result_label->text();
    ui->result_label->setText( ui->L1->getDigital() + " " +
                               ui->L2->getDigital() + " " +
                               ui->L3->getDigital() + " " +
                               ui->L4->getDigital() + " " +
                               ui->L5->getDigital() + " " +
                               ui->L6->getDigital()
                               );

    ui->pushButton->setEnabled(true);
}

#ifndef MYQLABEL_H
#define MYQLABEL_H

#include <QWidget>
#include <QLabel>
#include <QTimer>
#include <QRandomGenerator>
#include <QPainter>
#include <QFont>
#include <QPen>
#include <QFontMetrics>
#include <QDebug>
#include <QThread>

class MyQLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyQLabel(QWidget *parent = nullptr);
    ~MyQLabel();

    void start(int msec);
    void stop(int secs);

    QString getDigital() const;

protected:
    void paintEvent(QPaintEvent *);


private slots:
    void on_timeroutFunction();

    void on_stop();

signals:
    void stoped();


private:
    void drawText(QPainter &painter,int value, bool flag = false);


private:
    QTimer *timer;
    int offset_num;     // 当前文字位置
    int digital;        // 当前数字
    int next_digital;   // 下一个数字
    bool isRun;
    int fontHeight;
    double next_font_center;
    double next_font_currecet_pos;
    const int FixedHeight = 5;
    int secs;
};

#endif // MYQLABEL_H
#include "myqlabel.h"

MyQLabel::MyQLabel(QWidget *parent) : QLabel(parent)
  ,offset_num(0)
  ,isRun(false)
{
    timer = new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(on_timeroutFunction()));

    digital =  QRandomGenerator::global()->bounded(9);
    next_digital = digital + 1;
    if (next_digital > 9)
        next_digital = 0;
}

MyQLabel::~MyQLabel()
{
    delete timer;
}

void MyQLabel::start(int msec)
{
    isRun = true;
    offset_num = 0;
    timer->start(msec);
}

void MyQLabel::stop(int secs)
{
    QTimer::singleShot(secs, this,SLOT(on_stop()));
}

void MyQLabel::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);

    if (isRun)
    {
        drawText(painter,next_digital,true);     // 上一个文字
        drawText(painter,digital);     // 当前的文字
    }
    else
    {
        digital = next_digital;
        drawText(painter,next_digital);
    }
}

void MyQLabel::drawText(QPainter &painter, int value, bool flag)
{
    QFontMetrics FontMetric = QFontMetrics(painter.font());
    QRectF rect = FontMetric.boundingRect(QString::number(value));

    int y_pos = (this->height()-rect.height()) * 0.5 + offset_num;

    qDebug () << this->height() << "  " << rect.height();

    if (flag)
    {
        next_font_center = (this->height()-rect.height()) * 0.5;     // 中心位置
        next_font_currecet_pos = next_font_center + offset_num - FixedHeight - rect.height();     // 文字中心向上偏移一个文字高度后, 再减去3个固定高度
        y_pos = next_font_currecet_pos;
    }

    painter.drawText(QRectF((this->width() - rect.width()) * 0.5,
                            y_pos,
                            rect.width(),rect.height()),QString::number(value));
}

void MyQLabel::on_timeroutFunction()
{
    if (next_font_center <= next_font_currecet_pos)
    {
        digital = next_digital;
        if (digital > 9)
            digital = 0;

        next_digital += 1;
        if (next_digital > 9)
            next_digital = 0;

        offset_num = 0;
    }

    offset_num += FixedHeight;

    update();
}

void MyQLabel::on_stop()
{
    isRun = false;
    offset_num = 0;
    timer->stop();
    update();
    emit stoped();
}


QString MyQLabel::getDigital() const
{
    return QString::number( next_digital);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值