qt实现扫雷四:窗口设计

小编 2026-07-09 阅读:998 评论:0
qt实现扫雷四:窗口设计 扫雷的主窗口,main函数里运行这个窗口 问题总结 1、计时程序,1s触发一次,更新游戏时间 #include <QTimer> QTimer *past...

qt实现扫雷四:窗口设计

扫雷的主窗口,main函数里运行这个窗口

问题总结

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);
}
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表