目录
目录
一、设计登录主页面
1.0添加资源文件
1.1设置窗口(标题、图标、背景)
1.2自定义按钮类
1.3开始按钮 弹跳效果
1.4播放音乐
二、切换游戏界面
2.1最核心的逻辑
2.2代码创建工具栏
2.3返回主页面按钮
2.3优化切换页面
三、选择关卡按钮(无跳转)
3.1简要介绍
3.2for循环生成关卡选择按钮
3.3标签技术来显示按钮上的数字
3.4字体类来修改文字属性
四、打包发布
4.1生成release版本的exe文件
4.2利用QT自带 windeployqt 的生成打包文件
4.3采用第三方工具打包文件
将所需要的图片、音频添加到资源文件中
设置窗口属性
//1.添加资源文件
//2.指定窗口大小--固定大小
this->setFixedSize(900,600);
//3.设置窗口左上角图标
this->setWindowIcon(QIcon(":/resour/04.png"));
//4.设置窗口标题
this->setWindowTitle("姬霓太美");
//5.加载背景图片--重写画图事件函数
//详见绘图事件函数中
//6.在ui文件中添加工具栏,并将其他无用部分删除
加载背景图片和游戏名称图片
//重写绘图函数--声明作用域,不然会被编译为全局函数
//头文件--
void newload::paintEvent(QPaintEvent*)
{
//1.创建一个画家对象
QPainter painter1(this); //指定父亲
//2.创建pixmap类型的对象,用于加载背景图片
QPixmap pixmap1;
//3.利用pixmap1加载背景图片
pixmap1.load(":/resour/01.jpg");
//4.利用画家将pixmap1加载的背景图画出来
//注意drawpixmap的参数
painter1.drawPixmap(0,0,this->width(),this->height(),pixmap1);
//5.利用pixmap加载《游戏名》图片
pixmap1.load(":/resour/06.png"); //URL:互联网上标准资源的唯一地址
//6.改变图片大小
//scaled:缩放、规模
pixmap1=pixmap1.scaled(pixmap1.width()*0.4,pixmap1.height()*0.4);
//7.将 游戏名 的图片画出来
painter1.drawPixmap(20,33,pixmap1);
}
目的是:按下按钮时,有一个弹动的效果
1.自定义按钮类:mybutton,继承于QPushButton,具有父类的一些属性,也有自己的特有属性
2.自己编写构造函数,第一个参数是未点击按钮图片时的路径,第二个是点击按钮时图片的路径
3.有两个成员函数保存图片路径,加载函数时一些特殊的设定
1.重写mybutton类构造函数
头文件:
//重写构造函数
//explicit mybutton(QWidget *parent = nullptr);
//注意第二个参数为默认参数,实现和声明只需要有一个说明即可
mybutton(QString normalimg,QString pressimg = "");
//两个成员函数保存图片路径
QString normalimgpath;
QString pressimgpath;
cpp文件:
mybutton::mybutton(QString normalimg, QString pressimg)
{
//创建一个Pixmap,更好的显示图片
QPixmap pixmap1;
//保存输入的路径
normalimgpath = normalimg;
pressimgpath = pressimg;
//加载默认显示的图片
int pixnum = pixmap1.load(normalimgpath); //函数返回值为bool
//如果加载失败返回false,提示加载失败
if(!pixnum)
{
//此时的this,指的是mybutton
QString pixstr = QString("%1 图片加载失败").arg(this->normalimgpath);
qDebug()<setFixedSize(pixmap1.width(),pixmap1.height());
//设置不规则图片格式
//边界--0px---透明背景
this->setStyleSheet("QPushButton{border:0px;}");
//设置图片:给按钮添加图片
this->setIcon(QIcon(":/resour/05.png"));
//设置图片大小
this->setIconSize(QSize(pixmap1.width(),pixmap1.height()));
//利用画家画出来
//在主窗口
}
2.主窗口创建 开始游戏 按钮
暂时还没有弹动的功能
//7.创建一个自定义类型的按钮
mybutton* mybutton1 = new mybutton(":/resour/05.png");
//将按钮添加到对象树上
mybutton1->setParent(this);
//移动自定义按钮的位置
mybutton1->move(this->width()*0.5-mybutton1->width()*0.5,this->height()*0.7);
3.1按压动画
需要添加动画类------
//按压动画
void mybutton::zoom1()
{
//创建一个动画类指针对象,第一个参数是目标控件,第二个参数是动画方式geometry:几何
QPropertyAnimation* animation1 = new QPropertyAnimation(this,"geometry");
//创建动画的起始位置
//函数参数:起始位置x值、y值、长、宽
animation1->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
//创建动画结束的位置
//结束位置x值、y值、长、宽
animation1->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
//设置动画时间
animation1->setDuration(200);
//设置动画轨迹
//easing:减轻、纾解
//curve:曲线、弯线
//variant:变量、变化、变种 bounce:弹性、弹跳、反弹
animation1->setEasingCurve(QEasingCurve::OutBounce);
//启动动画
animation1->start();
}
3.2上弹动画
与按下动画类似
3.3组合
采用信号和槽的机制,使用 lambda 表达式的技术来实现
//测试一下
connect(mybutton1,&QPushButton::clicked,[=](){
//调试一下
qDebug()<<"点击了按钮";
//property:所有物、性能、财产
//animation:活力、生气、动画片、动画制作
//开始按钮执行动画
//函数由自定义按钮提供
//按下的动画
mybutton1->zoom1();
//弹起动画
mybutton1->zoom2();
//有一个小bug,快速连续按按钮,按钮就掉下去了
});
1.使用QSound类,但是需要在.pro文件内添加--多媒体XX
QT += core gui multimedia
然后使用自定义的按钮类型创建一个播放音乐的按钮
创建一个音乐类对象,加载音乐,设定播放模式
利用信号和槽的技术,实现点击音乐播放的效果
不知道为什么mp3格式解码不成功?
//创建加载音乐--路径+指定父类
QSound* sound1 = new QSound(":/resour/001.wav",this);
//设置播放次数
//-1是无限循环播放
sound1->setLoops(-1);
//信号和槽--点击按钮,播放音乐
connect(mybutton0,&QPushButton::clicked,this,[=](){
//开始播放音乐
sound1->play();
});
//信号和槽--点击按钮,播放音乐
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
//开始播放音乐
sound1->stop();
});
查阅资料显示:以上方法仅适用于简单播放wav类型的文件。
2.如果想要正常的播放mp3类型的文件,采用以下这种方式
头文件--
//创建加载音乐
QMediaPlayer* player1 = new QMediaPlayer;
//设置父亲
player1->setParent(this);
//指定播放路径 url:资源路径
//播放的是---本地音乐
//player1->setMedia(QUrl::fromLocalFile ("D:\\QT\\10TEN\\TEN\\resour\\001.mp3"));
//播放资源文件--- 复制url地址
player1->setMedia(QUrl("qrc:/resour/001.mp3"));
//设置音量
player1->setVolume(50); //0~100音量范围,默认是100
//信号和槽--点击按钮,播放音乐
connect(mybutton0,&QPushButton::clicked,this,[=](){
//开始播放音乐
qDebug()<<"开始播放音乐";
player1->play();
});
//信号和槽--点击按钮,播放音乐
connect(ui->pushButton,&QPushButton::clicked,this,[=](){
//开始播放音乐
qDebug()<<"停止播放音乐";
player1->stop();
});
1.创建一个新的类
2.在当前类里存放一个新类的指针
3.触发事件,隐藏该类,显示新类
//需要有一个延时的效果
QTimer::singleShot(500,this,[=](){
//进入新页面
//该类隐藏
this->hide();
//创建一个新类
newpage* newpage1 = new newpage;
//显示新类
newpage1->show();
});
这里采用代码的方式来生成工具栏,点击退出游戏则关闭窗口
//代码创建菜单栏
QMenuBar* bar1 = new QMenuBar();
//将菜单栏添加到对象树中
this->setMenuBar(bar1);
//创建具体菜单
QMenu* menu1 = bar1->addMenu("开始");
//创建菜单子项
QAction* quit1 = menu1->addAction("退出游戏");
//退出游戏
connect(quit1,&QAction::triggered,this,[=](){
//关闭窗口
this->close();
});
也是实例化出一个自定义按钮对象,将正常显示图片和按下图片显示的地址作为参数传进函数
1.移动按钮对象至合适位置:
//创建返回主菜单按钮
//传进去两个参数,一个默认状态、一个选中状态
mybutton* mybutton2 = new mybutton(":/resour/08_1.png",":/resour/08_2.png");
//给他设置父亲,父亲为这个窗口
mybutton2->setParent(this);
//移动他的位置
mybutton2->move(this->width()-mybutton2->width()-10,this->height()-mybutton2->height()-10);
2.设置按钮对象参数
默认显示非按压时图片,与显示 开始游戏 按钮类似
这部分代码就是自定义按钮的构造函数,函数语句一样
只是知识传进去的参数不一样,显示的图片不一样
3.按下按钮,切换按钮图标
首先利用信号和槽的技术,将按钮与事件连接起来,但是暂时用不到
利用的是--重写鼠标按压与释放函数
按下鼠标时,重新设置自定义按钮的图标即可,只需要改几个参数
void mybutton::mousePressEvent(QMouseEvent* ev)
{
if(pressimgpath !="")
{
qDebug()<<"鼠标按压";
//如果不为空,则加载图片
//加载按压显示的图片
QPixmap pixmap1;
int pixnum = pixmap1.load(pressimgpath); //函数返回值为bool
pixmap1 = pixmap1.scaled(pixmap1.width()*0.18,pixmap1.height()*0.18);
//如果加载失败返回false,提示加载失败
if(!pixnum)
{
//此时的this,指的是mybutton
QString pixstr = QString("%1 图片加载失败").arg(this->pressimgpath);
qDebug()<setFixedSize(pixmap1.width(),pixmap1.height());
//设置不规则图片格式
//边界--0px---透明背景
this->setStyleSheet("QPushButton{border:3px;}");
//设置图片:给按钮添加图片
this->setIcon(QIcon(pressimgpath));
//设置图片大小
this->setIconSize(QSize(pixmap1.width(),pixmap1.height()));
}
//其他的事件交给父类处理
QPushButton::mousePressEvent(ev);
}
鼠标释放函数与此类似,便不再展示
4.切换回主页面的实现
与主页面切换到新页面不同,新页面返回主页面采用自定义触发信号的方式
这里重新解释一下主页面切换到新页面的原理:
主页面内实例了一个新页面类的对象,然后将自身隐藏,将新页面显示出来
但是新页面内无法创建主页面的对象,所以采用:主页面监听新页面是否发出返回信号,如果新页面触发了返回主页面的按钮,主页面则执行隐藏新页面,显示主页面的语句
新页面.h文件中的信号声明部分:
signals:
//返回到主页面的信号
//只需要声明,不需要实现
void returnnewload();
新页面.cpp文件内内按下返回按钮,则触发信号:
// 点击按钮,返回主菜单
connect(mybutton2,&QPushButton::clicked,this,[=](){
qDebug()<<"返回主页面";
//为了显示动画效果,延时300毫秒
QTimer::singleShot(300,this,[=](){
//触发返回主页面的信号
emit returnnewload();
});
});
主页面.cpp文件内监听新页面
//创建一个新类
newpage* newpage1 = new newpage(this);
//监听是否有返回信号
connect(newpage1,&newpage::returnnewload,this,[=](){
//如果有返回信号
//隐藏新类,显示本类
newpage1->hide();
this->show();
});
目标显示效果:页面切换时,窗口位置不变
原理:将旧页面的坐标信息传递给新页面即可
//将该类的几何坐标信息传递给新页面
newpage1->setGeometry(this->geometry());
在新页面内不仅有有返回主页面的按钮,同样有选择关卡的按钮
关卡按钮的生成是采用 for 循环实现的
按钮上的文字是通过便签实现的
通过调试函数+信号和槽技术来实现按压相应按钮显示第几关的提示
//创建关卡选择按钮--不实现跳转
//总共创建12个按钮,上面分别标上数字,点击会提示点击了几号关卡
for(int i=0;i<15;i++)
{
//创建自定义按钮
mybutton* selectbutton = new mybutton(":/resour/07.png");
//指定父类
selectbutton->setParent(this);
//移动至合适位置
//可以给自定义函数增加一个缩放系数,默认为1,有的话就进行缩放
selectbutton->move(150+(i%4)*150,60+(i/4)*130);
//检查一下是否可以点击
connect(selectbutton,&QPushButton::clicked,this,[=](){
//显示
qDebug()<
需要给标签设定大小、移动位置、文本对齐与穿透属性
穿透属性:是为了让鼠标可以穿过按钮上标签层,使得按钮可以捕获鼠标点击的功能
//在按钮上添加标号
//利用标签的技术
QLabel* labell = new QLabel(this); //不设置父类的话,显示不正常
//设置标签大小
labell->setFixedSize(selectbutton->width(),selectbutton->height());
//需要移动标签的位置
labell->move(150+(i%4)*150,60+(i/4)*130);
//设置显示内容
labell->setText(QString::number(i+1)); //这样的话 全部堆积在了左上角
//设置居中的格式 aligment:文本对齐、设置文本对齐
labell->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
//设置鼠标穿透,可以穿过标签到达按钮
labell->setAttribute(Qt::WA_TransparentForMouseEvents);
//设置一个文字类
QFont font1;
//设置字体
font1.setFamily("黑体");
//设置字号
font1.setPointSize(15);
//将该字体设置给标签
labell->setFont(font1);
打包发布部分主要有两个大步骤,首先生成打包需要的文件,其次利用第三方工具打包发布
首先生成release版本的exe文件,方法就是在写代码页面的左下角的debug更换为release,然后重
新编译一遍即可,并将其放置到一个文件夹内
windeployqt在安装目录中的 bin 文件夹内,记住这个命令
在放置exe文件的文件夹内,打开命令提示符,输入刚刚的命令
命令为:windeployqt 文件名.exe
就会生成一系列文件,主要是一些动态链接库
这些文件就是后续打包发布我们需要的文件
到这一步,就可以把所有的文件发给朋友,朋友点开
1.需要安装两个软件
第一个:空软件脚本化安装系统--NSIS
下载地址:https://nsis.sourceforge.io/Download
第二个:开发工具--HW VNIS Edit
下载地址:HM NIS Edit 2.03
然后参考这篇文章:
手把手教NIS Edit安装向导的使用 - kinglyboy - 博客园 (cnblogs.com)