Qt实现中国象棋:(二)棋盘绘制的详细分析及测试

一、棋盘绘制分析

这里事先说明我使用的是一些图片,而并非是通过画线函数来绘制棋盘,对于棋盘的绘制就是简单的图片位置的放置操作。象棋棋盘是十条横线、九条竖线,一共九十个交点,这些交点也是棋子的落子位置,同时也是图片的中心位置,棋盘就是由九十张图片拼接而成。这里设置每张图片的大小为5050,棋盘的大小就是为450500,这就是widget控件minimunSize属性中宽度设置为450,高度设置为500的原因(同时设置控件大小随主窗体的大小变化而变化)。所有对棋子、棋盘的操作都是在名为widget的控件中完成的。(棋子棋盘图片素材资源在文章最下方,有需要的请自行获取)
在这里插入图片描述
以下是所需使用的棋盘图片(图片命名不可含有中文),以这23张图片拼成棋盘。
在这里插入图片描述

二、图片显示测试

先来实现一张图片在界面中的显示,用来观察图片显示需要注意哪些问题。
1:先将建立的项目运行一次,运行成功后会产生一个文件夹,该文件夹与项目文件夹在同一路径下。将图片文件夹放置到新产生的文件夹中。
在这里插入图片描述
上图就是项目运行后产生的新文件夹,将图片文件放入该文件夹中(下图的map文件夹就是新放入的棋盘图片文件夹)。
在这里插入图片描述
2:因为需要图片最终在以myWidget为基类的windget窗体上面显示,所以操作均在mywidget.cpp中完成。要完成制图就需要使用paintEvent函数,下面先来看一下Qt文档中对于paintEvent函数的一段描述
在这里插入图片描述
意思就是说当绘制事件发生,更新区通常会被擦除,因此是在部件背景上进行绘制(这也是我之前所犯的一个错误,这里在此记录一下)。不能弄错绘图的背景。
需要使用到QPainter,所以需要添加头文件;QPainter中有drawImage和drawPixmap以及drawPicture可用于绘制图片,这里我们选用drawPixmap。在qt中drawPixmap的构造函数有多个重载,只选取其中一个使用。以下就是我使用的构造函数。
在这里插入图片描述
参数介绍:pixmap就是所要绘制的图片,(x,y)就是图片相对于当前窗口的坐标,width和height为图片的宽度和高度。
这里简要说明一下qt中的坐标系统:每一个窗体都有自己的坐标原点,就是窗体的左上角,坐标为(0,0);横向为x轴,x向右递增;纵向为y轴,y向下递增。
使用QPixmap::load函数来进行图片加载,因为之前已经将图片文件夹放入运行后产生的文件夹中,所以该函数中参数只需填入图片的相对路径即可。
3:了解了以上的知识就可以进行图片的绘制了。选取名为“downEdge”的图片来进行测试,
通过重写paintEvent函数来实现绘制
paintEvent函数的定义在myWidge.h文件中

void paintEvent(QPaintEvent *event) override;

函数的实现

void myWidget::paintEvent(QPaintEvent *event)
{
    QPixmap t;
    t.load("map/downEdge.gif");
    QPainter painter(this);
    painter.drawPixmap(0,0,50,50,t);
}

测试效果如下图(图片的起点坐标为(0,0),图片宽度和高度均为50)
在这里插入图片描述
图片素材链接:https://pan.baidu.com/s/1-BhbzBPKVte3yeEG8NrCAg
提取码:33rt

Qt实现中国象棋
(三)棋盘绘制的详细分析及实现

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的例子,使用Qt绘制中国象棋棋盘。 首先,我们需要在Qt的窗口中创建一个QPainter对象,然后通过QPainter对象绘制棋盘。 ```cpp void ChessBoard::paintEvent(QPaintEvent *event) { QPainter painter(this); int squareSize = width() / 10; // 绘制棋盘 painter.setBrush(QColor("#D18B47")); painter.drawRect(0, 0, 9 * squareSize, 10 * squareSize); painter.fillRect(squareSize, squareSize, 8 * squareSize, 8 * squareSize, QColor("#F0D9B5")); for (int i = 0; i < 9; ++i) { painter.drawLine((i + 1) * squareSize, squareSize, (i + 1) * squareSize, 9 * squareSize); } painter.drawLine(squareSize, squareSize, 9 * squareSize, squareSize); painter.drawLine(squareSize, 9 * squareSize, 9 * squareSize, 9 * squareSize); // 绘制棋盘上的点 painter.setBrush(Qt::black); painter.drawEllipse(QPoint(4 * squareSize, 3 * squareSize), 5, 5); painter.drawEllipse(QPoint(6 * squareSize, 3 * squareSize), 5, 5); painter.drawEllipse(QPoint(4 * squareSize, 6 * squareSize), 5, 5); painter.drawEllipse(QPoint(6 * squareSize, 6 * squareSize), 5, 5); } ``` 在上面的代码中,我们使用QPainter对象的drawRect()和fillRect()方法绘制棋盘的外框和内部,使用drawLine()方法绘制棋盘上的线条,使用drawEllipse()方法绘制棋盘上的点。 在这个例子中,我们将棋盘的大小设置为窗口宽度的10分之9,并将棋盘上每个格子的大小设置为窗口宽度的10分之1。 ```cpp int squareSize = width() / 10; ``` 最后,我们需要在QWidget的构造函数中启用绘图功能: ```cpp ChessBoard::ChessBoard(QWidget *parent) : QWidget(parent) { setFixedSize(9 * squareSize, 10 * squareSize); } ``` 完整的代码可以参考以下代码: ```cpp #include <QtWidgets> class ChessBoard : public QWidget { public: ChessBoard(QWidget *parent = 0) : QWidget(parent) { setFixedSize(9 * squareSize, 10 * squareSize); } protected: void paintEvent(QPaintEvent *event) override { QPainter painter(this); int squareSize = width() / 10; // 绘制棋盘 painter.setBrush(QColor("#D18B47")); painter.drawRect(0, 0, 9 * squareSize, 10 * squareSize); painter.fillRect(squareSize, squareSize, 8 * squareSize, 8 * squareSize, QColor("#F0D9B5")); for (int i = 0; i < 9; ++i) { painter.drawLine((i + 1) * squareSize, squareSize, (i + 1) * squareSize, 9 * squareSize); } painter.drawLine(squareSize, squareSize, 9 * squareSize, squareSize); painter.drawLine(squareSize, 9 * squareSize, 9 * squareSize, 9 * squareSize); // 绘制棋盘上的点 painter.setBrush(Qt::black); painter.drawEllipse(QPoint(4 * squareSize, 3 * squareSize), 5, 5); painter.drawEllipse(QPoint(6 * squareSize, 3 * squareSize), 5, 5); painter.drawEllipse(QPoint(4 * squareSize, 6 * squareSize), 5, 5); painter.drawEllipse(QPoint(6 * squareSize, 6 * squareSize), 5, 5); } private: int squareSize = width() / 10; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); ChessBoard board; board.show(); return app.exec(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zmq1998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值