目录
第一个界面
第二个界面
第一个界面
在.pro文件里添加sql
QT += core gui sql
点击.ui文件添加组件
类和对象如图所示,右键MianWindow->改变样式表,在编辑样式表里添加代码改变按钮样式
QPushButton{border:2px solid #7b7b7b; //按钮边框样式border-radius:15px; //圆角background-color:#b6b6b6; //颜色
}QPushButton:hover{ //鼠标移动样式background-color:#cacaca;
}QPushButton:pressed{ //鼠标点击样式background-color:#e1e1e1;
}
login.h
#ifndef SQLITELOGIN_H
#define SQLITELOGIN_H#include "snake.h"#include <QMainWindow>
#include <QString>
#include <QDebug>
#include <QEvent>namespace Ui {
class SqliteLogin;
}class SqliteLogin : public QMainWindow
{Q_OBJECTpublic:explicit SqliteLogin(QWidget *parent = 0);~SqliteLogin();Snake snake;private slots:void on_longinBt_clicked();void on_registBt_clicked();private:Ui::SqliteLogin *ui;
};#endif // SQLITELOGIN_H
login.cpp
#include "sqlitelogin.h"
#include "ui_sqlitelogin.h"#include "snake.h"#include <QMessageBox>
#include <QSqlQuery>
#include <QSqlTableModel>SqliteLogin::SqliteLogin(QWidget *parent) :QMainWindow(parent),ui(new Ui::SqliteLogin)
{ui->setupUi(this);setWindowTitle("登录注册界面");
}SqliteLogin::~SqliteLogin()
{delete ui;
}void SqliteLogin::on_longinBt_clicked()
{QString username = ui->userEdit->text();QString password = ui->passEdit->text();//查询数据库验证QSqlTableModel *model = new QSqlTableModel;model->setTable("userinfo");model->setFilter(QString("username='%1' and password='%2'").arg(username).arg(password));model->select();//检查是否查询到数据int row = model->rowCount();if (row > 0){//QMessageBox::information(this, "登录提示", "登录成功");QMessageBox *msgbox = new QMessageBox(this);msgbox->information(this, "登录提示", "登录成功");snake.show();this->hide();//隐藏界面}else{QMessageBox::information(this, "登录提示", "登录失败");}delete model;
}void SqliteLogin::on_registBt_clicked()
{QString username = ui->userEdit->text();QString password = ui->passEdit->text();QString cmd = QString ("insert into userinfo values('%1', '%2')").arg(username).arg(password);QSqlQuery query;if(query.exec(cmd)){QMessageBox::information(this, "注册提示", "注册成功");}else{QMessageBox::information(this, "注册提示", "注册失败");}
}
main.cpp
#include "sqlitelogin.h"
#include <QApplication>#include <QSqlDatabase>
#include <QSqlQuery>int main(int argc, char *argv[])
{//1创建数据库---QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE");//设置数据库名db.setDatabaseName("pwd.db");//打开数据if(db.open()){qDebug ()<<"open database success";}else{qDebug ( )<<"open database fail";}//创建一个存储用户名密码的数据库表QString cmd="create table if not exists userinfo (username varchar(64), password varchar(64))";QSqlQuery query;if (query.exec(cmd)){qDebug ()<<"exec success";}QApplication a(argc, argv);SqliteLogin w;w.show();return a.exec();
}
第二个界面
右键项目文件->添加新文件->选择Qt设计师界面类->选择界面模板->Widget->修改类名snake
snake.h
#ifndef SNAKE_H
#define SNAKE_H#include <QWidget>
#include <QKeyEvent>
#include <QTimer>
#include <QPainter>
#include <QPalette>
#include <QPen>
#include <QBrush>
#include <QFont>
#include <QString>
#include <QColorDialog>QT_BEGIN_NAMESPACE
namespace Ui {
class Snake;
}
QT_END_NAMESPACEtypedef enum Direct{DIR_LEFT,DIR_RIGHT,DIR_UP,DIR_DOWM
}dir_t;class Snake : public QWidget
{Q_OBJECTpublic:explicit Snake(QWidget *parent = nullptr);~Snake();protected:void keyPressEvent(QKeyEvent *event);void addTop();void addDowm();void addLeft();void addRight();void paintEvent(QPaintEvent *event);void deleteLast();void addNewReword();bool checkContact();private:Ui::Snake *ui;int moveFlag = DIR_UP;bool gameStart = false;QTimer *timer;int time =150; //蛇的移动速度QList <QRectF> snake;QRectF rewardNode;int nodeWidth = 20;int nodeHeight = 20;protected slots:void timeout();
};#endif // SNAKE_H
snake.cpp
#include "snake.h"
#include "ui_snake.h"Snake::Snake(QWidget *parent) :QWidget(parent),ui(new Ui::Snake)
{ui->setupUi(this);setWindowTitle("贪吃蛇");timer = new QTimer();//定时器connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));resize(600, 368);//窗口大小//画蛇QRectF rect(300, 180, nodeWidth, nodeHeight);//蛇头snake.append(rect);addTop();addTop();addNewReword();//食物
}Snake::~Snake()
{delete ui;
}void Snake::keyPressEvent(QKeyEvent *event)//键盘事件
{switch (event->key()) {case Qt::Key_Up:if(moveFlag != DIR_DOWM){moveFlag = DIR_UP;}break;case Qt::Key_Down:if(moveFlag != DIR_UP){moveFlag = DIR_DOWM;}break;case Qt::Key_Left:if(moveFlag != DIR_RIGHT){moveFlag = DIR_LEFT;}break;case Qt::Key_Right:if(moveFlag != DIR_LEFT){moveFlag = DIR_RIGHT;}break;case Qt::Key_Space:if(gameStart == false){gameStart = true;timer->start(time);}else{gameStart = false;timer->stop();}break;default:break;}
}void Snake::timeout()//超时处理
{//判定蛇头与食物重叠int count = 1;if(snake[0].intersects(rewardNode)){count++;addNewReword();}while (count--){switch (moveFlag) {case DIR_UP:addTop();break;case DIR_DOWM:addDowm();break;case DIR_LEFT:addLeft();break;case DIR_RIGHT:addRight();break;default:break;}}deleteLast();update();
}void Snake::addTop()//上移
{QPointF leftTop;QPointF rightBottom;if (snake[0].y() - nodeHeight < 0){leftTop = QPoint(snake[0].x(), this->height() - nodeHeight);rightBottom = QPointF(snake[0].x() + nodeWidth, this->height());}else{leftTop = QPointF(snake[0].x(), snake[0].y() - nodeHeight);rightBottom = snake[0].topRight();}snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::addDowm()//下移
{QPointF leftTop;QPointF rightBottom;if (snake[0].y() + nodeHeight*2 > this->height()){leftTop = QPointF(snake[0].x(), 0);rightBottom = QPointF(snake[0].x()+nodeWidth, nodeHeight);}else{leftTop = snake[0].bottomLeft();rightBottom = snake[0].bottomRight() + QPointF(0, nodeHeight);}snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::addLeft()//左移
{QPointF leftTop;QPointF rightBottom;if (snake[0].x() - nodeWidth < 0){leftTop = QPointF(this->width()-nodeWidth, snake[0].y());}else{leftTop = snake[0].topLeft() - QPointF(nodeWidth, 0);}rightBottom = leftTop + QPointF(nodeWidth, nodeHeight);snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::addRight()//右移
{QPointF leftTop;QPointF rightBottom;if (snake[0].x() + nodeWidth*2 > this->width()){leftTop = QPointF(0, snake[0].y());}else{leftTop = snake[0].topRight();}rightBottom = leftTop + QPointF(nodeWidth, nodeHeight);snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::paintEvent(QPaintEvent *event)//重写绘图事件处理器
{QPainter painter(this);//画家QPen pen;//画笔QBrush brush(QColor(Qt::gray));//背景颜色QPixmap pix;painter.drawPixmap(0, 0, 600, 368, pix);//蛇pen.setColor(Qt::black);brush.setColor(Qt::yellow);brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);for(int i=0; i<snake.length(); i++){painter.drawRect(snake[i]);}//食物pen.setColor(Qt::red);brush.setColor(Qt::red);brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);painter.drawEllipse(rewardNode);//显示分数QFont font("微软雅黑", 12, QFont::ExtraLight);pen.setColor(Qt::black);painter.setPen(pen);painter.setFont(font);painter.drawText(20,20,QString("当前得分:")+QString("%1").arg(snake.length()-3));//结束提示if (checkContact()){QFont font("微软雅黑", 30, QFont::ExtraLight, false);pen.setColor(Qt::red);painter.setPen(pen);painter.setFont(font);painter.drawText((this->width() -300)/2,(this->height() -30)/2,QString("GAME OVER!"));timer->stop();}QWidget::paintEvent(event);
}void Snake::deleteLast()//删除最后一格
{snake.removeLast();
}void Snake::addNewReword()//添加食物
{rewardNode = QRectF(qrand()%(this->width()/20) *20,qrand()%(this->height()/20)*20,nodeWidth,nodeHeight);
}bool Snake::checkContact()//判断蛇与食物碰撞
{for (int i=0; i<snake.length(); i++){for (int j=i+1; j<snake.length(); j++){if(snake[i] ==snake[j]){return true;}}}return false;
}
最终效果