經過幾天的qt視訊學習,基本掌握了時間,信号和槽以及qt定時器的使用,還有QT UI設計器的一些布局,自己根據上課流程,寫了一個小遊戲,基本還算可以。ui布局基本都是使用設計器完成的,下面是部分源代碼:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QTime>
#include<QMessageBox>
#include<qstring.h>
#include<QDebug>
#include<QMovie>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->stackedWidget->setCurrentWidget(ui->page); //ui設計中使用stacked控件建立多個頁面,首頁預設index(0),顯示首頁
/*遊戲失敗動畫初始化*/
startmovie.setFileName(":/new/prefix1/85ccde71gw1fasliemtifg208c05phdt.gif");
ui->label_3->setMovie(&startmovie);
ui->label_3->setScaledContents(true);
/*遊戲成功動畫初始化 */
winmovie.setFileName(":/new/prefix1/-48482abb2408b8fd.gif");
ui->label_4->setMovie(&winmovie);
ui->label_4->setScaledContents(true);
// ui->stackedWidget->setCurrentIndex(2);
connect(ui->pushButton,&QPushButton::clicked,this,&MainWindow::on_startbutton_clicked); //開始遊戲的信号函數
connect(ui->pushButton_2,&QPushButton::clicked,this,&MainWindow::on_endbutton_clicked); //結束槽
/*button 0~ 9對應的信号*/
connect(ui->button0,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button1,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button2,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button3,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button4,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button5,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button6,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button7,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button8,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button9,&QPushButton::clicked,this,&MainWindow::delnum);
connect(ui->button_del,&QPushButton::clicked,this,&MainWindow::on_button_del_clicked); //删除信号
connect(ui->button_piont,&QPushButton::clicked,this,&MainWindow::on_button_piont_clicked); //提示信号
connect(ui->action,&QAction::triggered,this,&MainWindow::on_action_triggered);
connect(ui->action_2,&QAction::triggered,this,&MainWindow::on_action2_triggered);
connect(ui->action_3,&QAction::triggered,this,&MainWindow::on_action3_triggered);
}
/*遊戲開始槽函數*/
void MainWindow::on_startbutton_clicked()
{
gametime=ui->comboBox->currentText().toInt(); //首先從combobox讀取裡面的值,然後轉化為int類型(gametime為全局成員)
qDebug("%d",gametime); //用于調試看讀取成功沒
ui->stackedWidget->setCurrentWidget(ui->page_2); //按鈕按下後,顯示第二個界面,即遊戲界面
int num; //定義int變量來存放随機數
qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); //
while((num=qrand()%10000)<999); //顯示0~10000内随機數,并且剔除小于四位數的數值
randStr = QString::number(num); //将生成的随機數轉化為字元串
ui->progressBar->setMaximum(0); //設定進度條最小值為0
ui->progressBar->setMaximum(gametime); //進度條最大值為gametime
ui->progressBar->setValue(gametime); //設定進度條目前值為gametime
gametimeid=0; //gametimeid初始化為0(全局成員)
gametimeid=startTimer(1000);//設定定時器時間間隔為1s,每一秒進入定時器函數一次
resultStr.clear(); //清除輸入結果
ui->textEdit->clear();//清除文本框
}
/**/
void MainWindow::timerEvent(QTimerEvent *event)
{
if(event->timerId()==gametimeid) //判斷gametimeid=0是否到時
{
gametime--; //每過1s,遊戲時間減1
ui->progressBar->setValue(gametime); //更新進度條顯示
if(gametime==0) //當遊戲時間為0
{
overtimeid=0;
killTimer(gametimeid); //清除定時器
QMessageBox::information(this,"遊戲失敗!","朋友,時間到了,下把再見!!");
startmovie.start(); //失敗動畫開始
ui->stackedWidget->setCurrentWidget(ui->page_3);//顯示失敗動畫界面
overtimeid=startTimer(2000); //失敗動畫持續時間
}
}
else if(event->timerId()==overtimeid) //失敗動畫定時器服務函數
{
startmovie.stop();
killTimer(overtimeid);
ui->stackedWidget->setCurrentWidget(ui->page); //2s後回到主界面
}
else if(event->timerId()==wintimeid) //勝利動畫定時器服務函數
{
winmovie.stop();
killTimer(wintimeid);
ui->stackedWidget->setCurrentWidget(ui->page);
}
}
/*遊戲結束按鈕槽函數*/
void MainWindow::on_endbutton_clicked()
{
this->close();
}
/*button 0~9 的 處理槽函數*/
void MainWindow::delnum()
{
QObject *mysender=sender(); //sender函數判斷那個摁下
QPushButton *p=(QPushButton *)mysender; //強制轉化
if (p!=NULL)
{
QString numstr = p->text(); //得到按下的值
resultStr+=numstr; //每次按下後字元串拼接
if(resultStr.size()==1&&resultStr=="0") //對首個按下的數為0,不作處理
{
resultStr.clear();
}
if(resultStr.size()<=4) //當按下數為設定位數時開始判斷
{
ui->textEdit->setText(resultStr);
if(resultStr.size()==4)
{
if(resultStr>randStr)
{
ui->textEdit->setText("猜的大了點!");
}
if(resultStr<randStr)
{
ui->textEdit->setText("猜的小了點!");
}
if(resultStr==randStr) //猜中之後開始遊戲勝利的動畫
{
wintimeid=0;
ui->textEdit->setText("恭喜 ,你猜對了");
killTimer(gametimeid);
QMessageBox::information(this,"勝利","恭喜 ,你猜對了");
ui->stackedWidget->setCurrentIndex(0);
winmovie.start();
ui->stackedWidget->setCurrentWidget(ui->page_4);
wintimeid=startTimer(2000); //持續2s
}
resultStr.clear(); //清空結果
}
}
}
}
/*删除按鈕槽函數 */
void MainWindow::on_button_del_clicked()
{
if(resultStr.size()==1) //如果為1 ,直接删除
{
resultStr.clear();
}
else //否則,截取最後一個
{
resultStr.chop(1);
ui->textEdit->setText(resultStr);
}
}
/*提示按鈕槽函數 */
void MainWindow::on_button_piont_clicked()
{
ui->textEdit->setText("答案為:"+randStr);//直接顯示随機數
}
void MainWindow::on_action_triggered()
{
ui->stackedWidget->setCurrentWidget(ui->page_5);
ui->textBrowser->show();
}
void MainWindow::on_action2_triggered()
{
ui->stackedWidget->setCurrentWidget(ui->page_6);
ui->textBrowser_2->show();
}
void MainWindow::on_action3_triggered()
{
ui->stackedWidget->setCurrentWidget(ui->page);
}
MainWindow::~MainWindow()
{
delete ui;
}
遊戲截圖:

源碼已經上傳至csdn: 代碼注釋很詳細,邊學邊注釋的,以便于像我一樣的初學者學習,源代碼傳送門:https://download.csdn.net/download/qq_38643642/11238285
另外,編譯好的exe檔案也将上傳到我的資源。