qt实现扫雷四:窗口设计

这篇博客总结了使用QT实现扫雷游戏窗口设计的过程,包括计时器每秒更新游戏时间,通过继承QMainWindow添加菜单和下拉选项,以及如何定义槽函数。提供了源代码和打包程序的下载链接,展示了程序运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

qt实现扫雷四:窗口设计

扫雷的主窗口,main函数里运行这个窗口
这是这两天用qt写扫雷所做的一些事情,在这里总结一下,另外,源代码和整个工程已上传,可以此链接下载:
https://download.youkuaiyun.com/download/qq_34359028/10872103
打包的程序可以此链接下载:
https://download.youkuaiyun.com/download/qq_34359028/10872122

问题总结

1、计时程序,1s触发一次,更新游戏时间

#include <QTimer>
QTimer *past_timer;
past_timer = new QTimer(this);
past_timer->setInterval(1000);
connect(past_timer,SIGNAL(timeout()),this,SLOT(updateTimeCount()));
past_timer->start();

2、继承自QMainWindow类,可以添加菜单,下拉菜单里设计选项,新游戏或修改雷区参数。

#include <QMenu>
#include <QMenuBar>
QMenu *tools_menu;
QMenuBar *menu;
tools_menu = new QMenu();
tools_menu->setTitle("setting");
tools_menu->addAction("close", this, SLOT(close()));
tools_menu->addAction("new game", this, SLOT(setNewGame()));
tools_menu->addAction("self define", this, SLOT(selfDefineNewGame()));
menu = new QMenuBar(this);
menu->setGeometry(0, 0, 20, 20);
menu->addMenu(tools_menu);

3、定义槽函数,需要定义为 private slots

private slots:
    void setNewGame();
    void selfDefineNewGame();
    void updateTimeCount();

4、程序运行效果如下
在这里插入图片描述

头文件

1、宏定义雷区偏移位置

#define     ROW_START       20
#define     COLUMN_START    0

2、窗口类,继承自QMainWindow

class thunder_window : public QMainWindow
{
    Q_OBJECT

public:
    thunder_window(QWidget *parent = 0);
    ~thunder_window();

protected:
    //重载鼠标点击事件响应
    void mousePressEvent(QMouseEvent *event);

private slots:
    //下拉菜单中选择new game响应函数
    void setNewGame();
    //下拉菜单中选择self define响应函数
    void selfDefineNewGame();
    //1s计时器触发时间更新响应函数
    void updateTimeCount();

private:
    thunder_view *tv;
    QMenu *tools_menu;
    QMenuBar *menu;
    QLabel *number_label;
    int current_number;
    QTimer *past_timer;
    int time_count;
    QLabel *time_label;
};

源文件

thunder_window::thunder_window(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("Thunder Game");
    tv = new thunder_view(this);
    tv->setGeometry(COLUMN_START, ROW_START, tv->getViewWidth(), tv->getViewHeight());
    qDebug()<<tv->getViewWidth()<<" "<<tv->getViewHeight();
    setFixedSize(tv->getViewWidth() + COLUMN_START, tv->getViewHeight() + ROW_START);
    current_number = tv->getCurrentNumber();
    
    number_label = new QLabel(this);
    number_label->setGeometry(this->width() / 2 - 10, 0, 50, 20);
    number_label->setText(QString::number(current_number));

    tools_menu = new QMenu();
    tools_menu->setTitle("setting");
    tools_menu->addAction("close", this, SLOT(close()));
    tools_menu->addAction("new game", this, SLOT(setNewGame()));
    tools_menu->addAction("self define", this, SLOT(selfDefineNewGame()));
    menu = new QMenuBar(this);
    menu->setGeometry(0, 0, 20, 20);
    menu->addMenu(tools_menu);

    time_count = 0;
    time_label = new QLabel(this);
    time_label->setGeometry(this->width() - 50, 0, 50, 20);
    time_label->setText("00:00");
    past_timer = new QTimer(this);
    past_timer->setInterval(1000);
    connect(past_timer,SIGNAL(timeout()),this,SLOT(updateTimeCount()));
    past_timer->start();
}

thunder_window::~thunder_window()
{

}

void thunder_window::mousePressEvent(QMouseEvent *event)
{
    if(event->y() < ROW_START)
    {
        return;
    }
    int temp = tv->mouseClicked(COLUMN_START, ROW_START, event);

    if(temp == IS_THUNDER)
    {
        QMessageBox::StandardButton rb = QMessageBox::information(NULL, "hello", "you lose, new game?",
                                     QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
        if(rb == QMessageBox::Yes)
        {
            tv->newGame();
            time_count = 0;
        }else
        {

        }
    }

    if(tv->checkWin())
    {
        QMessageBox::StandardButton rb = QMessageBox::information(NULL, "hello", "you win, new game?",
                                     QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
        if(rb == QMessageBox::Yes)
        {
            tv->newGame();
            time_count = 0;
        }else
        {

        }
    }
    
    current_number = tv->getCurrentNumber();
    number_label->setText(QString::number(current_number));
}

void thunder_window::setNewGame()
{
   tv->newGame();
   time_count = 0;
   current_number = tv->getCurrentNumber();
   number_label->setText(QString::number(current_number));
   qDebug()<<"new game clicked";
}

void thunder_window::selfDefineNewGame()
{
    thunder_dialog *dialog = new thunder_dialog(tv->getRow(), tv->getColumn(), tv->getNumber());
    dialog->exec();

    tv->setParameters(dialog->getRow(), dialog->getColumn(), dialog->getNumber());
    tv->setGeometry(COLUMN_START, ROW_START, tv->getViewWidth(), tv->getViewHeight());
    setFixedSize(tv->getViewWidth() + COLUMN_START, tv->getViewHeight() + ROW_START);
    tv->newGame();
    time_count = 0;
    time_label->setGeometry(this->width() - 50, 0, 50, 20);
    current_number = tv->getCurrentNumber();
    number_label->setText(QString::number(current_number));
    number_label->setGeometry(this->width() / 2 - 10, 0, 50, 20);
    qDebug()<<dialog->getRow()<<dialog->getColumn();
    delete dialog;
}

void thunder_window::updateTimeCount()
{
    time_count++;
//    qDebug()<<time_count;
    int m = time_count / 60;
    int s = time_count % 60;
    QString ms = QString::number(m);
    QString ss = QString::number(s);
    if(m < 10)
    {
        ms = "0" + ms;
    }

    if(s < 10)
    {
        ss = "0" + ss;
    }
    time_label->setText(ms + ":" + ss);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值