最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實現抽獎小游戲的三種方式

 更新時間:2023年10月11日 09:22:31   作者:FreeLikeTheWind.  
本文主要介紹了Qt實現抽獎小游戲的三種方式,主要包括while循環(huán),定時器,線程這三種方法,具有一定的參考價值,感興趣的可以了解一下

簡介

本文章是基本Qt與C++實現一個抽獎小游戲,用到的知識點在此前發(fā)布的幾篇文章。

下面是跳轉鏈接:

【Qt控件之QLabel】用法及技巧鏈接: //m.fzitv.net/program/3003053ai.htm

【Qt控件之QPushButton】用法及技巧 鏈接://m.fzitv.net/program/300318qgu.htm

【Qt控件之QDialog】用法及技巧 鏈接://m.fzitv.net/program/300322vaf.htm

【Qt控件之QMainWindow】用法及技巧 鏈接:http://m.fzitv.net/program/300326afw.htm

【Qt控件之QTimer】用法及技巧 鏈接:http://m.fzitv.net/program/300328eal.htm

實現方式

實現方式多種多樣,但畢竟是小程序,需求明確(就沒考慮操作及優(yōu)化),功能簡單,條理清晰,主要提供三種實現方式(此階段未實現概率設置,之后再發(fā)布概率設置版本吧):

1. 基于while循環(huán)

示例:
先粘貼UI

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_FORWARD_DECLARE_CLASS(C_DlgSetting)
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    // 退出
    void slot_actQuit_triggered();
    // 設置概率
    void slot_actSetting_triggered();
    // 開始
    void slot_btnStart_clicked();
    // 停止
    void slot_btnStop__clicked();
private:
    Ui::MainWindow *ui;
    C_DlgSetting*       m_pDlgSetting; // 概率設置類
    bool                m_bFlag = false;// 標志
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "DlgSetting.h"
#include <QTime>
#include <QThread>
#include <QCoreApplication>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // m_pDlgSetting = new C_DlgSetting(this);
    // 信號和槽
    {
        connect(ui->action_quit, &QAction::triggered, this, &MainWindow::slot_actQuit_triggered);
        connect(ui->action_setting, &QAction::triggered, this, &MainWindow::slot_actSetting_triggered);
        connect(ui->btn_start, &QPushButton::clicked, this, &MainWindow::slot_btnStart_clicked);
        connect(ui->btn_stop, &QPushButton::clicked, this, &MainWindow::slot_btnStop__clicked);
    }
    // 聲明隨機數種子,不然就是偽隨機(每次產生的隨機數都一樣)
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::slot_actQuit_triggered()
{
    close();
}
void MainWindow::slot_actSetting_triggered()
{
    // m_pDlgSetting->exec();
}
void MainWindow::slot_btnStart_clicked()
{
    if(m_bFlag)
    {
        return;
    }
    QStringList sl;
    sl << "一等獎" << "二等獎" << "三等獎" << "四等獎" << "五等獎";
    m_bFlag = true;
    while (m_bFlag) {
        int nRange = qrand() % 5;
        ui->label_turn->setText(sl.at(nRange));
        // 100ms轉一次
        QThread::msleep(100);
        // 防止界面卡死
        QCoreApplication::processEvents();
    }
}
void MainWindow::slot_btnStop__clicked()
{
    m_bFlag = false;
    // 顯示最終獲獎結果
    QString strRes = QString("最終結果: %1").arg(ui->label_turn->text());
    ui->label_res->setText(strRes);
}

.main

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

結果

  • 實現思路
    – 設置UI,注意命名
    – 進行信號和槽連接
    – 實現"開始"和"結束"功能
    – 顯示結果

2. 基于定時器

  • 示例
    UI顯示與1.是一樣的,需借助QTimer實現

QTimer 是 Qt 框架中的一個類,用于在特定的時間間隔后發(fā)出一個信號。它是 Qt
的事件循環(huán)系統(tǒng)的一部分,該系統(tǒng)允許程序在等待某些事件(如用戶輸入或定時器超時)時保持響應。

QTimer 的工作原理是將定時器的超時作為一個事件添加到 Qt
的事件隊列中。當事件循環(huán)檢測到定時器超時時,它就會發(fā)出預定的信號。這種機制允許 QTimer
在等待定時器超時時不會阻塞用戶界面,因為事件循環(huán)可以繼續(xù)處理其他事件,如用戶輸入或繪制事件。

相比之下,如果使用標準的 C++ 定時器,如
std::this_thread::sleep_for,在等待定時器超時時,當前線程將被阻塞,無法處理其他事件。這會導致用戶界面無響應,給用戶一種程序已經卡死的感覺。

直接粘貼相關代碼:
.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    // 退出
    void slot_actQuit_triggered();
    // 開始
    void slot_btnStart_clicked();
    // 停止
    void slot_btnStop__clicked();
    // 定時器處理
    void slot_timeout();
private:
    Ui::MainWindow *ui;
    bool                m_bFlag = false;// 標志
    QTimer*             m_pTimer;// 定時器
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QThread>
#include <QCoreApplication>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_pTimer = new QTimer(this);
    // 處理
    connect(m_pTimer, &QTimer::timeout, this, &MainWindow::slot_timeout);
    // 信號和槽
    {
        connect(ui->action_quit, &QAction::triggered, this, &MainWindow::slot_actQuit_triggered);
        connect(ui->btn_start, &QPushButton::clicked, this, &MainWindow::slot_btnStart_clicked);
        connect(ui->btn_stop, &QPushButton::clicked, this, &MainWindow::slot_btnStop__clicked);
    }
    // 聲明隨機數種子,不然就是偽隨機(每次產生的隨機數都一樣)
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::slot_actQuit_triggered()
{
    close();
}
void MainWindow::slot_btnStart_clicked()
{
	// 此處可先判斷定時器是否處于活動狀態(tài),如果是,則返回;否則,再啟動
	// ToDoSomething
	{
	}
    m_pTimer->start(100);
}
void MainWindow::slot_btnStop__clicked()
{
    m_pTimer->stop();
    // 顯示最終獲獎結果
    QString strRes = QString("最終結果: %1").arg(ui->label_turn->text());
    ui->label_res->setText(strRes);
}
void MainWindow::slot_timeout()
{
    QStringList sl;
    sl << "一等獎" << "二等獎" << "三等獎" << "四等獎" << "五等獎";
    int nRange = qrand() % 5;
    ui->label_turn->setText(sl.at(nRange));
}
  • 實現思路
    – 點擊"開始",啟動定時器
    – “定時器"實現界面刷新
    – 點擊"結束”,停止定時器,并將結果顯示

3. 基于線程

  • 實現思路(等之后發(fā)布線程文章后,實現)
    – 在主窗口創(chuàng)建一個線程對象
    – 點擊"開始",將信號發(fā)送到線程中,用于更新幾等獎
    – 線程將更新后的信息發(fā)送到主窗口
    – 主窗口動態(tài)顯示
    – 點擊"結束",停止線程,顯示結果

到此這篇關于Qt實現抽獎小游戲的三種方式的文章就介紹到這了,更多相關Qt 抽獎游戲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++數據結構之鏈表的創(chuàng)建

    C++數據結構之鏈表的創(chuàng)建

    這篇文章主要介紹了C++數據結構之鏈表的創(chuàng)建的相關資料,希望通過本文幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下
    2017-10-10
  • 詳解C++14中返回類型推導的使用

    詳解C++14中返回類型推導的使用

    這篇文章主要為大家詳細介紹了C++14中返回類型推導的使用,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-07-07
  • C/C++ 中堆和棧及靜態(tài)數據區(qū)詳解

    C/C++ 中堆和棧及靜態(tài)數據區(qū)詳解

    這篇文章主要介紹了C/C++ 中堆和棧及靜態(tài)數據區(qū)詳解的相關資料,需要的朋友可以參考下
    2017-04-04
  • C語言實現學生管理系統(tǒng)的源碼分享

    C語言實現學生管理系統(tǒng)的源碼分享

    這篇文章主要為大家詳細介紹了如何利用C語言實現學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語言順序表實現代碼排錯

    C語言順序表實現代碼排錯

    這篇文章主要介紹了C語言順序表實現方法,大家參考使用吧
    2013-12-12
  • C++實現十進制數轉為其它進制數

    C++實現十進制數轉為其它進制數

    這篇文章主要為大家詳細介紹了C++實現十進制數轉為其它進制數,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++基于EasyX框架實現飛機大戰(zhàn)小游戲

    C++基于EasyX框架實現飛機大戰(zhàn)小游戲

    EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將利用EasyX框架實現飛機大戰(zhàn)小游戲,需要的可以參考一下
    2023-01-01
  • C++如何有效地利用命名空間

    C++如何有效地利用命名空間

    談到C++編程中的模塊化和組織性時,命名空間(Namespace)是一個重要的概念,所以本文主要來和大家聊聊C++命名空間的概念、用法以及如何有效地利用它來管理代碼,有需要的可以參考下
    2023-09-09
  • C語言實現BMP轉換JPG的方法

    C語言實現BMP轉換JPG的方法

    這篇文章主要介紹了C語言實現BMP轉換JPG的方法,涉及C#圖片格式轉換的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C語言數據結構之中綴樹轉后綴樹的實例

    C語言數據結構之中綴樹轉后綴樹的實例

    這篇文章主要介紹了C語言數據結構之中綴樹轉后綴樹的實例的相關資料,需要的朋友可以參考下
    2017-08-08

最新評論

西宁市| 阿图什市| 新宾| 海城市| 上饶县| 垫江县| 北海市| 韶山市| 嘉善县| 浑源县| 保定市| 东兴市| 珠海市| 潞城市| 霍州市| 泗水县| 民丰县| 奉化市| 汝州市| 哈密市| 汾西县| 于田县| 理塘县| 城固县| 和静县| 陵川县| 灵石县| 宝鸡市| 甘泉县| 太保市| 松桃| 镇坪县| 哈巴河县| 呈贡县| 资阳市| 眉山市| 梅州市| 蓝山县| 南康市| 闵行区| 大厂|