有哪些文件 :
头文件:
1. auidio .h 语音识别 模块
2. camera.h 人脸识别登录模块
3. chooselevelscene.h 翻金币游戏的
4. dataconfig.h 翻金币游戏的 关卡 的数据
5.entry_mode.h 登录方式的界面类
6.luck_draw.h 开心一天的界面类
7.mainsence.h 翻金币游戏的背景图片的类
8.mainwindow.h 2048 游戏类
9. misic_display.h 音乐播放器的类
10.mycoin.h 翻金币游戏类 金币的构造类
11.mypushbutton.h 翻金币自定义类的 按钮
12. playscene.h 翻金币的音乐播放,成功判断类
13. register.h 账号密码的注册界面
14. sign_in.h 账号登录模块
15.sql.h 数据库sqlite3 模块
16.start_home.h 智能家具模块
17.tcp_image.h 远程监控模块
18.weather_forecast.h 天气预报模块
19. widget .h 主界面类
1. auidio .cpp 语音识别 模块
2. camera.cpp 人脸识别登录模块
3. chooselevelscene.cpp 翻金币游戏的
4. dataconfig.cpp 翻金币游戏的 关卡 的数据
5.entry_mode.cpp 登录方式的界面类
6.luck_draw.cpp 开心一天的界面类
7.mainsence.cpp 翻金币游戏的背景图片的类
8.mainwindow.cpp 2048 游戏类
9. misic_display.cpp 音乐播放器的类
10.mycoin.cpp 翻金币游戏类 金币的构造类
11.mypushbutton.cpp 翻金币自定义类的 按钮
12. playscene.h 翻金币的音乐播放,成功判断类
13. register.h 账号密码的注册界面
14. sign_in.h 账号登录模块
15.sql.h 数据库sqlite3 模块
16.start_home.h 智能家具模块
17.tcp_image.h 远程监控模块
18.weather_forecast.h 天气预报模块
19. widget .h 主界面类
20.mian.cpp
代码:
1. auidio .h 语音识别 模块 (//密钥不给,自己百度云)
#ifndef AUDIO_H
#define AUDIO_H
#include
/******** 音频相关类 *********/
#include //音频属性类
#include //音频参数
#include //音频输入
#include //音频输出
/******** 文件相关类 **********/
#include
/******** 文字转语音类 ********/
#include
/******* 网络相关类 ****/
#include /** 网络访问类 ***/
#include /** 网络数据结果类 ***/
/******* QJSON 相关类 *****/
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Audio; }
QT_END_NAMESPACE
class Audio : public QWidget
{
Q_OBJECT
public:
Audio(QWidget *parent = nullptr);
~Audio();
void audio_display(QString a);//文字播放
void Event_judgment(QString a);//事件判断
signals://信号
void audio_hide1();//当前界面隐藏,主界面显示信号
//void enter_audio();//进入语音识别
void enter_luck_draw1();//进入快乐一天
void enter_music1();//进入音乐播放
void enter_home1();//进入智能家具
void enter_tcp1();//进入远程监控
void enter_weather1();//进入天气预报
void control_home(int a);
void control_music_open();
void control_music_close();
void control_shangyishou();
void control_xiayishou();
private:
Ui::Audio *ui;
QAudioInput *m_AudioInput;
QAudioOutput *m_AudioOutput;
QFile *m_file;
QTextToSpeech *m_speech;//文字转语音对象
QNetworkAccessManager *m_http; /**网络访问对象 **/
QNetworkAccessManager *m_music;// 英语对象
/***** 百度人脸库秘钥 ****/
QString AppID = "";//密钥不给,自己百度云
QString API_Key = "";
QString Secret_Key = "";
QString access_token = "";
QMediaPlayer* media_player;
public slots:
void slot_pushButton_input();
void slot_pushButton_output();
void slot_AudioOutput(QAudio::State state);
void slot_pushButton_transition();
void slot_http_finished(QNetworkReply* Reply);
void slot_music_finished(QNetworkReply* Reply);
void slot_pushButton_discern();
void slot_surface_show();//界面显示槽函数函数
void bofang_liu();//播放小刘同学
private slots:
void on_pushButton_tianqi_clicked();
void on_pushButton_jiaju_clicked();
void on_pushButton__clicked();
void on_pushButton_yinyue_clicked();
void on_pushButton_kuaile_clicked();
void on_pushButton_surface_clicked();
};
#endif // AUDIO_H
2. camera.h 人脸识别登录模块 //密钥不给,自己百度云
#ifndef CAMERA_H
#define CAMERA_H
#include
/******* 摄像头相关类 *****/
#include /*** 摄像头类 ***/
#include /*** 系统摄像头属性类 ***/
#include /*** 用于记录摄像头数据的类 ***/
#include /*** debug 调试类 ****/
/******* 网络相关类 ****/
#include /** 网络访问类 ***/
#include /** 网络数据结果类 ***/
/******* QJSON 相关类 *****/
#include
#include
#include
#include //消息类
#include
#include "widget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Camera; }
QT_END_NAMESPACE
class Camera : public QMainWindow
{
Q_OBJECT
public:
Camera(QWidget *parent = nullptr);
~Camera();
private:
Ui::Camera *ui;
QCamera *m_Camera; /*** 摄像机类对象 ***/
QCameraImageCapture *CameraImageCapture; /*** 用于记录摄像头数据的类 ***/
QNetworkAccessManager *m_http; /**网络访问对象 **/
/***** 百度人脸库秘钥 ****/
QString AppID = "";
QString API_Key = "";
QString Secret_Key = "";
QString access_token = "";
int pixmap_init=0;//图片是否拍摄
Widget *ddd;
public slots:
void slot_pushButton_camrae_open();
void slot_CameraImageCapture(int id,QImage image);
void slot_pushButton_capture();
void slot_http_finished(QNetworkReply* Reply);
void slot_pushButton_regiset();
void slot_pushButton_find();
signals:
camera_open();//打开摄像头
};
#endif // CAMERA_H
3. chooselevelscene.h 翻金币游戏的
#ifndef CHOOSELEVELSCENE_H
#define CHOOSELEVELSCENE_H
#include
#include "playscene.h"
class ChooseLevelScene : public QMainWindow
{
Q_OBJECT
public:
explicit ChooseLevelScene(QWidget *parent = 0);
//重写绘画事件
void paintEvent(QPaintEvent *);
//游戏场景的对象指针
PlayScene * paly = NULL;
signals:
//写一个自定义的信号,告诉主场景,点击了返回
void chooseSceneBack();
public slots:
};
#endif // CHOOSELEVELSCENE_H
4. dataconfig.h 翻金币游戏的 关卡 的数据
#ifndef DATACONFIG_H
#define DATACONFIG_H
#include
#include //STL 地图
#include //STL 动态数组
class dataconfig : public QObject
{
Q_OBJECT
public:
explicit dataconfig(QObject *parent = 0);
QMap > >mData;//一个地图
//地图的 key 是 int 类型 value 是 int 的二维的数组QVector< QVector >
signals:
public slots:
};
#endif // DATACONFIG_H
5.entry_mode.h 登录方式的界面类
#ifndef ENTRY_MODE_H
#define ENTRY_MODE_H
#include
#include "camera.h" //人脸识别
#include "sign_in.h" // 账号密码
namespace Ui {
class Entry_mode;
}
class Entry_mode : public QWidget
{
Q_OBJECT
public:
explicit Entry_mode(QWidget *parent = 0);
~Entry_mode();
Camera * a1;
Sign_in * a2;
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::Entry_mode *ui;
};
#endif // ENTRY_MODE_H
6.luck_draw.h 开心一天的界面类
#ifndef LUCK_DRAW_H
#define LUCK_DRAW_H
#include //基类
#include //画家类
#include //QRadialGradient类与QBrush一起使用来指定径向渐变刷。
#include
/*QPainterPath用途:它是由一些图形如曲线、矩形、椭圆组成的对象。主要的用途是,能保存已经绘制好的图形。
* 实现图形元素的构造和复用;图形状只需创建一次,然后调用QPainter::drawPath()函数多次绘制。
* painterpath可以加入闭合或不闭合的图形(如:矩形、椭圆和曲线)。QPainterPath 可用于填充,
* 描边,clipping。
*/
#include //定时器
#include //调试输出
#include //鼠标事件
#include //按钮
#include //时间
#include // 标签类
#include //LineEdit 编辑器的 类
#include // map 类
#include //map 迭代器
#include
#define MAX_CIRCLE 1800
namespace Ui {
class luck_draw;
}
class luck_draw : public QWidget
{
Q_OBJECT
public:
explicit luck_draw(QWidget *parent = 0);
~luck_draw();
signals://信号
void luck_hide2();//当前界面隐藏,主界面显示信号
void enter_audio2();//进入语音识别
//void enter_luck_draw();//进入快乐一天
void enter_music2();//进入音乐播放
void enter_home2();//进入智能家具
void enter_tcp2();//进入远程监控
void enter_weather2();//进入天气预报
private:
Ui::luck_draw *ui;
void gradientArc(QPainter *painter,int radius,int startAngle,int angleLength,int arcHeight,QRgb color);
//painter 画家类的对象 radius 半径 startAngle 起始角度 angleLength角度长度 arcHeight弧形高度 color颜色
public slots:
void updatePaint();
void btnClicked();
void reResult(int re);
void stopRotate();
void slot_surface_show();//界面显示槽函数函数
signals:
void sigResult(int re);//信号
private:
int m_nRotationAngle;//旋转角度
int m_nRo;
quint32 m_T;
QString m_Re;
QTimer *m_timer;//定时器1
QTimer *timer;//定时器2
int m_i;
QPushButton *m_btn;
bool isDefault;
enum Awards{
Spe = 3,
First = 7,
Second = 5,
Third = 2,
Luck_Fir = 6,
Luck_Sec = 1,
ThanK_Fir = 4,
Thank_Sec = 0,
};
Awards m_award;
QLabel *m_labTr;
QLabel *m_labRe;
QLineEdit *m_ldeRe;
QMap m_map;
QMap returnResult(int re);
static QString showAwards(Awards award);
void stopInit();
int getRand();//获取奖项 的编码,
protected:
void paintEvent(QPaintEvent *);// 重写绘图事件
private slots:
void on_pushButton_tianqi_clicked();
void on_pushButton_jiaju_clicked();
void on_pushButton_jiankong_clicked();
void on_pushButton_yinyue_clicked();
void on_pushButton_yuyin_clicked();
void on_pushButton_surface_clicked();
};
#endif // LUCK_DRAW_H
7.mainsence.h 翻金币游戏的背景图片的类
#ifndef MAINSENCE_H
#define MAINSENCE_H
#include
#include
#include
#include
namespace Ui {
class Mainsence;
}
class Mainsence : public QMainWindow
{
Q_OBJECT
public:
explicit Mainsence(QWidget *parent = 0);
~Mainsence();
//重新paintEvent 事件, 画背景图
void paintEvent(QPaintEvent *);//括号里面是数据类型,不需要写参数,没事
ChooseLevelScene * chooseScene =NULL;
private:
Ui::Mainsence *ui;
};
#endif // MAINSENCE_H
8.mainwindow.h 2048 游戏类
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define NEWBLOCK rand()%2+1 // 随机新方块的值
#define NEWPOINT rand()%EDGE // 随机新方块的坐标
#define EDGE 4 // 4x4棋盘
#define WINWIDTH 600 //窗口宽度
#define WINHEIGHT 800 // 窗口高度
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *ui;
int Game[EDGE][EDGE];
int TempGame[EDGE][EDGE];
int tempscore=0;
int score=0;
int temprun=0;
int run=0;
int presstype=0;
int gametype=0;
bool test=false;
bool OK;
bool gameover=false;
QString inputInfo;
QString tempInfo;
QString gmode="Classic";
void keyPressEvent(QKeyEvent *);
void paintEvent(QPaintEvent *event);
void newGame();
void goUp();
void goDown();
void goLeft();
void goRight();
void newBlock();
void setTempGameArray();
void setGameArray();
void moveSound();
void backGroundSound();
void timeCounter();
bool ifArraySame();
bool ifWin();
bool ifFail();
bool ifFull();
};
#endif // MAINWINDOW_H
9. misic_display.h 音乐播放器的类
#ifndef MISIC_DISPLAY_H
#define MISIC_DISPLAY_H
#include
#include //打开音乐
#include //播放音乐
#include
#include
#include
#include
namespace Ui {
class Misic_display;
}
class Misic_display : public QWidget
{
Q_OBJECT
public:
signals://信号
void music_hide3();//当前界面隐藏,主界面显示信号
void enter_audio3();//进入语音识别
void enter_luck_draw3();//进入快乐一天
//void enter_music();//进入音乐播放
void enter_home3();//进入智能家具
void enter_tcp3();//进入远程监控
void enter_weather3();//进入天气预报
public:
explicit Misic_display(QWidget *parent = 0);
~Misic_display();
void setVolume(qint8 a);//控制音量
void fileInit();
void music_display_1(int vlaue);//播放本地资源
void music_display_2(int vlaue);//播放后来加进来的 音乐
void GetMusicName();//获取播放列表的音乐名字
void Load_music();//加载播放歌曲的路径
void MusicPlaybackMode();//音乐播放模式,对应的音乐结束的接下来的播放对象
private slots:
void on_pushButton_1_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_5_clicked();
void on_pushButton_4_clicked();
void on_listWidget_doubleClicked(const QModelIndex &index);
void setHide();//设置界面隐藏
void setShow();//设置界面显示
void slot_surface_show();//界面显示槽函数函数
void on_pushButton_yuyin_clicked();
void on_pushButton_jiaju_clicked();
void on_pushButton_jiankong_clicked();
void on_pushButton_tioanqi_clicked();
void on_pushButton_kuaile_clicked();
void on_pushButton_surface_clicked();
private:
Ui::Misic_display *ui;
QMediaPlayer * mediaPayer;//控制文件的播放
QStringList musicList_name;//播放歌曲的名字
QStringList musicList;//加载播放列表的路径
int display_number=0;//播放歌曲的第n 首
};
#endif // MISIC_DISPLAY_H
10.mycoin.h 翻金币游戏类 金币的构造类
#ifndef MYCOIN_H
#define MYCOIN_H
#include
#include
#include
#include
#include
class MyCoin : public QPushButton
{
Q_OBJECT
public:
//explicit MyCoin(QWidget *parent = 0);
//参数表示 传进来的金币路径 还是银币路径
MyCoin(QString btnImg);
//金币的属性
int posX;//x坐标
int posY;//y坐标
bool flag;//正反的标志
void changeFlag();//改变金币的状态
QTimer *timer1;//正面翻反面的定时器
QTimer *timer2;//反面翻正面的定时器
int min=1;//图片的最小号码数
int max=8;//图片的最大号码数
//执行动画 标志
bool isAnimation = false;// 判断他是否在执行翻转的操作 防止用户狂点的行为
//重写 鼠标按下的事件
void mousePressEvent(QMouseEvent * e);
//设置一个是否可以翻转的标志
bool ispaly=true;
signals:
public slots:
};
#endif // MYCOIN_H
11.mypushbutton.h 翻金币自定义类的 按钮
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include
#include
#include
#include
#include
class mypushbutton : public QPushButton
{
Q_OBJECT
public:
//explicit mypushbutton(QWidget *parent = 0);
//构造函数 参数1 正常显示的图片路径 参数2 按下后显示的图片的路径
mypushbutton(QString normalImg,QString pressImg = "");
//成员属性 保存用户传入的默认显示路径 以及按下后显示的图片路径
QString normaLImgPath;
QString pressImgPath;
//弹跳特效
void zoom1();//向下跳
void zoom2();//向上跳
//重写按钮 按下 和 释放事件
void mousePressEvent(QMouseEvent * e);//按下
void mouseReleaseEvent(QMouseEvent * e);//释放
signals:
public slots:
};
#endif // MYPUSHBUTTON_H
12. playscene.h 翻金币的音乐播放,成功判断类
#ifndef PLAYSCENE_H
#define PLAYSCENE_H
#include
#include "mycoin.h"
class PlayScene : public QMainWindow
{
Q_OBJECT
public:
//explicit PlayScene(QWidget *parent = 0);
PlayScene(int levelNum);//构造函数
int levelIndex;//内部成员属性;记录所选的关卡数字
//重写paintEvent事件
void paintEvent(QPaintEvent * );
int gameArray[4][4];//二维数组 维护每个关卡的具体数据
//下面这个指针数组是用来存储 金币的 就是下一个关卡的所有的金币对象
MyCoin * coinBtn[4][4];//维护上一个数组的数据正常
//是否胜利的标志
bool isWin;
signals:
void chooseSceneBack();
public slots:
};
#endif // PLAYSCENE_H
13. register.h 账号密码的注册界面
#ifndef REGISTER_H
#define REGISTER_H
#include
#include //数据库
#include //数据库执行类
#include //数据库错误信息
#include //按键封组 主要是 sex 哪里
#include //输出头文件
#include "sql.h"
#include /*** 消息对话框 ***/
namespace Ui {
class Register;
}
class Register : public QWidget
{
Q_OBJECT
public:
explicit Register(QWidget *parent = 0);
~Register();
private:
Ui::Register *ui;
QButtonGroup *block1;//私有的分组变量
QSqlDatabase db; /** 数据库句柄 **/
public slots:
void register_return_show();//当前界面显示
void register_return_hide();//当前界面隐藏
QString getUser();//获取账号信息
QString getPassword();//获取密码信息
QString getSex();//返回性别信息
int getAge();//返回年龄
signals:
void regsiter_close();//窗口关闭信号
public:
void Init();//初始化函数, 功能: 建立信号的连接,(显示密码部分) (登录,注册按) 占位符的提示语句
QSqlDatabase* getQsqlDatabase();//获取数据库的句柄
};
#endif // REGISTER_H
14. sign_in.h 账号登录模块
#ifndef SIGN_IN_H
#define SIGN_IN_H
#include
#include //数据库
#include //数据库执行类
#include //数据库错误信息
#include "register.h"//注册类 注册界面
#include //输出头文件
#include "widget.h"
namespace Ui {
class Sign_in;
}
class Sign_in : public QWidget
{
Q_OBJECT
public:
explicit Sign_in(QWidget *parent = 0);
~Sign_in();
private:
Ui::Sign_in *ui;
Register * register1;//包含一个注册类
Widget * widget1;//包含一个主界面的类
public:
QSqlDatabase getSql();//获取当前的数据库
public slots://槽函数
void sign_in_return_show();//显示当前界面显示函数
void sign_in_return_hide();//当前函数隐藏函数
public:
void lineEdit_pass_open();//开启密码保护
void lineEdit_pass_close();//关闭密码保护
void Init();//初始化函数, 功能: 建立信号的连接,(显示密码部分) (登录,注册按) 占位符的提示语句
QString getUser();//获取账号信息
QString getPassword();//获取密码信息
};
#endif // SIGN_IN_H
15.sql.h 数据库sqlite3 模块
#ifndef SQL_H
#define SQL_H
#include
#include
#include //数据库
#include //数据库执行类
#include //数据库错误信息
class People
{
public:
People(QString user="",QString passwordd="",QString sex="",QString age=0):m_user(user),m_passWord(passwordd),m_sex(sex),m_age(age){}//构造函数
~People(){}//析构函数
QString m_user;
QString m_passWord;
QString m_sex;
QString m_age;
public:
bool operator ==(const People & a) const//重载 等于运算符号
{
if(this->m_user==a.m_user)
{
if(this->m_passWord==a.m_passWord)
{
if(this->m_sex==a.m_sex)
{
if(this->m_age==a.m_age)
{
return true;
}
}
}
}
return false;
}
};
class Sql : public QWidget//数据库的函数
{
Q_OBJECT
public:
explicit Sql(QWidget *parent = 0);
signals:
public slots:
public:
void Init(QSqlDatabase &db);//初始化函数, 主要是 实例化对象 建立数据库, 第二个,
bool addSql(People a,QSqlDatabase &db);//插入数据
bool deleteSql(People a,QSqlDatabase &db);//删除数据
bool checkSql(People a,QSqlDatabase &db);//检测是否含有这个数据
People querySql(QString value,QSqlDatabase &db);//根据账号 返回查询的数据
void printSql(QSqlDatabase &db);//打印所有的数据
private:
};
#endif // SQL_H
16.start_home.h 智能家具模块
#ifndef START_HOME_H
#define START_HOME_H
#include
/******** 音频相关类 *********/
#include //音频属性类
#include //音频参数
#include //音频输入
#include //音频输出
/******** 文件相关类 **********/
#include
/******** 文字转语音类 ********/
#include
#include
/******* 网络相关类 ****/
#include /** 网络访问类 ***/
#include /** 网络数据结果类 ***/
/******* QJSON 相关类 *****/
#include
#include
#include
#include /*** 消息对话框 ***/
#include /*** 颜色对话框 ***/
#include
namespace Ui {
class start_home;
}
class start_home : public QMainWindow
{
Q_OBJECT
public:
explicit start_home(QWidget *parent = nullptr);
~start_home();
signals://信号
void home_hide4();//当前界面隐藏,主界面显示信号
void enter_audio4();//进入语音识别
void enter_luck_draw4();//进入快乐一天
void enter_music4();//进入音乐播放
//void enter_home();//进入智能家具
void enter_tcp4();//进入远程监控
void enter_weather4();//进入天气预报
private slots:
//灯的开关按钮
void on_pushButton_living_room_clicked();
void on_pushButton_master_bedroom_clicked();
void on_pushButton_secondary_bedroom_clicked();
void on_pushButton_kitchen_clicked();
void on_pushButton_wc_clicked();
void on_pushButton_corridor_clicked();
void on_pushButton_balcony_clicked();
void slot_surface_show();//界面显示槽函数函数
//语音
// void slot_pushButton_input();
// void slot_pushButton_output();
void on_pushButton_yuyin_clicked();
void on_pushButton_tianqi_clicked();
void on_pushButton_jiankong_clicked();
void on_pushButton_yinyue_clicked();
void on_pushButton_kuaile_clicked();
void on_pushButton_surface_clicked();
private:
Ui::start_home *ui;
QTcpSocket * TcpSocket;//套接字
bool lianjie;
public slots:
void slot_TcpSocket_readyRead();//读取函数
void send_number(int a);//发送信号
void receive_number(int a);//接收信号做出反应
void slot_connected();//连接成功
void slot_lianjie();
};
#endif // START_HOME_H
17.tcp_image.h 远程监控模块
#ifndef TCP_IMAGE_H
#define TCP_IMAGE_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace Ui {
class TCP_image;
}
class TCP_image : public QWidget
{
Q_OBJECT
public:
explicit TCP_image(QWidget *parent = 0);
~TCP_image();
signals://信号
void TCP_hide5();//当前界面隐藏,主界面显示信号
void enter_audio5();//进入语音识别
void enter_luck_draw5();//进入快乐一天
void enter_music5();//进入音乐播放
void enter_home5();//进入智能家具
//void enter_tcp();//进入远程监控
void enter_weather5();//进入天气预报
public slots:
void slot_TcpSocket_readyRead();
public:
void analysis_Json(QByteArray data);//解析JSON
void analysis_int(QJsonObject obj);
void analysis_image(QJsonObject obj);
void analysis_Qstring(QJsonObject obj);
private slots:
void on_pushButton_clicked();
void on_pushButton_3_clicked();
void slot_surface_show();//界面显示槽函数函数
void on_pushButton_yuyin_clicked();
void on_pushButton_jiaju_clicked();
void on_pushButton_tianqi_clicked();
void on_pushButton_yinyue_clicked();
void on_pushButton_kuaile_clicked();
void on_pushButton_surface_clicked();
private:
Ui::TCP_image *ui;
QTcpSocket *TcpSocket;
bool TCP_state;//TCP 连接的状态
bool display_state;//视屏播放的状态
};
#endif // TCP_IMAGE_H
18.weather_forecast.h 天气预报模块
#ifndef WEATHER_FORECAST_H
#define WEATHER_FORECAST_H
#include
#include
#include //将所有的网络头文件 直接加入
#include
#include
#include
#include
#include
#include //时间类
#include //定时器
#include
namespace Ui {
class weather_forecast;
}
class weather_forecast : public QWidget
{
Q_OBJECT
public:
explicit weather_forecast(QWidget *parent = 0);
~weather_forecast();
signals://信号
void weather_hide6();//当前界面隐藏,主界面显示信号
void enter_audio6();//进入语音识别
void enter_luck_draw6();//进入快乐一天
void enter_music6();//进入音乐播放
void enter_home6();//进入智能家具
void enter_tcp6();//进入远程监控
private:
Ui::weather_forecast *ui;
QNetworkAccessManager * http;
QTimer timer;//定时器
public:
void set_label_1(int value);//设置图片
void set_label_2(int value);//设置图片
void set_label_3(int value);//设置图片
void get_forecast(QNetworkReply * reply);//获取今天的天气预报
void get_forecast_three(QNetworkReply * reply);//获取三天的天气预报
public slots:
void set_hour_min();//设置现在的时间
void setHide();//设置这个界面隐藏
void setShow();//设置这个界面显示
void slot_surface_show();//界面显示槽函数函数
private slots:
void on_pushButton_yuyin_clicked();
void on_pushButton_jiaju_clicked();
void on_pushButton_jiankong_clicked();
void on_pushButton_yinyue_clicked();
void on_pushButton_kuaile_clicked();
void on_pushButton_surface_clicked();
};
#endif // WEATHER_FORECAST_H
19. widget .h 主界面类
#ifndef WIDGET_H
#define WIDGET_H
#include
#include //数据库
#include //数据库执行类
#include //数据库错误信息
#include //输出头文件
#include "audio.h"//小刘同学
#include "luck_draw.h"//快乐一天
#include "misic_display.h"//音乐播放
#include "weather_forecast.h"//天气预报
#include "start_home.h"//家具控制
#include "tcp_image.h"//远程监控
#include "mainsence.h"//游戏的头文件
#include "mainwindow.h"//游戏 2048 文件
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_3_clicked();//开心一天
void on_pushButton_clicked();//天气预报
void on_pushButton_2_clicked();//音乐播放
void on_pushButton_4_clicked();//监控
void on_pushButton_5_clicked();//家具控制
void on_pushButton_6_clicked();//小刘同学
void slot_widge_show();//主界面显示函数
void on_pushButton_7_clicked();
void on_pushButton_2048_clicked();
private:
Ui::Widget *ui;
Audio * audio;//语音识别的对象
luck_draw * luck;//幸运转盘
Misic_display *music;//音乐播放器
weather_forecast * weather;//天气预报
start_home * home;//家具控制
TCP_image * tcp;//远程监控
Mainsence *www;//游戏
MainWindow * kkk;//2048 游戏
int kkkk=0;
};
#endif // WIDGET_H
1. auidio .cpp 语音识别 模块
#include "audio.h"
#include "ui_audio.h"
#include
Audio::Audio(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Audio)
{
ui->setupUi(this);
/******* 获取系统可用的音频设备 ********/
QList AudioDevice_Outputs = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
for(int i = 0; i < AudioDevice_Outputs.size() ; i++)
{
QString name = AudioDevice_Outputs[i].deviceName();
ui->comboBox_audio_ouput->addItem(name);
}
QList AudioDevice_Inputs = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
for(int i = 0; i < AudioDevice_Inputs.size() ; i++)
{
QString name = AudioDevice_Inputs[i].deviceName();
ui->comboBox_audio_input->addItem(name);
}
/****** 配置音频参数 ******/
QAudioFormat format;
format.setSampleRate(16000); //设置采样率:16000MHz
format.setChannelCount(1); //设置采集通道数:1通道
format.setSampleSize(16); //设置样本大小:16比特
format.setCodec("audio/pcm"); //设置录音格式为:pcm格式
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); /** 使用默认输入 ***/
if(info.isFormatSupported(format) == false) //检测配置是否支持该音频设备
{
format = info.nearestFormat(format); //只用最接近配置的音频配置
}
/****** 申请音频空间 *****/
m_AudioInput = new QAudioInput(format,this);
m_AudioOutput = new QAudioOutput(format,this);
/****** 录音 ******/
connect(ui->pushButton_input,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_input()));
connect(ui->pushButton_output,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_output()));
connect(m_AudioOutput,SIGNAL(stateChanged(QAudio::State)),this,SLOT(slot_AudioOutput(QAudio::State)));
/***** 打印电脑的TTS语音引擎 *****/
QStringList TextToSpeechs = QTextToSpeech::availableEngines();
for(QString text : TextToSpeechs)
{
qDebug() << "语音引擎:" << text << endl;
}
qDebug()<<"没有";
m_speech = new QTextToSpeech(this);
qDebug()<<"1111";
connect(ui->pushButton_transition,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_transition()));
/****** HTTP网络访问类初始化 *****/
m_http = new QNetworkAccessManager(this);
m_music = new QNetworkAccessManager(this);//文本转音乐实列化对象
media_player = new QMediaPlayer(this);//mp3播放
connect(m_music,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_music_finished(QNetworkReply*)));
connect(m_http,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_http_finished(QNetworkReply*)));
QString url("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2&");
url = url.arg(API_Key,Secret_Key);
m_http->get(QNetworkRequest(QUrl(url))); //获取 access_token
connect(ui->pushButton_discern,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_discern()));
}
void Audio::slot_surface_show()//界面显示槽函数函数
{
this->show();//当前界面显示
}
void Audio::slot_music_finished(QNetworkReply* Reply)
{
}
void Audio::slot_pushButton_discern()
{
/***** 读取音频文件 *****/
m_file = new QFile("./录音.wav");
m_file->open(QIODevice::ReadWrite);
if(m_file->isOpen() == false){ //打开失败
delete m_file;
return ;
}
QByteArray requestData = m_file->readAll(); //读取文件所有内容
m_file->close();;;;;
QString buf = requestData.toBase64(); //转码 BASE 64
/****** 组装网址 **************/
QUrl url("http://vop.baidu.com/server_api");
/****** 组装JSON *************/
QJsonObject json;
json["format"] = "pcm";
json["rate"] = 16000;
json["dev_pid"] = 1537;
json["channel"] = 1;
json["token"] = access_token;
json["cuid"] = "q12993";
json["len"] = requestData.size(); //语音文字真是的byte长度
json["speech"] = buf;
/****** 设置头部 **********/
QNetworkRequest Request(url);
Request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
QByteArray send_json = QJsonDocument(json).toJson();
m_http->post(Request,send_json);
}
void Audio::slot_pushButton_transition()
{
QString text=ui->lineEdit_Text->text();
QByteArray url="http://tsn.baidu.com/text2audio?";
url.append(QString("&lan=zh&cuid= MAC 物理地址,自己的 &ctp=1&tok="));
url.append(QUrl::toPercentEncoding(access_token));//这个后面还可以加别的参数 声音, 列表里面的东西
url.append("&tex=");
url.append(QUrl::toPercentEncoding(text));
qDebug()<setMedia(QUrl::fromLocalFile(url));
media_player->play();
}
void Audio::audio_display(QString a)//文字播放
{
QByteArray url="http://tsn.baidu.com/text2audio?";
url.append(QString("&lan=zh&cuid= MAC 物理地址,自己的 &ctp=1&tok="));
url.append(QUrl::toPercentEncoding(access_token));//这个后面还可以加别的参数 声音, 列表里面的东西
url.append("&tex=");
url.append(QUrl::toPercentEncoding(a));
qDebug()<setMedia(QUrl::fromLocalFile(url));
media_player->play();
}
void Audio::bofang_liu()
{
QString name = QString("主人请尽情的吩咐小刘,让小刘看到主人的心,小刘一直深爱着主人,来和小刘一起玩耍吧! 主人。。。。我要被玩坏了。");
audio_display(name);
}
void Audio::Event_judgment(QString result)//事件判断
{
/***** 判断结果 *****/
if(result.contains("打开") == true)
{
if(result.contains("客厅灯") == true)
{
audio_display("客厅灯已打开");
emit control_home(1);
}
else if(result.contains("主卧灯") == true)
{
audio_display("主卧灯已打开");
emit control_home(3);
}
else if(result.contains("次卧灯") == true)
{
audio_display("次卧灯已打开");
emit control_home(5);
}
else if(result.contains("厨房灯") == true)
{
audio_display("厨房灯已打开");
emit control_home(7);
}
else if(result.contains("厕所灯") == true)
{
audio_display("厕所灯已打开");
emit control_home(9);
}
else if(result.contains("走廊灯") == true)
{
audio_display("走廊灯已打开");
emit control_home(11);
}
else if(result.contains("阳台灯") == true)
{
audio_display("阳台灯已打开");
emit control_home(13);
}
}
else if(result.contains("关闭") == true)
{
if(result.contains("客厅灯") == true)
{
audio_display("客厅灯已关闭");
emit control_home(2);
}
else if(result.contains("主卧灯") == true)
{
audio_display("主卧灯已关闭");
emit control_home(4);
}
else if(result.contains("次卧灯") == true)
{
audio_display("次卧灯已关闭");
emit control_home(6);
}
else if(result.contains("厨房灯") == true)
{
audio_display("厨房灯已关闭");
emit control_home(8);
}
else if(result.contains("厕所灯") == true)
{
audio_display("厕所灯已关闭");
emit control_home(10);
}
else if(result.contains("走廊灯") == true)
{
audio_display("走廊灯已关闭");
emit control_home(12);
}
else if(result.contains("阳台灯") == true)
{
audio_display("阳台灯已关闭");
emit control_home(14);
}
}
else if(result.contains("播放音乐")== true|| result.contains("打开音乐")== true)
{
audio_display("音乐已经打开");
emit control_music_open();
}
else if(result.contains("停止播放")== true || result.contains("关闭音乐")== true)
{
emit control_music_close();
audio_display("音乐已经停止播放");
}
else if(result.contains("上一首")== true)
{
emit control_music_close();
audio_display("上一首已经播放");
emit control_shangyishou();
}
else if(result.contains("下一首")== true)
{
emit control_music_close();
audio_display("下一首已经播放");
emit control_xiayishou();
}
}
void Audio::slot_http_finished(QNetworkReply *Reply)
{
// 响应的状态码为 200 , 表示请求成功
int stat = Reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QByteArray Reply_data = Reply->readAll();
qDebug() << "Reply_data = " << Reply_data << endl;
ui->textEdit_JSON->setText(QJsonDocument::fromJson(Reply_data).toJson()); //将其转为JSON字符串
if(stat == 200) /*** 成功数据 ***/
{
//获取响应信息
QByteArray byteArray = QString(Reply_data).toUtf8();
QJsonDocument JsonDocument = QJsonDocument::fromJson(byteArray); //转为JSON格式字符串
if(JsonDocument.isObject() == true)
{
QJsonObject JsonObject = JsonDocument.object();
if(JsonObject.find("access_token") != JsonObject.end())
{
access_token = JsonObject["access_token"].toString();
qDebug() << "access_token:" << access_token << endl;
}
if(JsonObject.find("err_msg") != JsonObject.end() && JsonObject.find("result") != JsonObject.end())
{
QJsonArray JsonArray = JsonObject["result"].toArray();
QString result = JsonArray[0].toString();
ui->lineEdit_Json->setText(result);
Event_judgment(result);
}
}
}
}
Audio::~Audio()
{
delete ui;
}
void Audio::slot_pushButton_input() /*** 录制音频 ***/
{
if(ui->pushButton_input->text() == "开始录制")
{
m_file = new QFile("./录音.wav");
m_file->open(QIODevice::ReadWrite | QIODevice::Truncate);
if(m_file->isOpen() == false){ //打开失败
delete m_file;
return ;
}
m_AudioInput->start(m_file);
ui->pushButton_input->setText("停止录制");
}
else if(ui->pushButton_input->text() == "停止录制")
{
m_AudioInput->stop();//关闭录制
m_file->close(); //关闭文件
ui->pushButton_input->setText("开始录制");
}
}
void Audio::slot_pushButton_output()
{
m_file = new QFile("./录音.wav");
m_file->open(QIODevice::ReadWrite);
if(m_file->isOpen() == false){ //打开失败
delete m_file;
return ;
}
m_AudioOutput->start(m_file);
}
void Audio::slot_AudioOutput(QAudio::State state)
{
if(state == QAudio::IdleState)
{
m_AudioOutput->stop();
delete m_file;
}
}
void Audio::on_pushButton_tianqi_clicked()
{
this->hide();
emit enter_weather1();//进入天气预报
}
void Audio::on_pushButton_jiaju_clicked()
{
this->hide();
emit enter_home1();//进入智能家具
}
void Audio::on_pushButton__clicked()
{
this->hide();
emit enter_tcp1();//进入远程监控
}
void Audio::on_pushButton_yinyue_clicked()
{
this->hide();
emit enter_music1();//进入音乐播放
}
void Audio::on_pushButton_kuaile_clicked()
{
this->hide();
emit enter_luck_draw1();//进入快乐一天
}
void Audio::on_pushButton_surface_clicked()
{
this->hide();
emit audio_hide1();//当前界面隐藏,主界面显示信号
}
2. camera.cpp 人脸识别登录模块
#include "camera.h"
#include "ui_camera.h"
#include
#include
Camera::Camera(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::Camera)
{
ui->setupUi(this);
/**** 获取系统可用摄像头列表 ****/
QList cameras = QCameraInfo::availableCameras();//获取可用摄像头设备列表
int index = cameras.size();
for(int i=0;icomboBox->addItem(cameras.at(i).description()); //将摄像头添加到UI界面摄像头列表中
}
}
connect(ui->pushButton_camrae_open,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_camrae_open()));
connect(ui->pushButton_capture,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_capture()));
/****** HTTP网络访问类初始化 *****/
m_http = new QNetworkAccessManager(this);
connect(m_http,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_http_finished(QNetworkReply*)));
QString url("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2&");
url = url.arg(API_Key,Secret_Key);
m_http->get(QNetworkRequest(QUrl(url)));
/****** 按钮发送 http 的 post 请求 ******/
connect(ui->pushButton_regiset,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_regiset()));
connect(ui->pushButton_find,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_find()));
connect(this,SIGNAL(camera_open()),this,SLOT(slot_pushButton_camrae_open()));
}
void Camera::slot_pushButton_find()//百度云寻找 人脸
{
/**** 获取用户输入的信息 *****/
QString group = ui->comboBox_group->currentText();
QString ID = ui->lineEdit_ID->text();
QString name = ui->lineEdit_user_info->text();
if(pixmap_init==0)
{
QMessageBox::warning(this,"错误警告","没有拍照,无法查询","确认");
return;
}
/***** 组装http访问百度 *****/
QString baidu = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=%1";
QString url = baidu.arg(access_token);
/**** 图片转码为BASE64编码 ****/
QImage Image = ui->label_pixmap->pixmap()->toImage(); //获取 QLabel 标签的图片
QByteArray data; /*** 用于存储图片的二进制数据 ***/
QBuffer buffer(&data); /*** 将 data 作为缓冲区对象 ****/
Image.save(&buffer,"png"); /***将图片保存到 buf -> data 缓存区 为 png 格式 ***/
QString buf = data.toBase64(); /** BASE64转码 **/
/*** 组装JSON数据 ****/
QJsonObject json;
json["image"] = buf;
json["image_type"] = "BASE64";
json["group_id_list"] = "Student,Teather"; //多组使用逗号隔开
/** 注意:人脸注册完毕后,生效时间一般为5s以内,之后便可以进行人脸搜索或认证操作 **/
/**** HTTP 请求POST 百度 ****/
QNetworkRequest Request(url);
Request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); //请求头 类型 JSON 格式
QByteArray byte = QJsonDocument(json).toJson(QJsonDocument::Compact); //将JSON类内容转为字符串方便发送
/**** 执行post请求 ****/
m_http->post(Request,byte);
}
void Camera::slot_pushButton_regiset()//百度云 注册人脸
{
/**** 获取用户输入的信息 *****/
QString group = ui->comboBox_group->currentText();
QString ID = ui->lineEdit_ID->text();
QString name = ui->lineEdit_user_info->text();
if(pixmap_init==0)
{
QMessageBox::warning(this,"错误警告","没有拍照,无法注册","确认");
return;
}
if(group=="" || ID == "" || name=="")
{
QMessageBox::warning(this,"错误警告","用户信息不准确,无法注册","确认");
return;
}
/***** 组装http访问百度 *****/
QString baidu = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=%1";
QString url = baidu.arg(access_token);
/**** 图片转码为BASE64编码 ****/
QImage Image = ui->label_pixmap->pixmap()->toImage(); //获取 QLabel 标签的图片
QByteArray data; /*** 用于存储图片的二进制数据 ***/
QBuffer buffer(&data); /*** 将 data 作为缓冲区对象 ****/
Image.save(&buffer,"png"); /***将图片保存到 buf -> data 缓存区 为 png 格式 ***/
QString buf = data.toBase64(); /** BASE64转码 **/
/*** 组装JSON数据 ****/
QJsonObject json;
json["image"] = buf;
json["image_type"] = "BASE64";
json["group_id"] = group;
json["user_id"] = ID;
json["user_info"] = name;
/** 注意:人脸注册完毕后,生效时间一般为5s以内,之后便可以进行人脸搜索或认证操作 **/
/**** HTTP 请求POST 百度 ****/
QNetworkRequest Request(url);
Request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); //请求头 类型 JSON 格式
QByteArray byte = QJsonDocument(json).toJson(QJsonDocument::Compact); //将JSON类内容转为字符串方便发送
/**** 执行post请求 ****/
m_http->post(Request,byte);
QMessageBox::information(this,"提示信息","注册成功!!, 登录请点击登录按钮",QMessageBox::Yes);
}
void Camera::slot_http_finished(QNetworkReply *Reply)//百度开始请求 access_token 成功后打开摄像头
{
// 响应的状态码为 200 , 表示请求成功
int stat = Reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QByteArray Reply_data = Reply->readAll();
qDebug() << "Reply_data = " << Reply_data << endl;
if(stat == 200) /*** 成功数据 ***/
{
//获取响应信息
QByteArray byteArray = QString(Reply_data).toUtf8();
QJsonDocument JsonDocument = QJsonDocument::fromJson(byteArray); //转为JSON格式字符串
qDebug() <<" json : "<90)
{
QMessageBox::information(this,"提示信息","登陆成功",QMessageBox::Yes);
ddd= new Widget;
this->close();//关闭此窗口
ddd->show();
}
else
{
QMessageBox::information(this,"提示信息","登陆失败,没有此人",QMessageBox::Yes);
}
}
}
if(JsonDocument.isObject() == true)
{
QJsonObject JsonObject = JsonDocument.object();
if(JsonObject.find("access_token") != JsonObject.end())
{
access_token = JsonObject["access_token"].toString();
qDebug() << "access_token:" << access_token <pushButton_camrae_open->text() == "打开摄像头")
{
/**** 摄像头初始化 ****/
QCameraInfo camreinfo = QCameraInfo::defaultCamera(); /*** 获取系统默认摄像头 ***/
if(camreinfo.isNull() == true)
{
QMessageBox::warning(this,"警告","系统没有可用摄像头");
return ;
}
/**** 申请摄像头类空间 ****/
m_Camera = new QCamera(camreinfo); // 直接使用系统默认的
m_Camera->setCaptureMode(QCamera::CaptureStillImage); //设置捕捉模式为静态帧(图片形式)
m_Camera->setCaptureMode(QCamera::CaptureMode::CaptureViewfinder); //将采集到取景器中
m_Camera->setViewfinder(ui->VideoWidget); //将摄像头数据输出到 UI 界面显示
m_Camera->start(); //摄像头打开
ui->pushButton_camrae_open->setText("关闭摄像头");
ui->pushButton_capture->setEnabled(true);
/***** 将摄像头放入摄像头记录类中,方便拍照 ******/
CameraImageCapture = new QCameraImageCapture(m_Camera);
CameraImageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
/*********** 捕获信号函数 imageCaptured(int,QImage) 拍了一张照,发出该信号 ********/
connect(CameraImageCapture,SIGNAL(imageCaptured(int,QImage)),this,SLOT(slot_CameraImageCapture(int,QImage)));
}
else
{
delete m_Camera; //释放他的空间
delete CameraImageCapture; //释放他的空间
ui->pushButton_camrae_open->setText("打开摄像头");
ui->pushButton_capture->setEnabled(false);
}
}
void Camera::slot_CameraImageCapture(int id, QImage image)
{
pixmap_init=1;//摄像头拍照成功
ui->label_pixmap->setPixmap(QPixmap::fromImage(image));
}
void Camera::slot_pushButton_capture()
{
CameraImageCapture->capture("D:\\QT\\hqyj_coding\\Last_project\\gg.jpg");
}
3. chooselevelscene.cpp 翻金币游戏的
#include "chooselevelscene.h"
#include
#include
#include
#include "mypushbutton.h"
#include
#include
#include
#include
ChooseLevelScene::ChooseLevelScene(QWidget *parent) : QMainWindow(parent)
{
//配置选择关卡场景
this->setFixedSize(320,588);
//设置图标
this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
//设置标题
this->setWindowTitle("选择关卡场景");
//创建菜单栏
QMenuBar * bar = menuBar();
setMenuBar(bar);
//创建开始菜单
QMenu * startMenu = bar->addMenu("开始");
//创建退出 菜单栏
QAction * quitAction = startMenu->addAction("退出");
//点击退出 实现退出游戏 建立连接
connect(quitAction,&QAction::triggered,[=](){
this->close();
});
//选择关卡的音效
QSound * chooseSound = new QSound(":/res/TapButtonSound.wav",this);
//返回按钮的音效
QSound * backSound = new QSound(":/res/TapButtonSound.wav",this);
//返回按钮
mypushbutton * backBtn = new mypushbutton(":/res/BackButton.png", ":/res/BackButtonSelected.png");//这两个图片有细微的差别,这样构成了一个动态的感觉
backBtn->setParent(this);
backBtn->move(this->width() - backBtn->width(),this->height() - backBtn->height());
//点击返回
connect(backBtn,&mypushbutton::clicked,[=](){
//点击了返回按钮的音效
backSound->play();
qDebug()<<"点击了选择关卡的 返回按键";
//告诉主场景,我返回了,主场景监听 chooseLeveScene 的返回按键
//延时发送信号
QTimer::singleShot(500,this,[=](){
emit this->chooseSceneBack();//激发信号 返回开始界面
});
});
//创建选择关卡的按钮
for(int i=0;i<20;i++)
{
mypushbutton * menuBtn = new mypushbutton(":/res/LevelIcon.png");
menuBtn->setParent(this);//设置父亲,方便关闭和销毁
menuBtn->move(25 + i%4 *70 ,130 + i/4 *70);//设置关卡的图片的位置
//监听每个按钮的点击事件 建立信号的连接
connect(menuBtn,&mypushbutton::clicked,[=](){
//选择关卡之后播放音效
chooseSound->play();
QString str =QString("你选择的是第 %1 关").arg(i+1);
qDebug()<hide();//进入游戏关卡 ,隐藏游戏选择界面
paly =new PlayScene(i+1);//创建一个游戏的界面
//设置游戏场景出现的初始位置
paly->setGeometry(this->geometry());
paly->show();//显示游戏界面
//退出游戏的信号连接
connect(paly,&PlayScene::chooseSceneBack,[=](){
this->setGeometry(paly->geometry());//窗口的位置的调整
this->show();
delete paly;
paly=NULL;
});
});
//设置选择关卡上的数字
QLabel *label = new QLabel; //建立一个标签的对象
label->setParent(this);//设置父亲, 方便关闭
label->setFixedSize(menuBtn->width(),menuBtn->height());//设置标签的大小
label->setText(QString::number(i+1));//标签里设置数字
label->move(25 + i%4 *70 ,130+ i/4*70);//设置标签的位置
//设置标签 label 上的文字对齐方式 水平居中 和 垂直居中
label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
//设置让鼠标进行穿透 51号属性
label->setAttribute((Qt::WA_TransparentForMouseEvents));
}
}
void ChooseLevelScene::paintEvent(QPaintEvent *)
{
//加载背景
QPainter painter(this);
QPixmap pix;//建立对象
pix.load(":/res/OtherSceneBg.png");//加载背景
painter.drawPixmap(0,0,this->width(),this->height(),pix);//加载第一张的图片
//加载标题
pix.load(":/res/Title.png");
painter.drawPixmap((this->width() - pix.width())*0.5,30,pix.width(),pix.height(),pix);//加载下一张图片进去
}
4. dataconfig.cpp 翻金币游戏的 关卡 的数据
//dataconfig.cpp
#include "dataconfig.h"
#include
dataconfig::dataconfig(QObject *parent) : QObject(parent)//构造函数
{
//二维数组
int array1[4][4] = {{1, 1, 1, 1},
{1, 1, 0, 1},
{1, 0, 0, 0},
{1, 1, 0, 1} } ;
QVector< QVector> v; //一个动态数组的 二维数组
for(int i = 0 ; i < 4;i++)
{
QVectorv1;//一个一维数组的动态数组
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array1[i][j]);//把数据写入到动态数组
}
v.push_back(v1);//把一维数组计入到二维数组
}
mData.insert(1,v);//把二维数组 计入到之前的 map 地图中 key =1 value = v
int array2[4][4] = { {1, 0, 1, 1},
{0, 0, 1, 1},
{1, 1, 0, 0},
{1, 1, 0, 1}} ;
v.clear();//清除二维数组。
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array2[i][j]);
}
v.push_back(v1);
}
mData.insert(2,v);
int array3[4][4] = { {0, 0, 0, 0},
{0, 1, 1, 0},
{0, 1, 1, 0},
{0, 0, 0, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array3[i][j]);
}
v.push_back(v1);
}
mData.insert(3,v);
int array4[4][4] = { {0, 1, 1, 1},
{1, 0, 0, 1},
{1, 0, 1, 1},
{1, 1, 1, 1}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array4[i][j]);
}
v.push_back(v1);
}
mData.insert(4,v);
int array5[4][4] = { {1, 0, 0, 1},
{0, 0, 0, 0},
{0, 0, 0, 0},
{1, 0, 0, 1}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array5[i][j]);
}
v.push_back(v1);
}
mData.insert(5,v);
int array6[4][4] = { {1, 0, 0, 1},
{0, 1, 1, 0},
{0, 1, 1, 0},
{1, 0, 0, 1}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array6[i][j]);
}
v.push_back(v1);
}
mData.insert(6,v);
int array7[4][4] = { {0, 1, 1, 1},
{1, 0, 1, 1},
{1, 1, 0, 1},
{1, 1, 1, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array7[i][j]);
}
v.push_back(v1);
}
mData.insert(7,v);
int array8[4][4] = { {0, 1, 0, 1},
{1, 0, 0, 0},
{0, 0, 0, 1},
{1, 0, 1, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array8[i][j]);
}
v.push_back(v1);
}
mData.insert(8,v);
int array9[4][4] = { {1, 0, 1, 0},
{1, 0, 1, 0},
{0, 0, 1, 0},
{1, 0, 0, 1}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array9[i][j]);
}
v.push_back(v1);
}
mData.insert(9,v);
int array10[4][4] = { {1, 0, 1, 1},
{1, 1, 0, 0},
{0, 0, 1, 1},
{1, 1, 0, 1}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array10[i][j]);
}
v.push_back(v1);
}
mData.insert(10,v);
int array11[4][4] = { {0, 1, 1, 0},
{1, 0, 0, 1},
{1, 0, 0, 1},
{0, 1, 1, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array11[i][j]);
}
v.push_back(v1);
}
mData.insert(11,v);
int array12[4][4] = { {0, 1, 1, 0},
{0, 0, 0, 0},
{1, 1, 1, 1},
{0, 0, 0, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array12[i][j]);
}
v.push_back(v1);
}
mData.insert(12,v);
int array13[4][4] = { {0, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 1, 1, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array13[i][j]);
}
v.push_back(v1);
}
mData.insert(13,v);
int array14[4][4] = { {1, 0, 1, 1},
{0, 1, 0, 1},
{1, 0, 1, 0},
{1, 1, 0, 1}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array14[i][j]);
}
v.push_back(v1);
}
mData.insert(14,v);
int array15[4][4] = { {0, 1, 0, 1},
{1, 0, 0, 0},
{1, 0, 0, 0},
{0, 1, 0, 1}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array15[i][j]);
}
v.push_back(v1);
}
mData.insert(15,v);
int array16[4][4] = { {0, 1, 1, 0},
{1, 1, 1, 1},
{1, 1, 1, 1},
{0, 1, 1, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array16[i][j]);
}
v.push_back(v1);
}
mData.insert(16,v);
int array17[4][4] = { {0, 1, 1, 1},
{0, 1, 0, 0},
{0, 0, 1, 0},
{1, 1, 1, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array17[i][j]);
}
v.push_back(v1);
}
mData.insert(17,v);
int array18[4][4] = { {0, 0, 0, 1},
{0, 0, 1, 0},
{0, 1, 0, 0},
{1, 0, 0, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array18[i][j]);
}
v.push_back(v1);
}
mData.insert(18,v);
int array19[4][4] = { {0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array19[i][j]);
}
v.push_back(v1);
}
mData.insert(19,v);
int array20[4][4] = { {0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}} ;
v.clear();
for(int i = 0 ; i < 4;i++)
{
QVectorv1;
for(int j = 0 ; j < 4;j++)
{
v1.push_back(array20[i][j]);
}
v.push_back(v1);
}
mData.insert(20,v);
}
5.entry_mode.cpp 登录方式的界面类
#include "entry_mode.h"
#include "ui_entry_mode.h"
Entry_mode::Entry_mode(QWidget *parent) :
QWidget(parent),
ui(new Ui::Entry_mode)
{
ui->setupUi(this);
}
Entry_mode::~Entry_mode()
{
delete ui;
}
void Entry_mode::on_pushButton_clicked()
{
a1=new Camera;
this->hide();
a1->show();
}
void Entry_mode::on_pushButton_2_clicked()
{
a2=new Sign_in;
this->hide();
a2->show();
}
6.luck_draw.cpp 开心一天的界面类
#include "luck_draw.h"
#include "ui_luck_draw.h"
luck_draw::luck_draw(QWidget *parent) :
QWidget(parent),
ui(new Ui::luck_draw)
{
ui->setupUi(this);
// ui->setupUi(this);
//this->resize(600,560);// 定义 widget 的大小 宽度 高度
this->setMouseTracking(true);//设置鼠标焦点使能
m_nRotationAngle = 0;
m_i = 0;
m_T = 0;
isDefault = false;
m_btn = new QPushButton(this); //生成一个按钮
m_btn->move(280,560);//按钮的位置移动到 坐标 273 450
m_labTr = new QLabel(tr("抽奖结果:"),this);//生成一个标签, tr() 是一个封装的函数,主要用于要进行多语言的切换的时候
m_labTr->move(220,200);//标签的位置 移动到 坐标 233 105
m_ldeRe = new QLineEdit(tr("未开始抽奖"),this);//生成一个 LineEdit 的控件 ,
m_ldeRe->move(290,195);//LineEdit 的控件 移动到 坐标 293 103
m_ldeRe->setEnabled(false);//关闭使能,主要是为了 不让我们在这个控件上面编辑
m_ldeRe->setAlignment(Qt::AlignCenter);//两个维度的中心 (字体处于)
m_btn->setText(tr("启动"));//把按键 的名字设置为 启动
m_timer = new QTimer(this);//实列化对象 定时器
//setStyleSheet 只是补充的连接: https://blog.csdn.net/qq_42250189/article/details/105199339
//QT ccs 颜色对照表 连接:https://www.cnblogs.com/edgarli/p/16293461.html
setStyleSheet("QLabel{" //对所有的标签操作
"font-size:15px;"//字体大小 为 15
""
"}"
"QLineEdit{" //对LineEdit 操作
"color:white;"//字体颜色为 白色
"font-size:14px;"//字体大小 为 14
"background-color:#f57ab8;" //背景颜色 粉红色
"border:1px solid gray;"//边框宽度 为1 以及颜色为灰色
"border-radius:5px;"//边框弧度 为 5
"}"
"#QPushButton{"//对 按钮 进行操作
"width:40px;" //宽 36
"height:20px;"//高 16
"text-align:center;"//字体位居 中心
"background-color:#da0000;"//背景颜色 红色
"color:white;"//字体颜色为白色
"border:1px solid gray;"//边框宽度 为1 以及颜色为灰色
"border-radius:3px;"//边框弧度 为 3
"}"
);
connect(m_timer,SIGNAL(timeout()),this,SLOT(updatePaint()));//设置的定时器 结束信号 连接函数 updatePaint
connect(m_btn,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));//按钮的点击信号 连接函数 btnClicked
connect(this,SIGNAL(sigResult(int)),this,SLOT(reResult(int)));
ui->pushButton_jiaju->setEnabled(true);
ui->pushButton_jiankong->setEnabled(true);
ui->pushButton_surface->setEnabled(true);
ui->pushButton_tianqi->setEnabled(true);
ui->pushButton_yinyue->setEnabled(true);
ui->pushButton_yuyin->setEnabled(true);
}
luck_draw::~luck_draw()
{
delete ui;
}
void luck_draw::slot_surface_show()//界面显示槽函数函数
{
this->show();//当前界面显示
}
void luck_draw::gradientArc(QPainter *painter, int radius, int startAngle,int angleLength, int arcHeight, QRgb color)//扇形的构造函数
{
QRadialGradient gradient(0,0,radius);
gradient.setColorAt(0,Qt::black);
gradient.setColorAt(1.0,color);
painter->setBrush(gradient);
// << 1(左移1位)相当于radius*2 即:150*2=300
//QRectF(-150, -150, 300, 300)
QRectF rectf(-radius,-radius,radius << 1,radius << 1);
QPainterPath path;
path.arcTo(rectf,startAngle,angleLength);
QPainterPath subPath;
subPath.addEllipse(rectf.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));
//subPath.addEllipse(rect.adjusted(arcHeight,arcHeight,-arcHeight,-arcHeight));
//path为扇形 subPath为椭圆
path -= subPath;//
// QFont font;
// font.setFamily("Microsoft YaHei");
// font.setPointSize(14);
// painter->setPen(Qt::NoPen);
// path.addText(path.pointAtPercent(0.5), font, QStringLiteral("一去丶二三里"));
painter->setPen(Qt::NoPen);
painter->drawPath(path);
}
void luck_draw::updatePaint()//
{
if(!isDefault)
{
m_nRotationAngle = m_nRotationAngle + 33;
if(m_nRotationAngle >360)
{
m_nRotationAngle = 0;
m_T++;
if(m_T == 3)
{
m_nRotationAngle = m_nRotationAngle + 5;
}else if(m_T == 5)
{
stopInit();
}
}
}
else
{
m_nRotationAngle = m_nRotationAngle + 33;
if(m_nRotationAngle >360)
{
m_nRotationAngle = 0;
m_T++;
if(m_T == 3)
{
m_nRotationAngle = m_nRotationAngle + 5;
}else if(m_T == 5)
{
stopInit();
}
}
}
update();
}
void luck_draw::btnClicked()
{
//m_btn->setEnabled(false);//使能关闭
if(!m_timer->isActive())//此时定时器没有活动
{
m_timer->start(30);//定时器定时 30 ms
int iRangd = getRand();//获取奖项的 编码
emit sigResult(iRangd);
m_T = 0;
m_ldeRe->setStyleSheet("color:white;");
m_ldeRe->setText(tr("正在抽奖..."));
}else
{
stopInit();
}
}
void luck_draw::reResult(int re)
{
isDefault = true;
m_map = returnResult(re);
QMapIterator ii(m_map);
if(m_map.isEmpty())
return;
while(ii.hasNext())
{
ii.next();
m_Re = ii.value();
m_nRo = ii.key();
}
m_btn->setEnabled(true);
}
void luck_draw::stopRotate()
{
m_timer->stop();
}
QMap luck_draw::returnResult(int re)//设置指针的位置
{
int ire = 0;
QMap map;
switch(re)
{
case 0:
//(rand()%(b-a))+ a,-->[a,b)的随机数
ire = (qrand() % (45 - 0) + 0);
qDebug() << "二等奖";
map.insert(ire,tr("二等奖"));
break;
case 1:
qDebug() << "谢谢1";
ire = (qrand() % (90 - 46) + 46);
map.insert(ire,tr("谢谢参与"));
break;
case 2:
qDebug() << "特等奖";
ire = (qrand() % (135 - 90) + 90);
map.insert(ire,tr("特等奖"));
break;
case 3:
qDebug() << "三等奖";
ire = (qrand() % (180 - 135) + 135);
map.insert(ire,tr("三等奖"));
break;
case 4:
qDebug() << "幸运2";
ire = (qrand() % (225 - 180) + 180);
map.insert(ire,tr("幸运奖"));
break;
case 5:
qDebug() << "谢谢2";
ire = (qrand() % (270 - 225) + 225);
map.insert(ire,tr("谢谢参与"));
break;
case 6:
qDebug() << "一等奖";
ire = (qrand() % (315 - 270) + 270);
map.insert(ire,tr("一等奖"));
break;
case 7:
qDebug() << "幸运1";
ire = (qrand() % (360 - 315) + 315);
map.insert(ire,tr("幸运奖"));
break;
default:
break;
}
return map;
}
QString luck_draw::showAwards(luck_draw::Awards award)
{
QString result = "";
switch(award)
{
case Spe:
result = "特等奖";
break;
case First:
result = "一等奖";
break;
case Second:
result = "二等奖";
break;
case Third:
result = "三等奖";
break;
case Luck_Fir:
result = "幸运奖";
break;
case Luck_Sec:
result = "幸运奖";
break;
case ThanK_Fir:
result = "谢谢参与";
break;
case Thank_Sec:
result = "谢谢参与";
break;
default:
break;
}
return result;
}
void luck_draw::stopInit()//立即停止函数
{
m_timer->stop();
m_T = 0;
isDefault = false;
int ip = m_nRo;
int tp = m_nRotationAngle;
if(ip > m_nRotationAngle)
{
for (int i = tp; i <= ip; i++)
{
m_nRotationAngle = i;
}
}
m_nRotationAngle = m_nRo;
m_ldeRe->setText(m_Re);
update();
}
//设置奖项概率
int luck_draw::getRand()
{
int re = 10;//开始的时候没有奖项
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//产生随机数种子(指从零点整到当前时间所经过的秒数)
int rand = ((qrand() % 100) + 1);//把 rand 的范围 定义为 1 -100 qrand()//随机获取一个数字
qDebug() << "rand:" << rand;
//概率部分
if(rand == 1)
{
re = 2;
}else if((rand <= 4) && (rand >= 2 ))
{
re = 6;
}else if((rand <= 9) && (rand >= 5 ))
{
re = 0;
}else if((rand <= 20) && (rand >= 10 ))
{
re = 3;
}else if((rand <= 35) && (rand >= 21 ))
{
re = 4;
}else if((rand <= 50) && (rand >= 36 ))
{
re = 7;
}else if((rand <= 75) && (rand >= 51 ))
{
re = 1;
}else if((rand <= 100) && (rand >= 76 ))
{
re = 5;
}
return re;
}
void luck_draw::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(0,0,800,760,QPixmap(":/image/image/抽奖界面.jpeg"));
//QLabel* m_lblbg= new QLabel(this);
//m_lblbg->setPixmap(QPixmap(":/image/抽奖界面.jpeg"));
//m_lblbg->setScaledContents(true);
painter.setRenderHint(QPainter::Antialiasing,true);
int radius = 150;
int arcHeight = 130;// 外圈到里面的长度 (就是大的圆里面 有个的同心圆的半径 为 radius - arcHeight,小的圆没有填充 )
//>>1 右移一位,相当于width() / 2
painter.translate((width() >> 1)-100,height() >> 1);//圆心的位置 QTransform 用于指定坐标系的 2D 转换 - 平移、缩放、扭曲(剪切)、旋转或投影坐标系。绘制图形时,通常会使用
// painter.rotate(m_nRotationAngle);
/*
* 参数二:半径
* 参数三:开始的角度
* 参数四:指扫取的角度-顺时针(360度 / 8 = 45度)
* 参数五:圆环的高度
* 参数六:填充色
**/
gradientArc(&painter,radius,0,45,arcHeight,qRgb(200,200,0));
gradientArc(&painter,radius,45,45,arcHeight,qRgb(200,0,200));
gradientArc(&painter,radius,90,45,arcHeight,qRgb(0,200,200));
gradientArc(&painter,radius,135,45,arcHeight,qRgb(200,0,0));
gradientArc(&painter,radius,225,45,arcHeight,qRgb(0,200,0));
gradientArc(&painter,radius,180,45,arcHeight,qRgb(0,0,200));
gradientArc(&painter,radius,270,45,arcHeight,qRgb(0,0,0));
gradientArc(&painter,radius,315,45,arcHeight,qRgb(150,150,150));
//setPen,第一个参数是画笔颜色,这里设置为黑色;第二个参数是画笔的粗细,这里是2px;
painter.setPen(QPen(QColor(Qt::yellow),2));
painter.rotate(-35);//图形的旋转等操作,参数为顺时针旋转的角度,以原点为中心旋转
painter.drawText(60,30,tr("谢谢参与"));
painter.rotate(40);
painter.drawText(70,30,tr("一等奖"));
painter.rotate(95);
painter.drawText(70,30,tr("二等奖"));
painter.rotate(135);
painter.drawText(70,30,tr("三等奖"));
painter.rotate(180);
painter.drawText(70,30,tr("幸运奖"));
painter.rotate(210);
painter.drawText(70,30,tr("幸运奖"));
painter.rotate(245);
painter.drawText(70,30,tr("谢谢参与"));
painter.rotate(40);
painter.drawText(70,30,tr("特等奖"));
QPainter painter2(this);
painter2.setRenderHint(QPainter::Antialiasing,true);
painter2.translate((width() >> 1)-100,height() >> 1);
painter2.rotate(m_nRotationAngle);
static const QPoint poit[4] = {QPoint(0,-18),QPoint(10,0),QPoint(0,60),QPoint(-10,0)};
painter2.setBrush(QColor(Qt::red));
painter2.setPen(Qt::NoPen);
painter2.drawPolygon(poit,4);
painter2.setBrush(QColor(Qt::yellow));
painter2.drawEllipse(-7,-7,14,14);
ui->pushButton_jiaju->setEnabled(true);
ui->pushButton_jiankong->setEnabled(true);
ui->pushButton_surface->setEnabled(true);
ui->pushButton_tianqi->setEnabled(true);
ui->pushButton_yinyue->setEnabled(true);
ui->pushButton_yuyin->setEnabled(true);
}
void luck_draw::on_pushButton_tianqi_clicked()
{
this->hide();//隐藏
emit enter_weather2();//进入天气预报
}
void luck_draw::on_pushButton_jiaju_clicked()
{
this->hide();//隐藏
emit enter_home2();//进入智能家具
}
void luck_draw::on_pushButton_jiankong_clicked()
{
this->hide();//隐藏
emit enter_tcp2();//进入远程监控
}
void luck_draw::on_pushButton_yinyue_clicked()
{
this->hide();//隐藏
emit enter_music2();//进入音乐播放
}
void luck_draw::on_pushButton_yuyin_clicked()
{
this->hide();//隐藏
emit enter_audio2();//进入语音识别
}
void luck_draw::on_pushButton_surface_clicked()
{
this->hide();//隐藏
emit luck_hide2();//当前界面隐藏,主界面显示信号
}
7.mainsence.cpp 翻金币游戏的背景图片的类
#include "mainsence.h"
#include "ui_mainsence.h"
#include
#include "mypushbutton.h"
#include
#include
#include
Mainsence::Mainsence(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Mainsence)
{
ui->setupUi(this);
//配置主场景
//设置固定大小
setFixedSize(320,588);//设置窗口的初始大小
//设置图标
setWindowIcon(QIcon(":/res/Coin0001.png"));
//设置标题
setWindowTitle("翻金币主场景");
//退出按钮实现
connect(ui->action_quit,&QAction::triggered,[=](){
this->close();
});
//准备开始的音效
QSound * startSound = new QSound(":/res/TapButtonSound.wav",this);
//startSound->setLoops(-1); // 这个函数是播放几次 -1 是无限的播放
//开始的按钮
mypushbutton * startBtn = new mypushbutton(":/res/MenuSceneStartButton.png");
startBtn->setParent(this);
startBtn->move((this->width() *0.5) - (startBtn->width()*0.5),this->height()*0.7);
//实列化选择关卡场景
chooseScene =new ChooseLevelScene;
//返回按钮的信号连接
connect(chooseScene,&ChooseLevelScene::chooseSceneBack,this,[=](){
this->setGeometry(chooseScene->geometry());//保证两个窗口出现的位置相同
chooseScene->hide();//选择关卡场景 隐藏
this->show();//重新显示主场景
});
connect(startBtn,&mypushbutton::clicked,[=](){
//播放点击了开始的音效
startSound->play();
qDebug()<<"点击了开始";
//弹起特效
startBtn->zoom1();
startBtn->zoom2();
//延时进入到选择关卡场景中
QTimer::singleShot(500,this,[=](){
//设置chooseScene 场景的位置
chooseScene->setGeometry(this->geometry());//这个函数的作用就是把 新的这个窗口放到 之前要隐藏的窗口的位置,防止返回的时候,两个窗口位置的不同
//自身隐藏
this->hide();
//进入选择关卡场景中
//显示选择关卡
chooseScene->show();
//监听选择关卡场景的返回按钮的信号
});
});
}
Mainsence::~Mainsence()
{
delete ui;
}
//重新paintEvent 事件, 画背景图
void Mainsence::paintEvent(QPaintEvent *)
{
QPainter painter(this);//设置一个画家的对象
QPixmap pix;//定义一个图片的对象
pix.load(":res/PlayLevelSceneBg.png");//加载图片
//第一个参数 第二个参数 位置开始的位置 ,参数三 画家对象窗口的宽 ,参数四 画家对象窗口的高 参数五,要加载的图片
painter.drawPixmap(0,0,this->width(),this->height(),pix);//窗口设置图片 这个函数可以使图片的大小适应窗口的大小
//画背景图标
pix.load(":/res/Title.png");//再次加载一个图片
pix=pix.scaled(pix.width()*0.5,pix.height()*0.5);//得到一个缩放的图片
painter.drawPixmap(10,30,pix);//再次放置图片 开始的位置是10,30
}
8.mainwindow.cpp 2048 游戏类
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
//输入昵称
inputInfo = QInputDialog::getText(NULL, "Log in",
"Please input your nickname:",
QLineEdit::Normal,
"Guest",
&OK,
Qt::WindowCloseButtonHint
);
tempInfo = inputInfo;
//qDebug()<setupUi(this);
ui->timelabel->move(60,612);
ui->scorelabel->move(400,612);
ui->gamemode->move(60,70);
connect(ui->classic,&QAction::triggered,[=](){
newGame();
moveSound();
gmode="Classic";gametype=1;
this->update();
});
connect(ui->Time_Limited_2,QAction::triggered,[=](){
newGame();
moveSound();
gmode="Time Limited";gametype=2;
this->update();
});
connect(ui->actionFast_Mode,QAction::triggered,[=](){
newGame();
moveSound();
gmode="Fast Mode";gametype=3;
this->update();
});
connect(ui->actionMax_Number,QAction::triggered,[=](){
newGame();
moveSound();
gmode="Max Number";gametype=4;
this->update();
});
connect(ui->actionDrunk,QAction::triggered,[=](){
newGame();
moveSound();
gmode="Drunk Mode";gametype=5;
this->update();
});
connect(ui->action8402,QAction::triggered,[=](){
newGame();
moveSound();
gmode="8402";gametype=6;
this->update();
});
connect(ui->Ranking,QAction::triggered,[=](){
QFile file("C:/Users/15723/Documents/codeqt/Qt-2048/res/namelist.txt");
file.open(QIODevice::ReadOnly);
QByteArray array=file.readAll();
file.close();
QMessageBox::information(this,"Ranking",QString(array));
});
connect(ui->actionhelp,QAction::triggered,[=](){
QFile file("C:/Users/15723/Documents/codeqt/Qt-2048/res/help.txt");
file.open(QIODevice::ReadOnly);
QByteArray helparray=file.readAll();
file.close();
QMessageBox::information(this,"Help",QString(helparray));
});
this->setFixedSize(WINWIDTH,WINHEIGHT);
this->setWindowTitle("Qt-2048");
this->setWindowIcon(QPixmap(":/res/image/icon.png"));
newGame();
backGroundSound();
//计时器
QTimer * timer=new QTimer;
timer->start(1000);
QObject::connect(timer,&QTimer::timeout,[=](){
if(!gameover)
{
ui->timelabel->setText(QString::number(++run)+"秒");
if(gametype==2&&run==60)
{
QMessageBox::warning(this,"游戏结束","You get "+QString::number(score)+" points!");
gametype=0;gameover=true;
if(OK){
QFile file("C:/Users/15723/Documents/codeqt/Qt-2048/res/namelist.txt"); //得分榜地址
file.open(QIODevice::Append|QIODevice::Text);
tempInfo.append("/"+QString::number(score)+" points/"+"Time Limited"+'\n');
file.write(tempInfo.toStdString().data());
tempInfo = inputInfo;
file.close();
}
}
if(gametype==3&&run-temprun>2)
{
QMessageBox::warning(this,"游戏结束","You get "+QString::number(score)+" points!");
gametype=0;gameover=true;
if(OK){
QFile file("C:/Users/15723/Documents/codeqt/Qt-2048/res/namelist.txt"); //得分榜地址
file.open(QIODevice::Append|QIODevice::Text);
tempInfo.append("/"+QString::number(score)+" points/"+"Fast Mode"+'\n');
file.write(tempInfo.toStdString().data());
tempInfo = inputInfo;
file.close();
}
}
if(gametype==4&&run==120)
{
int Max=0;
for(int i=0;itimelabel->setText("0秒");
ui->scorelabel->setText("0分");
ui->gamemode->setText(gmode);
srand((unsigned)time(NULL));
for(int i=0;isetFocusPolicy(Qt::StrongFocus); // Qt焦点事件 打开游戏后可以直接游玩
if(gametype==5){
if(event->key()==Qt::Key_Up){
presstype=1;
goDown();
}else if(event->key()==Qt::Key_Down){
presstype=2;
goUp();
}else if(event->key()==Qt::Key_Left){
presstype=3;
goRight();
}else if(event->key()==Qt::Key_Right){
presstype=4;
goLeft();
}else{
QMessageBox::warning(this,"提示","请用方向键进行游戏!");
return;
}
}
else{
if(event->key()==Qt::Key_Up){
presstype=1;
goUp();
}else if(event->key()==Qt::Key_Down){
presstype=2;
goDown();
}else if(event->key()==Qt::Key_Left){
presstype=3;
goLeft();
}else if(event->key()==Qt::Key_Right){
presstype=4;
goRight();
}else{
QMessageBox::warning(this,"提示","请用方向键进行游戏!");
return;
}
}
if(!ifArraySame()&&!gameover){
moveSound();
setGameArray();
score=tempscore;
temprun=run;
ui->scorelabel->setText(QString::number(score)+"分");
this->update();
this->setEnabled(false); // 产生新方块时禁用键盘事件
QEventLoop eventloop;
QTimer::singleShot(100, &eventloop, SLOT(quit())); // 延迟1ms产生新方块
eventloop.exec();
newBlock();
this->update();
this->setEnabled(true);
}
ifFail();
ifWin();
}
// 向上合并方块
void MainWindow::goUp(){
setTempGameArray();
tempscore=score;
for(int i=0;i=0;j--){
if(!TempGame[i][j]){
for(int k=j-1;k>=0;k--){
if(TempGame[i][k]){
TempGame[i][j]=TempGame[i][k];
TempGame[i][k]=0;
break;
}
}
}
}
}
}
for(int i=0;i0;j--){
if(TempGame[i][j]==TempGame[i][j-1]&&TempGame[i][j]&&TempGame[i][j-1]){
TempGame[i][j]++;
TempGame[i][j-1]=0;
if(!test) tempscore+=pow(2,TempGame[i][j]);
for(int k=j-1;k>0;k--){
TempGame[i][k]=TempGame[i][k-1];
}
TempGame[i][0]=0;
}
}
}
}
// 向左合并方块
void MainWindow::goLeft(){
setTempGameArray();
tempscore=score;
for(int j=0;j=0;i--){
if(!TempGame[i][j]){
for(int k=i-1;k>=0;k--){
if(TempGame[k][j]){
TempGame[i][j]=TempGame[k][j];
TempGame[k][j]=0;
break;
}
}
}
}
}
}
for(int j=0;j0;i--){
if(TempGame[i][j]==TempGame[i-1][j]&&TempGame[i][j]&&TempGame[i-1][j]){
TempGame[i][j]++;
TempGame[i-1][j]=0;
if(!test) tempscore+=pow(2,TempGame[i][j]);
for(int k=i-1;k>0;k--){
TempGame [k][j]=TempGame[k-1][j];
}
TempGame[0][j]=0;
}
}
}
}
// 将Game数组复制到TempGame数组以进行合并操作
void MainWindow::setTempGameArray(){
for(int i=0;isetMedia(QUrl("qrc:/res/audio/move.mp3"));
moveplayer->setVolume(30);
moveplayer->play();
}
// 游戏背景音乐
void MainWindow::backGroundSound(){
//QMediaPlaylist *playlist = new QMediaPlaylist();
//playlist->addMedia(QUrl("qrc:/res/audio/back.mp3"));
//playlist->addMedia(QUrl("qrc:/res/audio/back2.mp3")); // 使用两个音频进行循环
//playlist->setPlaybackMode(QMediaPlaylist::Loop);
//playlist->setCurrentIndex(0);
//QMediaPlayer * backplayer= new QMediaPlayer;
//backplayer->setPlaylist(playlist);
//backplayer->setVolume(10);
//backplayer->play();
}
9. misic_display.cpp 音乐播放器的类
#include "misic_display.h"
#include "ui_misic_display.h"
#include //输出文字
#include //打开文件
#include
#include
#include
#include //只能播放 war 类型的音乐
#include //播放mp3 的音乐
#include //播放mp3 的音乐
#include
#include
#include //音乐模式选择
#include //标签
#include //文件
#include
#include
Misic_display::Misic_display(QWidget *parent) :
QWidget(parent),
ui(new Ui::Misic_display)
{
ui->setupUi(this);
mediaPayer=new QMediaPlayer;
/**** 加载初始化的资源****/
fileInit();
/******** 音量调节的部分 *******/
ui->verticalSlider->setRange(0,100);//设置进度条
connect(ui->verticalSlider,&QSlider::sliderMoved,this,[=](qint8 value){
mediaPayer->setVolume(value);
ui->label_3->setNum(value);
});//拖动滑块,让音乐播放的进度改变
/********* 设置歌曲的总时长 与设置进度条*******/
connect(mediaPayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration){
ui->label2->setText(QString("%1:%2").arg(duration/1000/60).arg(duration/1000%60));//把歌曲的总时间写入标签之中
ui->horizontalSlider->setRange(0,duration);//设置进度条
});
/********* 设置歌曲的现在的播放时长********/
connect(mediaPayer,&QMediaPlayer::positionChanged,this,[=](qint32 duration1){
ui->label1->setText(QString("%1:%2").arg(duration1/1000/60).arg(duration1/1000%60));//把歌曲的总时间写入标签之中
ui->horizontalSlider->setValue(duration1);//设置播放的进度条
if((mediaPayer->position() == mediaPayer->duration())&&(mediaPayer->position() != 0 && mediaPayer->duration() != 0))
{
MusicPlaybackMode();
}
});
/********** 设置进度条的拖动功能 *******/
connect(ui->horizontalSlider,&QSlider::sliderMoved,mediaPayer,&QMediaPlayer::setPosition);//拖动滑块,让音乐播放的进度改变
/*** 播放速度 ***/
connect(ui->comboBox_2,&QComboBox::currentTextChanged,this,[=](QString text){//这里有bug
if(text=="1")
{
float rate = 1;
mediaPayer->setPlaybackRate(rate);
}
else if(text=="2")
{
float rate = 1.25;
mediaPayer->setPlaybackRate(rate);
}
else if(text=="3")
{
float rate = 1.50;
mediaPayer->setPlaybackRate(rate);
}
else if(text=="4")
{
float rate = 2;
mediaPayer->setPlaybackRate(rate);
}
});
}
Misic_display::~Misic_display()
{
delete ui;
}
void Misic_display::slot_surface_show()//界面显示槽函数函数
{
this->show();//当前界面显示
}
void Misic_display::setHide()//设置界面隐藏
{
this->hide();
}
void Misic_display::setShow()//设置界面显示
{
this->show();
}
void Misic_display::fileInit()//初始化,资源文件
{
musicList.push_back(QString("qrc:/res/1.mp3"));//添加内部资源歌曲
musicList.push_back(QString("qrc:/res/周杰伦 - 红尘客栈 (Live).mp3"));
musicList.push_back(QString("qrc:/res/薛之谦 _ 毛不易 - 消愁 (Live).mp3"));
musicList.push_back(QString("qrc:/res/许嵩 - 城府.mp3"));
mediaPayer->setVolume(50);//设置音量为 50
ui->label_3->setNum(50);
ui->verticalSlider->setValue(50);//设置音乐栏的位置为中间
GetMusicName();//获取歌单
Load_music();//加载路径
ui->listWidget->setCurrentRow(display_number);//给播放的音乐歌曲 加上背景颜色
float a=1;
mediaPayer->setPlaybackRate(a);//设置播放速度
}
void Misic_display::music_display_1(int vlaue)//播放本地资源
{
QString b=musicList.at(vlaue);
QByteArray a=b.toUtf8();//QString ->QByteArray
mediaPayer->setMedia(QUrl::fromEncoded(a));//播放本地资源的文件
}
void Misic_display::music_display_2(int vlaue)//播放后来加进来的 音乐
{
QString b=musicList.at(vlaue);
mediaPayer->setMedia(QUrl::fromLocalFile(b));//绝对路径
}
void Misic_display::GetMusicName()//获取播放列表的音乐名字
{
musicList_name.clear();//清除歌单,
for(int i=0;ilistWidget->clear();//刷新列表
ui->listWidget->addItems(musicList_name);
qDebug()<comboBox->currentIndex();//返回当前模式的号码
QString b = ui->comboBox->currentText();//返回当前的模式的名字
qDebug()<<"当前的模式为 : "<listWidget->setCurrentRow(display_number);//给播放的音乐歌曲 加上背景颜色
Load_music();//加载路径
on_pushButton_3_clicked();//播放音乐
}
}
else if(a==2)//单曲循环
{
Load_music();//重新加载路径
on_pushButton_3_clicked();//播放歌曲
}
}
void Misic_display::Load_music()//加载播放歌曲的路径
{
if(display_number<=3)
{
music_display_1(display_number);
}
else
{
music_display_2(display_number);
}
}
void Misic_display::on_pushButton_1_clicked()
{
QStringList s = QFileDialog::getOpenFileNames(
this, "选择要播放的文件",
"D:/QT/QT_coding/musicPLay/music",
"视频文件 (*.wav *.mp3)");
qDebug() << "path=" << s;
if (!s.isEmpty())//保证使用人选择了文件,预防报错
{
for(int i=0;i=0)//判断条件,防止歌曲的数量越界
{
display_number--;
Load_music();//加载播放音乐的路径 //为播放音乐提前做准备
on_pushButton_3_clicked();
ui->listWidget->setCurrentRow(display_number);//给播放的音乐歌曲 加上背景颜色
}
}
void Misic_display::on_pushButton_3_clicked()
{
mediaPayer->play();//播放音乐
}
void Misic_display::on_pushButton_5_clicked()
{
if((display_number+1)listWidget->setCurrentRow(display_number);//给播放的音乐歌曲 加上背景颜色
Load_music();//加载播放音乐的路径 //为播放音乐提前做准备
on_pushButton_3_clicked();
}
}
void Misic_display::on_pushButton_4_clicked()
{
mediaPayer->pause();
}
void Misic_display::on_listWidget_doubleClicked(const QModelIndex &index)//在音乐列表双击的时候可以 播放音乐
{
display_number=index.row();//获取歌曲列表的双击的行数
ui->listWidget->setCurrentRow(display_number);//给播放的音乐歌曲 加上背景颜色
Load_music();//加载播放音乐的路径 //为播放音乐提前做准备
on_pushButton_3_clicked();
}
void Misic_display::setVolume(qint8 a)//控制音量
{
if(0<=a && a<=100)
{
mediaPayer->setVolume(a);//音量调节
}
}
void Misic_display::on_pushButton_yuyin_clicked()
{
this->hide();
emit enter_audio3();//进入语音识别
}
void Misic_display::on_pushButton_jiaju_clicked()
{
this->hide();
emit enter_home3();//进入智能家具
}
void Misic_display::on_pushButton_jiankong_clicked()
{
this->hide();
emit enter_tcp3();//进入远程监控
}
void Misic_display::on_pushButton_tioanqi_clicked()
{
this->hide();
emit enter_weather3();//进入天气预报
}
void Misic_display::on_pushButton_kuaile_clicked()
{
this->hide();
emit enter_luck_draw3();//进入快乐一天
}
void Misic_display::on_pushButton_surface_clicked()
{
this->hide();
emit music_hide3();//当前界面隐藏,主界面显示信号
}
10.mycoin.cpp 翻金币游戏类 金币的构造类
#include "mycoin.h"
#include
//MyCoin::MyCoin(QWidget *parent) : QWidget(parent)
//{
//}
MyCoin::MyCoin(QString btnImg)
{
QPixmap pix;//建立一个图片的对象
bool ret=pix.load(btnImg);//加载图片
if(!ret)//判定图片是否加载成功
{
QString str = QString("图片 %1 加载失败").arg(btnImg);
qDebug()<setFixedSize(pix.width(),pix.height());//设置 金币按钮的大小
this->setStyleSheet("QPushButton{border:Opx}");//设置为不规则图像的过滤
this->setIcon(pix);//加载图片,给这个按钮
this->setIconSize(QSize(pix.width(),pix.height()));//图片大小的设置
//初始化定时器对象
timer1 = new QTimer(this);
timer2 = new QTimer(this);
//定时器的启动信号的连接
//监听正面的金币的点击 信号
connect(timer1,&QTimer::timeout,[=](){
QPixmap pix;//建立一个图片的对象
QString str1 = QString(":/res/Coin000%1").arg(this->min++);
bool ret1=pix.load(str1);
if(!ret1)
{
qDebug()<<"错误 金币正面翻转 "<setFixedSize(pix.width(),pix.height());//设置 金币按钮的大小
this->setStyleSheet("QPushButton{border:Opx}");//设置为不规则图像的过滤
this->setIcon(pix);//加载图片,给这个按钮
this->setIconSize(QSize(pix.width(),pix.height()));//图片大小的设置
//判断 如果翻完了 将min 重置为 1;
if(this->min > this->max)
{
this->min=1;
timer1->stop();//定时器发出信号停止
isAnimation=false;//停止做动画了
}
});
//监听反面的金币的点击 信号
connect(timer2,&QTimer::timeout,[=](){
QPixmap pix;//建立一个图片的对象
QString str1 = QString(":/res/Coin000%1").arg(this->max--);
bool ret1=pix.load(str1);
if(!ret1)
{
qDebug()<<"错误 金币正面翻转 "<setFixedSize(pix.width(),pix.height());//设置 金币按钮的大小
this->setStyleSheet("QPushButton{border:Opx}");//设置为不规则图像的过滤
this->setIcon(pix);//加载图片,给这个按钮
this->setIconSize(QSize(pix.width(),pix.height()));//图片大小的设置
//判断 如果翻完了 将min 重置为 1;
if(this->max < this->min)
{
this->max=8;
timer2->stop();//定时器发出信号停止
isAnimation=false;//停止做动画了
}
});
}
void MyCoin::changeFlag()//改变金币的状态
{
//如果是正面 翻成反面
if(this->flag)
{
//开始运行正面翻反面的定时器
timer1->start(30);//启动定时器 时间间隔为30毫秒
this->flag=false;//把金币的状态改变
isAnimation=true;//开始做动画了
}
else
{
//开始运行反面翻正面的定时器
timer2->start(30);//启动定时器 时间间隔为30毫秒
this->flag=true;//把金币的状态改变
isAnimation=true;//开始做动画了
}
}
//重写 鼠标按下的事件
void MyCoin::mousePressEvent(QMouseEvent * e)
{
if(this->isAnimation || this->ispaly== false)//当他翻转动作正在执行的时候,我们点击按钮 ,使按钮失效
{
return;
}
else//没有进行翻转动作的时候,我们把这个信号交给父类处理
{
QPushButton::mousePressEvent(e);
}
}
11.mypushbutton.cpp 翻金币自定义类的 按钮
#include "mypushbutton.h"
//mypushbutton::mypushbutton(QWidget *parent) : QPushButton(parent)
//{
//}
mypushbutton::mypushbutton(QString normalImg,QString pressImg)
{
this->normaLImgPath = normalImg;//赋值 //初始的状态图片
this->pressImgPath = pressImg;//鼠标按下去的状态图片
QPixmap pix;
bool ret = pix.load(normalImg);//看图片是否加载成功
if(!ret)
{
qDebug() <<"图片加载失败";
return;
}
//设置图片固定大小
this->setFixedSize(pix.width(),pix.height());
//设置不规则图片样式
this->setStyleSheet("QPushButton{border:Opx;}");//去掉周围的空白,只剩图形
//设置图片
this->setIcon(pix);
//设置图标大小
this->setIconSize(QSize(pix.width(),pix.height()));
}
//弹跳特效
void mypushbutton::zoom1()//向下跳 (这里的按键的 为开始的)
{
//创建一个动态对象
QPropertyAnimation * animation =new QPropertyAnimation(this,"geometry");
//设置动画的事件间隔
animation->setDuration(200);
//起始位置
animation->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
//结束位置
animation->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
//设置弹跳曲线
animation->setEasingCurve(QEasingCurve::OutBounce);
//执行动画
animation->start();
}
void mypushbutton::zoom2()//向上跳
{
//创建一个动态对象
QPropertyAnimation * animation =new QPropertyAnimation(this,"geometry");
//设置动画的事件间隔
animation->setDuration(200);
//起始位置
animation->setStartValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
//结束位置
animation->setEndValue(QRect(this->x(),this->y(),this->width(),this->height()));
//设置弹跳曲线
animation->setEasingCurve(QEasingCurve::OutBounce);
//执行动画
animation->start();
}
void mypushbutton::mousePressEvent(QMouseEvent * e)//鼠标按下去的一瞬间, 这个按钮加载的图片改变, 变为另外一种状态 按下去的状态,与初始的状态的图片,有细微的改变,这样形成一种动态的效果
{
if(this->pressImgPath !="")//传入的按下的图片不为空, 说明需要有按下状态 切换图片
{
QPixmap pix;
bool ret = pix.load(this->pressImgPath);//看图片是否加载成功
if(!ret)
{
qDebug() <<"图片加载失败";
return;
}
//设置图片固定大小
this->setFixedSize(pix.width(),pix.height());
//设置不规则图片样式
this->setStyleSheet("QPushButton{border:Opx;}");//去掉周围的空白,只剩图形
//设置图片
this->setIcon(pix);
//设置图标大小
this->setIconSize(QSize(pix.width(),pix.height()));
}
//让父类执行其他的内容
return QPushButton::mousePressEvent(e);
}
void mypushbutton::mouseReleaseEvent(QMouseEvent * e)//鼠标释放之后的状态为 这个按钮的加载图片的改变 变为之前的还没有改变的状态
{
if(this->pressImgPath !="")//传入的按下的图片不为空, 说明需要有按下状态 切换初始的图片
{
QPixmap pix;
bool ret = pix.load(this->normaLImgPath);//看图片是否加载成功
if(!ret)
{
qDebug() <<"图片加载失败";
return;
}
//设置图片固定大小
this->setFixedSize(pix.width(),pix.height());
//设置不规则图片样式
this->setStyleSheet("QPushButton{border:Opx;}");//去掉周围的空白,只剩图形
//设置图片
this->setIcon(pix);
//设置图标大小
this->setIconSize(QSize(pix.width(),pix.height()));
}
//让父类执行其他的内容
return QPushButton::mouseReleaseEvent(e);
}
12. playscene.h 翻金币的音乐播放,成功判断类
#include "playscene.h"
#include
#include
#include
#include "mypushbutton.h"
#include
#include
#include "mycoin.h"
#include "dataconfig.h"
#include
#include
//PlayScene::PlayScene(QWidget *parent) : QMainWindow(parent)
//{
//}
PlayScene::PlayScene(int levelNum)//构造函数
{
QString str=QString("进入了第 %1 关").arg(levelNum);//进入关卡的体术语句
qDebug()<levelIndex=levelNum;//内部成员赋值
//初始化游戏的场景
//设置固定大小
this->setFixedSize(320,588);
//设置图标
this->setWindowIcon(QPixmap(":/res/Coin0001.png"));//就是最上面的窗口名称旁边的图标
//设置标题
this->setWindowTitle("翻金币场景");
//创建菜单栏
QMenuBar * bar = menuBar();//创建一个菜单栏的对象,这个对象是空的
setMenuBar(bar);//把菜单栏对象,放置到窗口
//创建开始菜单
QMenu * startMenu = bar->addMenu("开始");
//创建退出 菜单选项
QAction * quitAction = startMenu->addAction("退出");
//点击退出 实现退出游戏
connect(quitAction,&QAction::triggered,[=](){
this->close();
});
//添加音效
//返回按钮的音效
QSound * backSound = new QSound(":/res/TapButtonSound.wav",this);
//翻金币的音效
QSound * flipSound = new QSound(":/res/ConFlipSound.wav",this);
//成功胜利的音效
QSound * winSound = new QSound(":/res/LevelWinSound.wav",this);
//返回按钮
mypushbutton * backBtn = new mypushbutton(":/res/BackButton.png", ":/res/BackButtonSelected.png");//这两个图片有细微的差别,这样构成了一个动态的感觉
backBtn->setParent(this);
backBtn->move(this->width() - backBtn->width(),this->height() - backBtn->height());
//点击返回
connect(backBtn,&mypushbutton::clicked,[=](){
//点击了返回的音效
backSound->play();
qDebug()<<"点击了 游戏场景里面的 返回按键";
//告诉主场景,我返回了,主场景监听 chooseLeveScene 的返回按键
//延时发送信号
QTimer::singleShot(500,this,[=](){
emit this->chooseSceneBack();//激发信号 返回开始界面
});
});
//显示当前关卡数
QLabel * label = new QLabel;
label->setParent(this);//设置父亲
QFont font;//设置字体的对象
font.setFamily("华文新魏");//字体的格式
font.setPointSize(20);//字体大小为 20
//输出的标签显示的内容
QString str1=QString("Level: %1").arg(this->levelIndex);
//将字体的设置加入标签空间之中
label->setFont(font);
label->setText(str1);//设置关卡的标签显示的内容
//label->setFixedSize(20,20);//设置标签的大小
//label->move(100,500);//设置标签的显示的位置在哪里
label->setGeometry(30,this->height() -50 ,150,50);//这个上面 两个命令的合并的功能
dataconfig config;//第一个对象 获取关卡的数据
//初始化每个关卡的二维数组
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
this->gameArray[i][j]=config.mData[this->levelIndex][i][j];//赋值
}
}
//胜利的图片显示,
//开始的时候我们把他放到屏幕之外 等到胜利之后我们直接让他掉下来
QLabel * winLabel = new QLabel;
QPixmap tmaPix;
tmaPix.load(":/res/LevelCompletedDialogBg.png");//加载图片
winLabel->setGeometry(0,0,tmaPix.width(),tmaPix.height());//设置标签里面放置的位置
winLabel->setPixmap(tmaPix);//把图片放入到标签
winLabel->setParent(this);//设置标签的父亲
winLabel->move((this->width() - tmaPix.width())*0.5,-tmaPix.height());//设置标签在窗口的位置
//显示金币背景图案 灰色的方形框框
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
//绘制背景图片
QPixmap pix = QPixmap(":/res/BoardNode(1).png");//加载图片
QLabel * label = new QLabel;//新建一个标签
label->setGeometry(0,0,pix.width(),pix.height());//设置标签里面放置的位置
label->setPixmap(pix);//把图片放入到标签
label->setParent(this);//设置标签的父亲
label->move(57+i*50,200+j*50);//设置标签在窗口的位置
//创建金币
if(this->gameArray[i][j]==1)
{
//显示金币
str=":/res/Coin0001.png";
}
else
{
//显示银币
str=":/res/Coin0008.png";
}
MyCoin *coin = new MyCoin(str);//建立一个金币的对象,并且在这个里面加载图片
coin->setParent(this);//设置父亲,对于这个按钮 父亲为游戏显示场景
coin->move(59+ i*50, 204 + j*50);//移动金币的位置,与灰色的框框对齐
//给金币的属性赋值
coin->posX=i;//x 坐标
coin->posY=j;//y 坐标
coin->flag=this->gameArray[i][j];//正面是 1 反面是 0
//将金币放到 金币的二维数组里 以便后期的维护
coinBtn[i][j]=coin;//
//点击金币 进行翻转
//他的本质 继承的是 QPushButton
//监听点击信号
connect(coin,&MyCoin::clicked,[=](){
//翻金币的音效
flipSound->play();
coin->changeFlag();//点击之后进行翻转
this->gameArray[i][j]=(this->gameArray[i][j]==0 ? 1:0);
//加一个延时的翻转
QTimer::singleShot(100,this,[=](){
//翻转周围的金币
//周围的右侧金币翻转的条件
if(coin->posX+1 <=3)
{
coinBtn[coin->posX+1][coin->posY]->changeFlag();
this->gameArray[coin->posX+1][coin->posY] = (this->gameArray[coin->posX+1][coin->posY]==0 ? 1:0);
}
//周围的左侧金币翻转的条件
if(coin->posX-1 >=0)
{
coinBtn[coin->posX-1][coin->posY]->changeFlag();
this->gameArray[coin->posX-1][coin->posY] = (this->gameArray[coin->posX-1][coin->posY]==0 ? 1:0);
}
//周围的上侧金币翻转的条件
if(coin->posY+1 <=3)
{
coinBtn[coin->posX][coin->posY+1]->changeFlag();
this->gameArray[coin->posX][coin->posY+1] = (this->gameArray[coin->posX][coin->posY+1]==0 ? 1:0);
}
//周围的下侧金币翻转的条件
if(coin->posY-1 >=0)
{
coinBtn[coin->posX][coin->posY-1]->changeFlag();
this->gameArray[coin->posX][coin->posY-1] = (this->gameArray[coin->posX][coin->posY-1]==0 ? 1:0);
}
//判断是否胜利
this->isWin=true;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(coinBtn[i][j]->flag==false)
{
this->isWin=false;
break;
}
}
}
if(this->isWin==true)//胜利了
{
//游戏胜利的音效
winSound->play();
qDebug()<<"第"<ispaly=false;//金币按钮不可以使用
}
}
//创建一个动态对象
QPropertyAnimation * animation1 =new QPropertyAnimation(winLabel,"geometry");
//设置动画的事件间隔
animation1->setDuration(1000);
//起始位置
animation1->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
//结束位置
animation1->setEndValue(QRect(winLabel->x(),winLabel->y()+144,winLabel->width(),winLabel->height()));
//设置弹跳曲线
animation1->setEasingCurve(QEasingCurve::OutBounce);
//执行动画
animation1->start();
}
});
});
}
}
}
//QWidget中的paintEvent事件处理器可以在子类中被重写来接收绘图事件,然后在指定区域完成图形的绘制。
//重写paintEvent事件
void PlayScene::paintEvent(QPaintEvent * )
{
QPainter painter(this);//设置一个画家的对象
QPixmap pix;//定义一个图片的对象
pix.load(":res/PlayLevelSceneBg.png");//加载图片
//第一个参数 第二个参数 位置开始的位置 ,参数三 画家对象窗口的宽 ,参数四 画家对象窗口的高 参数五,要加载的图片
painter.drawPixmap(0,0,this->width(),this->height(),pix);//窗口设置图片 这个函数可以使图片的大小适应窗口的大小
//画背景图标
pix.load(":/res/Title.png");//再次加载一个图片
pix=pix.scaled(pix.width()*0.5,pix.height()*0.5);//得到一个缩放的图片
painter.drawPixmap(10,30,pix);//再次放置图片 开始的位置是10,30
}
13. register.h 账号密码的注册界面
#include "register.h"
#include "ui_register.h"
#include "sql.h"
Register::Register(QWidget *parent) :
QWidget(parent),
ui(new Ui::Register)
{
ui->setupUi(this);
Sql kk;
kk.Init(db);//初始化,保证数据库的存在
Init();
}
Register::~Register()
{
delete ui;
}
void Register::register_return_show()//当前界面显示
{
this->show();//显示当前界面
}
void Register::register_return_hide()//当前界面隐藏
{
this->hide();//隐藏当前界面
}
QString Register::getUser()//获取账号信息
{
QString a= ui->lineEdit_user1->text();//获取当前的账号信息
qDebug()<<"获取的账号信息 : "<lineEdit_pass1->text();//获取当前的密码信息
qDebug()<<"获取的密码信息 : "<addButton(ui->radioButton,0); //一个值为0
block1->addButton(ui->radioButton_2,1); //一个值为1
ui->radioButton->setChecked(1); //默认为男性
connect(ui->pushButton,&QPushButton::clicked,[=](){ //点击注册按钮,检测数据是否存在,检测的是账号 , 防止个人信息重复
QString a=getUser();//获取注册的账号
QString b=getPassword();//获取注册的密码
QString c=getSex();//获取注册的性别
int d=getAge();//获取注册的年龄
QString dd=QString::number(d);
People hh(a,b,c,dd);
Sql kk;//
bool oo = kk.addSql(hh,db);//往数据库增加数据
if(oo==false)
{
QMessageBox::warning(this,"提示信息","注册失败","确定");
qDebug()<<"注册信息失败!";
emit regsiter_close();//激发信号,注册界面关闭函数
}
else
{
QMessageBox::warning(this,"提示信息","注册成功","确定");
ui->lineEdit_pass1->clear();//清除原来的痕迹
ui->lineEdit_user1->clear();//清除原来的痕迹
emit regsiter_close();//激发信号,注册界面关闭函数
}
});
}
QString Register::getSex()//返回性别信息
{
qDebug()<<"进入返回性别";
if(ui->radioButton->isCheckable()==true)//选中的是男性
{
QString b("男");
qDebug()<<"获取的sex : "<radioButton_2->isCheckable()==true)//选中的是女性
{
QString b("女");
qDebug()<<"获取的sex : "<spinBox->value();//获取显示的年龄
qDebug()<<"获取的年龄: "<
14. sign_in.h 账号登录模块
#include "sign_in.h"
#include "ui_sign_in.h"
#include
Sign_in::Sign_in(QWidget *parent) :
QWidget(parent),
ui(new Ui::Sign_in)
{
ui->setupUi(this);
Init();
connect(ui->checkBox,&QCheckBox::stateChanged,[=](bool value){
//qDebug()<<"sdasda";
if(ui->checkBox->isChecked()==false)
{
lineEdit_pass_open();//开启密码保护
}
else
{
lineEdit_pass_close();//关闭密码保护
}
});
}
Sign_in::~Sign_in()
{
delete ui;
}
void Sign_in::sign_in_return_show()//显示当前界面显示函数
{
this->show();//界面显示函数
}
void Sign_in::sign_in_return_hide()//当前函数隐藏函数
{
this->hide();//界面隐藏函数
}
void Sign_in::lineEdit_pass_open()//开启密码保护
{
ui->lineEdit_pass->setEchoMode(QLineEdit::Password);//开启密码保护
}
void Sign_in::lineEdit_pass_close()//关闭密码保护
{
ui->lineEdit_pass->setEchoMode(QLineEdit::Normal);//关闭密码保护
}
QString Sign_in::getUser()//获取账号信息
{
QString a= ui->lineEdit_user->text();//获取当前的账号信息
return a;
}
QString Sign_in::getPassword()//获取密码信息
{
QString a= ui->lineEdit_pass->text();//获取当前的账号信息
return a;
}
void Sign_in::Init()//初始化函数, 功能: 建立信号的连接,(显示密码部分) (登录,注册按键部分) 占位符的提示语句
{
ui->lineEdit_user->setPlaceholderText("请输入账号");//占位符号,提示输入账号
ui->lineEdit_pass->setPlaceholderText("请输入密码");//占位符号,提示输入密码
register1 = new Register;//实例化对象 这个东西不能删
widget1 = new Widget;//实列化对象 主界面的类
lineEdit_pass_open();//开启密码保护
//QCheckBox
//注册按钮的信号连接
connect(ui->pushButton_register,&QPushButton::clicked,this,&Sign_in::sign_in_return_hide);//当按下注册按钮的时候 隐藏当前界面
connect(ui->pushButton_register,&QPushButton::clicked,[=](){ //当按下注册按钮的时候 显示注册界面
register1->show();
connect(register1,&Register::regsiter_close,[=](){ //当注册界面关闭的时候, 显示当前界面
this->show();//显示当前的窗口
register1->hide();//隐藏
});
});
//登录按钮的信号连接
connect(ui->pushButton_sign,&QPushButton::clicked,[=]{
Sql kk;
QString a1=getUser();//获取账号
QString a2=getPassword();//获取密码
People aa(a1,a2,"1","1");//后面两个数据不需要匹配
bool ok = kk.checkSql(aa,*(register1->getQsqlDatabase()));
if(ok == false)
{
qDebug()<<"账号密码错误";
QMessageBox::warning(this,"提示信息", "账号密码错误","确定");
}
else//登录成功
{
qDebug()<<"登陆成功";
this->close();//登录界面关闭
widget1->show();//显示主界面
}
});
}
15.sql.h 数据库sqlite3 模块
#include "sql.h"
#include
#include
Sql::Sql(QWidget *parent) : QWidget(parent)
{
}
void Sql::Init(QSqlDatabase &db)//初始化函数, 主要是 实例化对象 建立数据库, 第二个,
{
db = QSqlDatabase::addDatabase("QSQLITE"); //设置数据库驱动
/*----- 设置主机信息 -----*/
db.setDatabaseName("user.db"); //设置数据库名称
/*----- 读数据库操作 -----*/
bool ok = db.open();
if(ok==false)
{
qDebug()<< "打开数据库失败";
}
else
{
qDebug()<<"打开数据库成功";
}
//创建一个表 来存储信息
QSqlQuery sql(db);
QString str_sql = "create table user(user text primary key,pass text not null,sex text,age interger);";//唯一的账号, 密码不为空, QSting 类型的 sex int 类型的 age
if(sql.exec(str_sql) == false)
{
qDebug() << "执行SQL失败 建表失败:" << sql.lastError() << endl;
}
else
{
qDebug() << "执行成功SQL语句 建表成功" << endl;
}
}
bool Sql::addSql(People a,QSqlDatabase &db)//插入数据
{
QSqlQuery sql(db);
QString str_sql_insert = QString("insert into user values('%1','%2','%3','%4');").arg(a.m_user,a.m_passWord,a.m_sex,a.m_age);//生成语句
if(sql.exec(str_sql_insert) == false)
{
qDebug() << "执行SQL失败 插入数据失败:" << sql.lastError() << endl;
return false;
}
else
{
qDebug() << "执行成功SQL语句 插入数据成功" << endl;
return true;
}
}
bool Sql::deleteSql(People a,QSqlDatabase &db)//删除数据
{
}
bool Sql::checkSql(People a,QSqlDatabase &db)//检测是否含有这个数据正确
{
qDebug()<<"a.m_user: "<
16.start_home.h 智能家具模块
#include "start_home.h"
#include "ui_start_home.h"
#include
start_home::start_home(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::start_home)
{
ui->setupUi(this);
lianjie=false;
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(slot_lianjie()));
TcpSocket = new QTcpSocket(this);
//按钮颜色初始化
ui->pushButton_master_bedroom->setStyleSheet(" background-color: rgb(255, 255, 255);");
ui->pushButton_living_room->setStyleSheet(" background-color: rgb(255, 255, 255);");
ui->pushButton_secondary_bedroom->setStyleSheet(" background-color: rgb(255, 255, 255);");
ui->pushButton_kitchen->setStyleSheet(" background-color: rgb(255, 255, 255);");
ui->pushButton_wc->setStyleSheet(" background-color: rgb(255, 255, 255);");
ui->pushButton_corridor->setStyleSheet(" background-color: rgb(255, 255, 255);");
ui->pushButton_balcony->setStyleSheet(" background-color: rgb(255, 255, 255);");
}
void start_home::slot_surface_show()//界面显示槽函数函数
{
this->show();//当前界面显示
}
void start_home::slot_lianjie()//连接服务器
{
if(ui->pushButton->text()=="连接")
{
QString ip=ui->lineEdit->text();
QString port=ui->lineEdit_2->text();
int hh=port.toInt();
if(ip=="" || port=="")
{
QMessageBox::warning(this,"提示窗口","参数错误","确定");
return;
}
connect(TcpSocket,SIGNAL(connected()),this,SLOT(slot_connected()));
TcpSocket->connectToHost(QHostAddress(ip),hh);//连接服务器
}
else
{
lianjie=false;
disconnect(TcpSocket,SIGNAL(connected()),this,SLOT(slot_connected()));
disconnect(TcpSocket,SIGNAL(readyRead()),this,SLOT(slot_TcpSocket_readyRead()));
// delete TcpSocket;
ui->pushButton->setText("连接");
delete TcpSocket;
TcpSocket = new QTcpSocket(this);
}
}
void start_home::slot_connected()//连接成功
{
//QMessageBox::warning(this,"提示窗口","连接成功","确定");
lianjie=true;
connect(TcpSocket,SIGNAL(readyRead()),this,SLOT(slot_TcpSocket_readyRead()));
ui->pushButton->setText("断开连接");
}
start_home::~start_home()
{
delete ui;
}
void start_home::receive_number(int a)//接收信号做出反应
{
if(a==1)//客厅灯开
{
if(ui->pushButton_living_room->text()=="关")
{
on_pushButton_living_room_clicked();//变为打开
//send_number(1);//保证客户端也为 开
}
}
else if(a==2) //客厅灯关
{
if(ui->pushButton_living_room->text()=="开")
{
on_pushButton_living_room_clicked();//变为关闭
//send_number(2);//保证客户端也为 关闭
}
}
//
else if(a==3) //主卧灯开
{
if(ui->pushButton_master_bedroom->text()=="关")
{
on_pushButton_master_bedroom_clicked();//变为开启
//send_number(3);//保证客户端也为 开
}
}
else if(a==4)
{
if(ui->pushButton_master_bedroom->text()=="开")
{
on_pushButton_master_bedroom_clicked();//变为开启
//send_number(4);//4 关闭
}
}
//
else if(a==5) //次卧灯开
{
if(ui->pushButton_secondary_bedroom->text()=="关")
{
on_pushButton_secondary_bedroom_clicked();//变为开启
//send_number(5);//保证客户端也为 开
}
}
else if(a==6)
{
if(ui->pushButton_secondary_bedroom->text()=="开")
{
on_pushButton_secondary_bedroom_clicked();//变为开启
// send_number(6);//4 关闭
}
}
//
else if(a==7) //厨房灯开
{
if(ui->pushButton_kitchen->text()=="关")
{
on_pushButton_kitchen_clicked();//变为开启
//send_number(7);//保客户端也为 开
}
}
else if(a==8)
{
if(ui->pushButton_kitchen->text()=="开")
{
on_pushButton_kitchen_clicked();//变为开启
//send_number(8);//4 关闭
}
}
//
else if(a==9) //厕所灯开
{
if(ui->pushButton_wc->text()=="关")
{
on_pushButton_wc_clicked();//变为开启
// send_number(9);//保客户端也为 开
}
}
else if(a==10)
{
if(ui->pushButton_wc->text()=="开")
{
on_pushButton_wc_clicked();//变为开启
//send_number(10);//4 关闭
}
}
//
else if(a==11) //厕所灯开
{
if(ui->pushButton_corridor->text()=="关")
{
on_pushButton_corridor_clicked();//变为开启
//send_number(11);//保客户端也为 开
}
}
else if(a==12)
{
if(ui->pushButton_corridor->text()=="开")
{
on_pushButton_corridor_clicked();//变为开启
//send_number(12);//4 关闭
}
}
//
else if(a==13) //阳台灯开
{
if(ui->pushButton_balcony->text()=="关")
{
on_pushButton_balcony_clicked();//变为开启
//send_number(13);//保客户端也为 开
}
}
else if(a==14)
{
if(ui->pushButton_balcony->text()=="开")
{
on_pushButton_balcony_clicked();//变为开启
// send_number(14);//4 关闭
}
}
}
void start_home::send_number(int a)//发送信号
{
if(lianjie==true)
{
qDebug()<<"发送信号:"<write(aa);//向服务器发送数据
}
}
void start_home::slot_TcpSocket_readyRead()
{
QByteArray buf = TcpSocket->readAll();
int a1=buf.toInt();
if(a1>15)
{
if(buf.size()==10)
{
QString pp(buf);
QString yy;
yy=pp[0];
int a2=yy.toInt();
yy=pp[1];
int a3=yy.toInt();
yy=pp[2];
int a4=yy.toInt();
yy=pp[3];
int a5=yy.toInt();
yy=pp[4];
int a6=yy.toInt();
yy=pp[5];
int a7=yy.toInt();
yy=pp[6];
int a8=yy.toInt();
yy=pp[7];
int a9=yy.toInt();
yy=pp[8];
int a0=yy.toInt();
yy=pp[9];
int a10=yy.toInt();
receive_number(a2);
receive_number(a3);
receive_number(a4);
receive_number(a5);
receive_number(a6*10+a7);
receive_number(a8*10+a9);
receive_number(a0*10+a10);
}
else if(buf.size()==9)
{
QString pp(buf);
QString yy;
yy=pp[0];
int a2=yy.toInt();
yy=pp[1];
int a3=yy.toInt();
yy=pp[2];
int a4=yy.toInt();
yy=pp[3];
int a5=yy.toInt();
yy=pp[4];
int a6=yy.toInt();
yy=pp[5];
int a7=yy.toInt();
yy=pp[6];
int a8=yy.toInt();
yy=pp[7];
int a9=yy.toInt();
yy=pp[8];
int a0=yy.toInt();
receive_number(a2);
receive_number(a3);
receive_number(a4);
receive_number(a5);
receive_number(a6);
receive_number(a7*10+a8);
receive_number(a9*10+a0);
}
}
else
{
receive_number(a1);
}
qDebug() << "消息接收成功"<pushButton_living_room->text()=="关")
{
ui->label_lamp_living_room->setPixmap(QPixmap(":/image/image/发光灯泡.png"));
ui->pushButton_living_room->setText("开");
ui->pushButton_living_room->setStyleSheet(" background-color: rgb(239, 239, 119);");
send_number(1);
}
else if(ui->pushButton_living_room->text()=="开")
{
ui->label_lamp_living_room->setPixmap(QPixmap(":/image/image/关灯.png"));
ui->pushButton_living_room->setText("关");
ui->pushButton_living_room->setStyleSheet(" background-color: rgb(255, 255, 255);");
send_number(2);
}
}
//主卧
void start_home::on_pushButton_master_bedroom_clicked()
{
if(ui->pushButton_master_bedroom->text()=="关")
{
ui->label_lamp_master_bedroom->setPixmap(QPixmap(":/image/image/发光灯泡.png"));
ui->pushButton_master_bedroom->setText("开");
ui->pushButton_master_bedroom->setStyleSheet(" background-color: rgb(239, 239, 119);");
send_number(3);
}
else if(ui->pushButton_master_bedroom->text()=="开")
{
ui->label_lamp_master_bedroom->setPixmap(QPixmap(":/image/image/关灯.png"));
ui->pushButton_master_bedroom->setText("关");
ui->pushButton_master_bedroom->setStyleSheet(" background-color: rgb(255, 255, 255);");
send_number(4);
}
}
//次卧
void start_home::on_pushButton_secondary_bedroom_clicked()
{
if(ui->pushButton_secondary_bedroom->text()=="关")
{
ui->label_lamp_secondary_bedroom->setPixmap(QPixmap(":/image/image/发光灯泡.png"));
ui->pushButton_secondary_bedroom->setText("开");
ui->pushButton_secondary_bedroom->setStyleSheet(" background-color: rgb(239, 239, 119);");
send_number(5);
}
else if(ui->pushButton_secondary_bedroom->text()=="开")
{
ui->label_lamp_secondary_bedroom->setPixmap(QPixmap(":/image/image/关灯.png"));
ui->pushButton_secondary_bedroom->setText("关");
ui->pushButton_secondary_bedroom->setStyleSheet(" background-color: rgb(255, 255, 255);");
send_number(6);
}
}
//厨房
void start_home::on_pushButton_kitchen_clicked()
{
if(ui->pushButton_kitchen->text()=="关")
{
ui->label_lamp_kitchen->setPixmap(QPixmap(":/image/image/发光灯泡.png"));
ui->pushButton_kitchen->setText("开");
ui->pushButton_kitchen->setStyleSheet(" background-color: rgb(239, 239, 119);");
send_number(7);
}
else if(ui->pushButton_kitchen->text()=="开")
{
ui->label_lamp_kitchen->setPixmap(QPixmap(":/image/image/关灯.png"));
ui->pushButton_kitchen->setText("关");
ui->pushButton_kitchen->setStyleSheet(" background-color: rgb(255, 255, 255);");
send_number(8);
}
}
//厕所
void start_home::on_pushButton_wc_clicked()
{
if(ui->pushButton_wc->text()=="关")
{
ui->label_lamp_wc->setPixmap(QPixmap(":/image/image/发光灯泡.png"));
ui->pushButton_wc->setText("开");
ui->pushButton_wc->setStyleSheet(" background-color: rgb(239, 239, 119);");
send_number(9);
}
else if(ui->pushButton_wc->text()=="开")
{
ui->label_lamp_wc->setPixmap(QPixmap(":/image/image/关灯.png"));
ui->pushButton_wc->setText("关");
ui->pushButton_wc->setStyleSheet(" background-color: rgb(255, 255, 255);");
send_number(10);
}
}
//走廊
void start_home::on_pushButton_corridor_clicked()
{
if(ui->pushButton_corridor->text()=="关")
{
ui->label_lamp_corridor->setPixmap(QPixmap(":/image/image/发光灯泡.png"));
ui->pushButton_corridor->setText("开");
ui->pushButton_corridor->setStyleSheet(" background-color: rgb(239, 239, 119);");
send_number(11);
}
else if(ui->pushButton_corridor->text()=="开")
{
ui->label_lamp_corridor->setPixmap(QPixmap(":/image/image/关灯.png"));
ui->pushButton_corridor->setText("关");
ui->pushButton_corridor->setStyleSheet(" background-color: rgb(255, 255, 255);");
send_number(12);
}
}
void start_home::on_pushButton_balcony_clicked()
{
if(ui->pushButton_balcony->text()=="关")
{
ui->label_lamp_balcony->setPixmap(QPixmap(":/image/image/发光灯泡.png"));
ui->pushButton_balcony->setText("开");
ui->pushButton_balcony->setStyleSheet(" background-color: rgb(239, 239, 119);");
send_number(13);
}
else if(ui->pushButton_balcony->text()=="开")
{
ui->label_lamp_balcony->setPixmap(QPixmap(":/image/image/关灯.png"));
ui->pushButton_balcony->setText("关");
ui->pushButton_balcony->setStyleSheet(" background-color: rgb(255, 255, 255);");
send_number(14);
}
}
void start_home::on_pushButton_yuyin_clicked()
{
this->hide();
emit enter_audio4();//进入语音识别
}
void start_home::on_pushButton_tianqi_clicked()
{
this->hide();
emit enter_weather4();//进入天气预报
}
void start_home::on_pushButton_jiankong_clicked()
{
this->hide();
emit enter_tcp4();//进入远程监控
}
void start_home::on_pushButton_yinyue_clicked()
{
this->hide();
emit enter_music4();//进入音乐播放
}
void start_home::on_pushButton_kuaile_clicked()
{
this->hide();
emit enter_luck_draw4();//进入快乐一天
}
void start_home::on_pushButton_surface_clicked()
{
this->hide();
emit home_hide4();//当前界面隐藏,主界面显示信号
}
17.tcp_image.h 远程监控模块
#include "tcp_image.h"
#include "ui_tcp_image.h"
TCP_image::TCP_image(QWidget *parent) :
QWidget(parent),
ui(new Ui::TCP_image)
{
ui->setupUi(this);
TCP_state=false;//连接状态为 无连接
display_state=false;//没有播放
}
TCP_image::~TCP_image()
{
delete ui;
}
void TCP_image::slot_surface_show()//界面显示槽函数函数
{
this->show();//当前界面显示
}
void TCP_image::analysis_Json(QByteArray data)//解析JSON
{
qDebug()<<"进入解析模块";
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(data,&err);
if(err.error != QJsonParseError::NoError) //检测是否是json格式
{
qDebug()<<"json error";
}
QJsonObject obj = doc.object();
qDebug()<<"输出obj :"<listWidget->addItem(QString("服务器说: "+ aa));
}
void TCP_image::analysis_Qstring(QJsonObject obj)//解析语句
{
for(int i=0;i<100;i++)
{
qDebug()<<"进入图片解析";
}
int kk=obj["size"].toInt();
QString hh=obj["QString"].toString();//解析的
qDebug()<<"hh= "<listWidget->addItem(QString("服务器说: "+ hh));
}
void TCP_image::analysis_image(QJsonObject obj)//解析图片
{
qDebug()<<"进入图片解析";
int kk=obj["size"].toInt();
qDebug()<<"size:=="<label_1->setPixmap(QPixmap::fromImage(image));
}
}
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
void TCP_image::slot_TcpSocket_readyRead()
{
qDebug()<<"接收数据成功";
static u8 type = 0; //接收到0xAA,我的长度来了
static size_t size = 0;
static QByteArray data;
if(size == 0)
{
TcpSocket->read((char *)&type,sizeof(type)); //读取类型
if(type == 0xAA)
{
TcpSocket->read((char *)&size,sizeof(size)); //读取类型
data.clear();
type = 0;
}
}
if(size > 0)
{
QByteArray buf = TcpSocket->read(size); //读取类型
data.append(buf);
size -= buf.size();
if(size <= 0)
{
qDebug()<<"接收成功";
analysis_Json(data);//解析JSON
}
}
}
#include
void TCP_image::on_pushButton_clicked()//连接
{
if(TCP_state==false)
{
QString ip=ui->lineEdit->text();
QString port=ui->lineEdit_2->text();
if(ip=="" || port=="")
{
ui->listWidget->addItem("参数不完整");
return;
}
int kk=port.toInt();
TcpSocket = new QTcpSocket(this);
TcpSocket->connectToHost(QHostAddress(ip),kk);
connect(TcpSocket,SIGNAL(readyRead()),this,SLOT(slot_TcpSocket_readyRead()));
connect(TcpSocket,&QTcpSocket::connected,[=](){
ui->pushButton->setText("断开连接");
TCP_state=true;
ui->listWidget->addItem("连接成功");
});
}
else
{
disconnect(TcpSocket,SIGNAL(readyRead()),this,SLOT(slot_TcpSocket_readyRead()));
delete TcpSocket;
ui->pushButton->setText("连接");
TCP_state=false;
ui->listWidget->addItem("已经断开连接");
}
}
void TCP_image::on_pushButton_3_clicked()
{
if(display_state==false)
{
ui->pushButton_3->setText("关闭监控");
display_state=true;
ui->listWidget->addItem("监控已经打开");
}
else
{
ui->pushButton_3->setText("打开监控");
display_state=false;
ui->listWidget->addItem("监控已经关闭");
}
}
void TCP_image::on_pushButton_yuyin_clicked()
{
this->hide();
emit enter_audio5();//进入语音识别
}
void TCP_image::on_pushButton_jiaju_clicked()
{
this->hide();
emit enter_home5();//进入智能家具
}
void TCP_image::on_pushButton_tianqi_clicked()
{
this->hide();
emit enter_weather5();//进入天气预报
}
void TCP_image::on_pushButton_yinyue_clicked()
{
this->hide();
emit enter_audio5();//进入语音识别
}
void TCP_image::on_pushButton_kuaile_clicked()
{
this->hide();
emit enter_luck_draw5();//进入快乐一天
}
void TCP_image::on_pushButton_surface_clicked()
{
this->hide();
emit TCP_hide5();//当前界面隐藏,主界面显示信号
}
18.weather_forecast.h 天气预报模块
#include "weather_forecast.h"
#include "ui_weather_forecast.h"
weather_forecast::weather_forecast(QWidget *parent) :
QWidget(parent),
ui(new Ui::weather_forecast)
{
ui->setupUi(this);
http = new QNetworkAccessManager(this);//建立对象
connect(ui->pushButton_xunze,&QPushButton::clicked,[=](){
QString location = ui->comboBox->currentText();//获得当前序列的选中的文字
//三天的 加上https://api.seniverse.com/v3/weather/daily.json?key=SdwOKTQhOrW7xQRvc&location=%1&language=zh-Hans&unit=c&start=0&days=3
//一天的 https://api.seniverse.com/v3/weather/now.json?key=SdwOKTQhOrW7xQRvc&location=%1&language=zh-Hans&unit=c
QString ask = QString("https://api.seniverse.com/v3/weather/daily.json?key=心智天气获取&location=%1&language=zh-Hans&unit=c&start=0&days=3").arg(location);
qDebug()<<"请求网址: "<get(QNetworkRequest(QUrl(ask)));
ui->listWidget_word1->clear();//清除
ui->listWidget_word2->clear();//清除
ui->listWidget_word3->clear();//清除
ui->listWidget_city->clear();//清除
});
connect(http,&QNetworkAccessManager::finished,[=](QNetworkReply * reply)
{
get_forecast_three(reply);//获取三天的天气
});
emit ui->pushButton_xunze->clicked();//进入的时候自动获取第一次 数据
set_hour_min();//开始的时候设置时间
timer.start(30000);//1/2分钟的闹钟
connect(&timer,SIGNAL(timeout()),this,SLOT(set_hour_min()));
}
weather_forecast::~weather_forecast()
{
delete ui;
}
void weather_forecast::slot_surface_show()//界面显示槽函数函数
{
this->show();//当前界面显示
}
void weather_forecast::setHide()//设置这个界面隐藏
{
this->hide();//隐藏界面
}
void weather_forecast::setShow()//设置这个界面显示
{
this->show();//显示这个界面
}
void weather_forecast::set_hour_min()//设置现在的时间
{
QTime current_time =QTime::currentTime();
int hour = current_time.hour(); //当前的小时
int minute = current_time.minute();//当前的分钟
ui->lcdNumber_1->display(hour);//设置小时
ui->lcdNumber_3->display(minute);//设置分钟
}
void weather_forecast::get_forecast(QNetworkReply * reply)//获取今天的天气预报
{
QByteArray text = reply->readAll();//读取所有的数据
QJsonObject json = QJsonDocument::fromJson(text).object();//获取json 源码
qDebug()<readAll();//读取所有的数据
QJsonObject json = QJsonDocument::fromJson(text).object();//获取json 源码
qDebug()<listWidget_city->addItem(name);//ui界面设置地点
//获取每天的天气
//第一天
QString time_1 =json["results"].toArray()[0].toObject()["daily"].toArray()[0].toObject()["date"].toString();//解析 Json 的代码 获取第一天的时间
int code_day_1=json["results"].toArray()[0].toObject()["daily"].toArray()[0].toObject()["code_day"].toString().toInt();//解析 Json 的代码 获取第一天的白天的天气的编码
int code_night_1=json["results"].toArray()[0].toObject()["daily"].toArray()[0].toObject()["code_night"].toString().toInt();//解析 Json 的代码 获取第一天的晚上的天气的编码
QString temp_high_1=json["results"].toArray()[0].toObject()["daily"].toArray()[0].toObject()["high"].toString();//解析 Json 的代码 获取第一天的最高温度
QString temp_low_1=json["results"].toArray()[0].toObject()["daily"].toArray()[0].toObject()["low"].toString();//解析 Json 的代码 获取第一天的最低温度
QString text_day_1=json["results"].toArray()[0].toObject()["daily"].toArray()[0].toObject()["text_day"].toString();//解析 Json 的代码 获取第一天的最低温度
QString text_night_1=json["results"].toArray()[0].toObject()["daily"].toArray()[0].toObject()["text_night"].toString();//解析 Json 的代码 获取第一天的最低温度
//第二天
QString time_2 =json["results"].toArray()[0].toObject()["daily"].toArray()[1].toObject()["date"].toString();//解析 Json 的代码 获取第2天的时间
int code_day_2=json["results"].toArray()[0].toObject()["daily"].toArray()[1].toObject()["code_day"].toString().toInt();//解析 Json 的代码 获取第2天的白天的天气的编码
int code_night_2=json["results"].toArray()[0].toObject()["daily"].toArray()[1].toObject()["code_night"].toString().toInt();//解析 Json 的代码 获取第2天的晚上的天气的编码
QString temp_high_2=json["results"].toArray()[0].toObject()["daily"].toArray()[1].toObject()["high"].toString();//解析 Json 的代码 获取第2天的最高温度
QString temp_low_2=json["results"].toArray()[0].toObject()["daily"].toArray()[1].toObject()["low"].toString();//解析 Json 的代码 获取第2天的最低温度
QString text_day_2=json["results"].toArray()[0].toObject()["daily"].toArray()[1].toObject()["text_day"].toString();//解析 Json 的代码 获取第2天的最低温度
QString text_night_2=json["results"].toArray()[0].toObject()["daily"].toArray()[1].toObject()["text_night"].toString();//解析 Json 的代码 获取第2天的最低温度
//第3天
QString time_3 =json["results"].toArray()[0].toObject()["daily"].toArray()[2].toObject()["date"].toString();//解析 Json 的代码 获取第3天的时间
int code_day_3=json["results"].toArray()[0].toObject()["daily"].toArray()[2].toObject()["code_day"].toString().toInt();//解析 Json 的代码 获取第3天的白天的天气的编码
int code_night_3=json["results"].toArray()[0].toObject()["daily"].toArray()[2].toObject()["code_night"].toString().toInt();//解析 Json 的代码 获取第3天的晚上的天气的编码
QString temp_high_3=json["results"].toArray()[0].toObject()["daily"].toArray()[2].toObject()["high"].toString();//解析 Json 的代码 获取第3天的最高温度
QString temp_low_3=json["results"].toArray()[0].toObject()["daily"].toArray()[2].toObject()["low"].toString();//解析 Json 的代码 获取第3天的最低温度
QString text_day_3=json["results"].toArray()[0].toObject()["daily"].toArray()[2].toObject()["text_day"].toString();//解析 Json 的代码 获取第3天的最低温度
QString text_night_3=json["results"].toArray()[0].toObject()["daily"].toArray()[2].toObject()["text_night"].toString();//解析 Json 的代码 获取第3天的最低温度
qDebug()<<"time= "<
19. widget .h 主界面类
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
/*** 实列化对象***/
audio = new Audio;
luck = new luck_draw;
music = new Misic_display;
weather = new weather_forecast;
home= new start_home;
tcp = new TCP_image;
/*** 建立返回主界面的信号连接 ***/
connect(audio,SIGNAL(audio_hide1()),this,SLOT(slot_widge_show()));//返回信号
connect(luck,SIGNAL(luck_hide2()),this,SLOT(slot_widge_show()));//返回信号
connect(music,SIGNAL(music_hide3()),this,SLOT(slot_widge_show()));//返回信号
connect(weather,SIGNAL(weather_hide6()),this,SLOT(slot_widge_show()));//返回信号
connect(home,SIGNAL(home_hide4()),this,SLOT(slot_widge_show()));//返回信号
connect(tcp,SIGNAL(TCP_hide5()),this,SLOT(slot_widge_show()));//返回信号
connect(weather,SIGNAL(enter_audio6()),this,SLOT(on_pushButton_6_clicked()));
connect(weather,SIGNAL(enter_home6()),this,SLOT(on_pushButton_5_clicked()));
connect(weather,SIGNAL(enter_tcp6()),this,SLOT(on_pushButton_4_clicked()));
connect(weather,SIGNAL(enter_luck_draw6()),this,SLOT(on_pushButton_3_clicked()));
connect(weather,SIGNAL(enter_music6()),this,SLOT(on_pushButton_2_clicked()));
//connect(audio,SIGNAL(enter_audio1()),this,SLOT(on_pushButton_6_clicked()));
connect(audio,SIGNAL(enter_home1()),this,SLOT(on_pushButton_5_clicked()));
connect(audio,SIGNAL(enter_tcp1()),this,SLOT(on_pushButton_4_clicked()));
connect(audio,SIGNAL(enter_luck_draw1()),this,SLOT(on_pushButton_3_clicked()));
connect(audio,SIGNAL(enter_music1()),this,SLOT(on_pushButton_2_clicked()));
connect(audio,SIGNAL(enter_weather1()),this,SLOT(on_pushButton_clicked()));
connect(luck,SIGNAL(enter_audio2()),this,SLOT(on_pushButton_6_clicked()));
connect(luck,SIGNAL(enter_home2()),this,SLOT(on_pushButton_5_clicked()));
connect(luck,SIGNAL(enter_tcp2()),this,SLOT(on_pushButton_4_clicked()));
//connect(audio,SIGNAL(enter_luck_draw1()),this,SLOT(on_pushButton_3_clicked()));
connect(luck,SIGNAL(enter_music2()),this,SLOT(on_pushButton_2_clicked()));
connect(luck,SIGNAL(enter_weather2()),this,SLOT(on_pushButton_clicked()));
connect(music,SIGNAL(enter_audio3()),this,SLOT(on_pushButton_6_clicked()));
connect(music,SIGNAL(enter_home3()),this,SLOT(on_pushButton_5_clicked()));
connect(music,SIGNAL(enter_tcp3()),this,SLOT(on_pushButton_4_clicked()));
connect(music,SIGNAL(enter_luck_draw3()),this,SLOT(on_pushButton_3_clicked()));
//connect(music,SIGNAL(enter_music3()),this,SLOT(on_pushButton_2_clicked()));
connect(music,SIGNAL(enter_weather3()),this,SLOT(on_pushButton_clicked()));
connect(home,SIGNAL(enter_audio4()),this,SLOT(on_pushButton_6_clicked()));
//connect(home,SIGNAL(enter_home4()),this,SLOT(on_pushButton_5_clicked()));
connect(home,SIGNAL(enter_tcp4()),this,SLOT(on_pushButton_4_clicked()));
connect(home,SIGNAL(enter_luck_draw4()),this,SLOT(on_pushButton_3_clicked()));
connect(home,SIGNAL(enter_music4()),this,SLOT(on_pushButton_2_clicked()));
connect(home,SIGNAL(enter_weather4()),this,SLOT(on_pushButton_clicked()));
connect(tcp,SIGNAL(enter_audio5()),this,SLOT(on_pushButton_6_clicked()));
connect(tcp,SIGNAL(enter_home5()),this,SLOT(on_pushButton_5_clicked()));
connect(tcp,SIGNAL(enter_tcp5()),this,SLOT(on_pushButton_4_clicked()));
connect(tcp,SIGNAL(enter_luck_draw5()),this,SLOT(on_pushButton_3_clicked()));
connect(tcp,SIGNAL(enter_music5()),this,SLOT(on_pushButton_2_clicked()));
connect(tcp,SIGNAL(enter_weather5()),this,SLOT(on_pushButton_clicked()));
//语音控制 智能家具装置
connect(audio,SIGNAL(control_home(int)),home,SLOT(receive_number(int)));
//语音控制 音乐
connect(audio,SIGNAL(control_music_open()),music,SLOT(on_pushButton_3_clicked()));
connect(audio,SIGNAL(control_music_close()),music,SLOT(on_pushButton_4_clicked()));
connect(audio,SIGNAL(control_shangyishou()),music,SLOT(on_pushButton_2_clicked()));
connect(audio,SIGNAL(control_xiayishou()),music,SLOT(on_pushButton_5_clicked()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::slot_widge_show()//主界面显示函数
{
this->show();// 显示主界面
}
void Widget::on_pushButton_3_clicked()//开心一天
{
this->hide();//主界面隐藏
luck->show();//显示 快乐一天
}
void Widget::on_pushButton_clicked()//天气预报
{
this->hide();//主界面隐藏
weather->show();//显示天气预报界面
}
void Widget::on_pushButton_2_clicked()//音乐播放
{
this->hide();//主界面隐藏
music->show();//显示播放界面
}
void Widget::on_pushButton_4_clicked()//监控
{
this->hide();//主界面隐藏
tcp->show();//显示远程监控界面
}
void Widget::on_pushButton_5_clicked()//家具控制
{
this->hide();//主界面隐藏
home->show();//显示家具控制界面
}
void Widget::on_pushButton_6_clicked()//小刘同学
{
this->hide();//主界面隐藏
audio->show();//显示语音识别的界面
if(kkkk==0)
{
audio->bofang_liu();
kkkk=1;
}
}
void Widget::on_pushButton_7_clicked()//显示游戏
{
www = new Mainsence;
www->show();
}
void Widget::on_pushButton_2048_clicked()
{
kkk=new MainWindow;
kkk->show();
}
20.mian.cpp
#include "widget.h"
#include
#include "sign_in.h"
#include "weather_forecast.h"
#include "misic_display.h"
#include "luck_draw.h"
#include "camera.h"
#include "start_home.h"
#include "tcp_image.h"
#include "audio.h"
#include "entry_mode.h"
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Mainsence w;//游戏界面
// w.show();
Entry_mode w;//选择登陆模式
w.show();
//Audio w;//语音识别
//w.show();
//TCP_image w;//视屏监控
//w.show();
//start_home w;//智能家居
//w.show();
//Sign_in w;//登录界面
//w.show();
//weather_forecast w;//天气预报
//w.show();
//Misic_display w;//音乐播放
//w.show();
//luck_draw w;//快了一天
//w.show();
//Camera w;//人脸识别
//w.show();
//Widget w;//主界面
//w.show();
//MainWindow w;//游戏2048
//w.show();
return a.exec();
}
audio.ui
Audio
0
0
800
760
800
760
800
760
Audio
0
10
801
781
20
180
661
71
文字转语音
-
-
转换
20
130
661
31
-
开始录制
-
播放音频
-
识别音频
-
30
270
611
421
10
10
371
91
系统可用设备表
-
-
输入设备
-
-
-
输出设备
-
660
530
141
211
界面切换
-
天气预报界面
-
智能家具界面
-
远程监控界面
-
音乐播放界面
-
快乐一下界面
-
返回主界面
0
-50
811
801
background-image: url(:/image/image/11.webp);
label_5
groupBox_2
layoutWidget
textEdit_JSON
groupBox
groupBox_3
camera.ui
Camera
0
0
800
760
800
760
800
760
Camera
40
150
372
310
372
310
372
310
false
320
470
93
28
拍照
450
160
261
251
照片
true
Qt::AlignCenter
40
470
273
30
-
-
摄像头列表
-
-
打开摄像头
30
540
351
131
注册信息填写
-
-
分组:
-
-
Student
-
Teacher
-
Qt::Horizontal
40
20
-
-
用户id
-
输入数字_字母或下划线
-
-
姓名:
-
400
540
321
131
功能按钮
20
20
93
28
注册
120
20
93
28
登录
0
0
800
26
QVideoWidget
QWidget
qvideowidget.h
1
entry_mode.ui
Entry_mode
0
0
491
343
0
0
500
378
Form
60
50
371
261
190
170
131
51
账号登录
20
170
131
51
人脸识别登录
50
30
251
71
23
75
true
进入方式选择
1
4
491
341
background-image: url(:/image/image/22.webp);
label_2
widget
luck_draw.ui
luck_draw
0
0
800
760
800
760
800
760
Form
0
0
671
71
background:transparent
奖励
一等奖
二等奖
三等奖
幸运奖
谢谢参与
-
自助走起
-
游戏时间
-
零食很忙
-
睡一下午
-
搞学习
660
540
141
211
界面切换
-
天气预报界面
-
智能家居界面
-
远程监控界面
-
音乐播放界面
-
语音识别界面
-
返回主界面
mainsence.ui
Mainsence
0
0
400
300
Mainsence
0
0
400
26
开始
TopToolBarArea
false
退出
mainwinddow.ui
MainWindow
0
0
421
324
MainWindow
20
138
181
121
微软雅黑
26
0秒
220
140
191
121
微软雅黑
26
0分
0
0
201
131
微软雅黑
14
75
true
Classic
0
0
421
26
Game Mode
Score
Help
Classic
1min
123
Time Limited
Score
Help
Drunk Mode
8402
Challenge
Max Number
Number LImited
Fast Mode
misic_disolay.ui
Misic_display
0
0
800
760
800
760
800
760
音乐播放器
*{
border:none;
}
QPushButton:hover
{
;
background-color: rgb(255, 10, 83);
}
10
0
591
751
502
574
91
31
-
顺序播放
-
列表循环
-
单曲循环
10
509
411
37
-
75
true
00:00
-
Qt::Horizontal
40
20
-
75
true
00:00
0
580
501
128
0
64
16777215
128
-
64
64
64
64
background-image: url(:/image/image/添加.png);
-
64
64
64
64
background-image: url(:/image/image/快退 上一个.png);
-
64
64
64
64
background-image: url(:/image/image/视频-开始-播放.png);
-
64
64
64
64
background-image: url(:/image/image/暂停播放.png);
-
64
64
64
64
background-image: url(:/image/image/快进.png);
0
0
501
491
background:transparent
510
360
22
160
Qt::Vertical
0
560
421
22
Qt::Horizontal
502
556
64
16
75
true
播放模式
470
520
123
22
-
9
75
true
音量
-
8
75
true
50
500
620
72
15
75
true
倍速
Qt::AlignCenter
500
640
87
22
-
1
-
2
-
3
-
4
layoutWidget
comboBox
widget_2
widget
listWidget
verticalSlider
horizontalSlider
label_5
label_2
comboBox_2
1
4
791
751
background-image: url(:/image/image/动漫美女.jpeg);
650
540
141
211
界面切换
-
语音识别界面
-
智能家具界面
-
远程监控界面
-
天气预报界面
-
快乐一下界面
-
返回主界面
label
widget_3
groupBox_3
register.ui
Register
0
0
640
360
640
360
640
360
微软雅黑
12
50
false
注册界面
100
30
421
321
60
0
301
61
20
75
true
注册界面
Qt::AlignCenter
70
60
301
241
-
-
75
true
账号
-
请输入账号
-
-
75
true
密码
-
请输入密码
-
-
75
true
性别
-
75
true
男
-
75
true
女
-
-
75
true
年龄
-
-
75
true
注册
1
4
641
351
background-image: url(:/res/regsiter.png);
label_6
widget
sign_in.ui
Sign_in
0
0
640
360
640
360
640
360
微软雅黑
12
50
false
登陆界面
130
10
341
321
40
40
281
61
16
75
true
智能家居系统
Qt::AlignCenter
40
120
281
191
-
-
账号
-
-
-
密码
-
-
显示密码
-
-
登录
-
注册
0
4
641
361
Qt::NoContextMenu
background-image: url(:/res/sign_in.png);
label_4
widget
start_home.ui
start_home
0
0
651
698
智能家居
450
0
20
471
Qt::Vertical
370
10
75
60
75
60
:/image/image/关灯.png
true
313
0
75
111
Qt::Vertical
320
100
91
20
Qt::Horizontal
390
70
31
16
厕所
210
10
75
60
75
60
75
60
:/image/image/关灯.png
true
153
10
20
101
Qt::Vertical
160
100
71
16
Qt::Horizontal
260
100
61
20
Qt::Horizontal
230
70
31
16
厨房
0
110
118
3
Qt::Horizontal
40
10
75
60
75
60
:/image/image/关灯.png
true
60
76
31
20
次卧
10
130
75
60
75
60
:/image/image/关灯.png
true
0
210
121
16
Qt::Horizontal
30
190
31
16
走廊
0
370
181
16
Qt::Horizontal
170
220
20
161
Qt::Vertical
10
250
75
60
75
60
:/image/image/关灯.png
true
30
310
31
20
主卧
230
370
231
20
Qt::Horizontal
300
250
75
60
75
60
:/image/image/关灯.png
true
320
310
31
20
客厅
0
390
75
60
75
60
:/image/image/关灯.png
true
80
410
31
20
阳台
460
0
153
283
灯开关
-
-
-
客厅
-
关
-
-
主卧
-
关
-
-
次卧
-
关
-
-
厨房
-
关
-
-
厕所
-
关
-
-
走廊
-
关
-
-
阳台
-
关
10
470
451
16
Qt::Horizontal
10
520
252
23
-
prot
-
270
510
93
28
连接
10
490
252
23
-
ip地址
-
510
440
141
211
界面切换
-
语音识别界面
-
天气预报界面
-
远程监控界面
-
音乐播放界面
-
快乐一下界面
-
返回主界面
0
0
651
26
tcp_image.ui
TCP_image
0
0
800
760
800
760
800
760
Form
0
0
441
261
监控播放窗口
0
20
431
231
true
450
10
93
28
打开监控
0
270
431
121
0
400
230
55
-
-
IP地址
-
-
-
true
prot
-
240
400
93
28
连接
660
550
141
211
界面切换
-
语音识别界面
-
智能家具界面
-
天气预报界面
-
音乐播放界面
-
快乐一下界面
-
返回主界面
weather forecast.ui
weather_forecast
0
0
800
760
800
760
800
760
天气预报界面
QPushButton:hover
{
background-color: rgb(0, 255, 0);
}
-70
0
881
721
400
70
321
81
-
12
75
true
现在时间:
-
-
30
0
30
16777215
20
75
true
:
Qt::AlignCenter
-
510
270
214
447
-
微软雅黑
12
75
true
后天天气
Qt::AlignCenter
-
-
210
210
210
210
3
-
background:transparent
80
270
214
447
-
微软雅黑
12
75
true
今天天气
Qt::AlignCenter
-
-
210
210
210
210
1
-
background:transparent
730
270
95
131
-
12
75
true
选择城市
-
-
长沙
-
北京
-
确定
290
270
214
447
-
微软雅黑
12
75
true
明天天气
Qt::AlignCenter
-
-
210
210
210
210
2
-
background:transparent
400
160
321
91
-
12
75
true
定位的城市
-
background:transparent
80
10
321
251
730
510
141
211
界面切换
-
语音识别界面
-
智能家具界面
-
远程监控界面
-
音乐播放界面
-
快乐一下界面
-
返回主界面
layoutWidget
layoutWidget
layoutWidget
layoutWidget
layoutWidget
layoutWidget_2
calendarWidget
groupBox_
0
0
801
761
background-image: url(:/res/天气背景.jpeg);
label
widget
widget.ui
Widget
0
0
800
760
800
760
800
760
Widget
20
0
761
221
应用界面
-
天气预报
-
音乐播放
-
开心一天
-
监控模式
-
家具控制
-
小刘同学
20
240
771
121
游戏界面
20
20
111
41
翻金币
160
20
111
41
2048
0
0
791
751
background-image: url(:/image/image/33.webp);
label
groupBox
groupBox_2
图片资源在 资源里面
1. 如何使 最后的 Qwidget 图片显示 背景图片,
答:没有找到结果,但是找到了一种方法代码,利用标签 存放图片,在ui 界面设计的时候,设置这个与最后界面一样大的 label 存放一种背景图片, 设置放在最后面,这样可以代替最后的widget 设置被那个图片, 查了很多资料也没有查到,在最后的图片显示的问题怎么解决,这个是一个遗憾,主要是widget 设置了 图片,他会把之前的其他控件 遮住!!
2. 关于设置 登录界面的时候,我把登录界面,注册界面写成了一个 设计师的类, 还把数据库 sqlite3 的加入数据,寻找数据, 返回数据,写成了一个类,但是最后的时候不知道怎么在,这注册类,和登录类 这两个里面同时使用 数据库的类。
答: 解决的办法,我在登录类的私有成员加入了 一个指针类型的 注册类, 在登录类的构造函数的时候,为注册类实列化对象, 在注册类里面的私有成员里面 加入了, 一个数据库的句柄,共有函数的里面写了一个返回数据库句柄的函数
QSqlDatabase* getQsqlDatabase();//获取数据库的句柄
他返回的是 句柄的指针 ,所以我们可以,登陆界面获取句柄。 在登录界面采用,生成数据库的对象,采用 数据库对象的函数,查询数据。
3. 错误的继承 QThread 使用 线程 run 函数 (无解)
4.关于 视屏监控 模式下的 数据过大的粘包与 分包,
答: 因为开始的时候,我没有使用 opencv 来建立函数库传输视频数据, 我才用的之间在文件里面打开 每秒 50 张图片的数据, 之间采用 TCP 的方法来实现数据传输。开始的时候因为数据过大,图片数据传输不过去,之后我才用 图片的平移缩小,之后再 牺牲图片的清晰度的方法来压缩图片的大小,再传输,可以实现一部分的视屏功能,视屏只有图片的上面的一部分可以,显示,图片的下面的一部分,有时清晰,有时候模糊,这个是因为数据的分包和粘包,形成的,之后采用 一种方法:
首先第一个部分 是 这个数据的 头数据,代表着这个数据的开始传输的部分,
第二个部分是 数据的大小部分,利用sizeof 函数测出 文件里面 需要传输的数据大小。
第三个部分 是 数据,
这样做的好处是可以防止数据的粘包和分包, 也可传输大型的数据,图片就不需要压缩了。
之后我发现传输的数据,只可以是图片类型, 这时候我才用了 JSON 的数据模式, 服务器采用JSON 的封包 , 客户端采用JSON 的解析模式, 我改的只是 传输的数据的类型,之前那个数据传输的是 QByteArray ((( 可以用来存储原始字节(包含'\0')和传统8位'\0'结尾字符串(也就是const char *);)))类型的数据, 之后 QByteArray 类型的数据转变为 JSON 类型的数据传输,我到了客户端的时候可以 准确的识别出 JSON 传输的数据类型, 因为JSON 是一个键值对!!
5.关于语音播放器 时候出现的问题 就是我的音乐播放器已经加载的资源文件,它的总时长为 0的问题,
答: 我上网查询的结果,他说资源文件改变了歌曲的数据,它使用二进制的方法保存的,
6. 关于 继承的时候 同时继承 QWidget 和 QThread 两个类时候出现的 connect 引用不准确的错误,
答: 因为他们同时引用了 QObiect 这个类
7. 关于ui 界面 设计 有控件, 但是再代码里面也写了 重写绘画事件的函数, 他就会出现两个 ui->setupUi(this); 的代码,可能会导致,你的ui 设置界面的按键不能使用.
8.关于自我知识 不足的补充, 就是 QURL 的类型, 它可以存储超链接, 超链接包括 本地文件的连接,也包括 http 的超链接, 哎,
9.关于 使用写 智能家居 错误的TCP 传输数据的方法,导致 客服端无法识别的数据,服务器 就是直接传输数字, 之后再客户端读取的时候,发现数字都在一起形成了一个字符串,而不是单个的数字, 只能采用暴力解析的方法来实现特定的功能, 这个案例教会我们要采用 JSON 传输数据。。
2.项目的写作思路,
1. 首先把每个功能写成一个 类 。主要是防止ui 设计界面过多的控件,不好识别,而且类好调用。
思路图: