1 引子
要制作象棋,棋子是必不可少的,但是在网上找了很久,没有找到满意且配套的棋子,有的还需要VIP下载就很难受。于是自己通过QT的标签写字功能调整大小,然后使用绘图事件(QPaintEvent)在标签的外部绘制一个圆圈,最后运行截图就有了棋子。但截图的棋子还有一点就是圆圈之外还有白色部分,如下所示
于是准备自己将图片P一下,就想着在网上找一个免费版本的PS,找了一圈无果后,就去逛各个博客论坛看看,终于找到一个百度网盘下载的方法。众所周知,百度网盘非会员下载有一个60s的极速下载通道,奈何需要下载的压缩包3个多G,还是要等很久才能下载完成,期间就捣鼓自己的QT代码。
经过数分钟的等待,终于下载完毕,想想就激动,免费的PS我来啦!!哈哈哈,结果在点开压缩包的一瞬间我蒙了,居然还有密码,然后一看它的安装教程,写了一个网址需要花钱去买密码,我吐了。花钱是不可能花钱的,然后去网上找破解密码的工具,然而用了两个忘了叫啥名字了,反正没有效果,又浪费一堆时间。最后,室友推荐我去微信关注公众号软件管家,终于下载成功了,我**, 你 **不早说。
最后就是去网上使用PS的方法了,这里就不细说了,最后就达到了自己预想的效果,效果如下。
有没有发现和前面图片没什么两样哈哈哈,下面找个背景对比一下,这样就容易发现了。
2. 正文
注意,本项目只是简单实现,因此固定上方为黑方,下方为红方。
前面说了一大堆废话,现在进入正题吧。
首先,应该对棋子单独创建一个类,用于存储该棋子类型,棋子图片,所属阵营,是否被吃(被吃后就不加载该棋子的图片),以及当前位置(棋盘上的x,y值)。
Chess.h头文件
#ifndef CHESS_H
#define CHESS_H
#include <QWidget>
class Chess : public QWidget
{
Q_OBJECT
public:
explicit Chess(QWidget *parent = nullptr);
void operator=(const Chess& c); // 重载赋值构造函数
// 棋子类型 从0开始为 兵,車,馬,象(相),士(仕),将(帅)
enum TYPE{
ARMY,PAO,CAR,HORSE,XIANG,SHI,MASTE};
// 棋子所属阵营 red = 0, black = 1
enum BELONG{
RED,BLACK};
signals:
public:
// 初始化棋子
void initChess(const int);
public:
int x;
int y;// 棋子所在x,y坐标,移动会改变 (也可以使用行列表示,但x,y更直观)
int chessType; // 棋子类型
int chessBelong; // 棋子所属阵营
int chessId; // 棋子ID
bool isDead; // 棋子是否被吃
QString chessPic; // 棋子图片
};
#endif // CHESS_H
Chess.cpp
#include "chess.h"
Chess::Chess(QWidget *parent) : QWidget(parent)
{
}
void Chess::operator=(const Chess &c){
x = c.x;
y = c.y;
chessType = c.chessType;
chessBelong = c.chessBelong;
chessId = c.chessId;
isDead = c.isDead;
chessPic = c.chessPic;