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);
}