最近在网上看了一些QT的教学视频,就想着将学习的知识运用一下,学到绘图后就想着制作一个简易的中国象棋。目前只做出了棋盘,大概有点样子了。
本例使用的QWidget作为父类创建的加了UI的项目,但目前UI没怎么用,就图方便设置了一下Widget的Size。

Widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected:// 绘图事件void paintEvent(QPaintEvent *) override;// 鼠标按下,移动事件void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent*)override;
private:Ui::Widget *ui;QPoint point;// 棋子大小 即 格子大小int ChessSize;
};
#endif // WIDGET_H

Widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>
#include <QPen>
#include <QFont>
#include <QBrush>
#include <QColor>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置 棋子大小, 即格子大小this->ChessSize = 50;}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *){QPen pen;pen.setWidth(3);pen.setColor(Qt::black);QPainter p(this);p.setPen(pen);QBrush brush;brush.setColor(QColor(216, 180, 80));brush.setStyle(Qt::SolidPattern);p.setBrush(brush);//    p.drawPixmap(rect(),QPixmap(":/ChessImage/back1.jpg"));// 取窗口的左上角坐标(left, top) 和 宽高(right, bottom)int top = rect().top();int bottom = rect().bottom();int left = rect().left();int right = rect().right();// 通过画刷绘制背景, 并取消画刷(防止后面绘制其他图形继续被刷,当然本项目做的简易中国象棋用于练手,应该不会使用了)p.drawRect(left, top, right, bottom);p.setBrush(Qt::NoBrush);// 绘制棋盘的边框p.drawLine(left + ChessSize - 5, top + ChessSize - 5, left + ChessSize - 5, bottom - ChessSize + 5);p.drawLine(left + ChessSize - 5, top + ChessSize - 5, right - ChessSize + 5, top + ChessSize - 5);p.drawLine(right - ChessSize + 5, top + ChessSize - 5, right - ChessSize + 5, bottom - ChessSize + 5);p.drawLine(left + ChessSize - 5, bottom - ChessSize + 5, right - ChessSize + 5, bottom - ChessSize + 5);pen.setWidth(2);p.setPen(pen);// 绘制棋盘中的细线for(int x = left + ChessSize; x < right; x += ChessSize){for(int y = top + ChessSize; y < bottom; y += ChessSize){if(x == left + ChessSize){p.drawLine(x, y, right - ChessSize, y);}if(y == top + ChessSize){p.drawLine(x, y, x, (bottom - ChessSize) / 2);p.drawLine(x, (bottom + ChessSize) / 2, x, bottom - ChessSize);}}}p.drawLine((right/2 - ChessSize), top + ChessSize, (right/2 + ChessSize), top + 3*ChessSize);p.drawLine((right/2 + ChessSize), top + ChessSize, (right/2 - ChessSize), top + 3*ChessSize);p.drawLine((right/2 - ChessSize), bottom - ChessSize, (right/2 + ChessSize), bottom - 3*ChessSize);p.drawLine((right/2 + ChessSize), bottom - ChessSize, (right/2 - ChessSize), bottom - 3*ChessSize);// 设置分界河标志p.setFont(QFont("Arial", 25));p.drawText(QPoint(right/2-100, bottom/2+15), "楚河         汉界");// 设置炮兵和步兵站位的 '#' 字pen.setWidth(4);p.setPen(pen);int x, y;QPoint point[3];for(int j = 0; j < 2; j++ )for(int i = 1; i <= 9; i++){if(i == 4 || i == 6)continue;x = left + i*ChessSize; // x坐标不会因为上下半区而改变if(j == 0){   // 处理上半区if(i % 2 == 0) // 处理上半区炮兵的 '#'字y = top + 3*ChessSize;else           // 处理上半区步兵的'#'字y = top + 4*ChessSize;}else{  // 处理下半区if(i % 2 == 0) // 处理下半区炮兵的 '#'字y = bottom - 3*ChessSize;else           // 处理下半区步兵的 '#'字y = bottom - 4*ChessSize;}// 单独处理两边兵的 '#'字(因为只有一半)// drawPokyline第一个参数为数组首地址,第二个参数为数组长度,稍微熟悉点C++就懂了// 它的功能是将数组的点依次连接但不填充,如颜色等。(第一次使用,参考的网上)if(i == 1){point[0] = QPoint(x+5, y-15);point[1] = QPoint(x+5, y-5);point[2] = QPoint(x+15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x+5, y+15);point[1] = QPoint(x+5, y+5);point[2] = QPoint(x+15, y+5);p.drawPolyline(point,3);continue;}if(i == 9){point[0] = QPoint(x-5, y-15);point[1] = QPoint(x-5, y-5);point[2] = QPoint(x-15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x-5, y+15);point[1] = QPoint(x-5, y+5);point[2] = QPoint(x-15, y+5);p.drawPolyline(point,3);continue;}// 其他部分正常(炮兵和中间步兵的 '#'字)point[0] = QPoint(x+5, y-15);point[1] = QPoint(x+5, y-5);point[2] = QPoint(x+15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x+5, y+15);point[1] = QPoint(x+5, y+5);point[2] = QPoint(x+15, y+5);p.drawPolyline(point,3);point[0] = QPoint(x-5, y-15);point[1] = QPoint(x-5, y-5);point[2] = QPoint(x-15, y-5);p.drawPolyline(point,3);point[0] = QPoint(x-5, y+15);point[1] = QPoint(x-5, y+5);point[2] = QPoint(x-15, y+5);p.drawPolyline(point,3);}
}
// 鼠标事件用于后面深入制作棋子的移动等.
void Widget::mousePressEvent(QMouseEvent *e){}void Widget::mouseMoveEvent(QMouseEvent *e){}

效果图如下:

使用QT简单制作中国象棋之棋盘相关推荐

  1. 使用QT简单制作中国象棋之棋子的摆放

    1 引子   要制作象棋,棋子是必不可少的,但是在网上找了很久,没有找到满意且配套的棋子,有的还需要VIP下载就很难受.于是自己通过QT的标签写字功能调整大小,然后使用绘图事件(QPaintEvent ...

  2. Qt终极教程——用Qt编程实现中国象棋游戏(提供源代码和程序编译运行教程)

    Qt终极教程--用Qt编程实现中国象棋游戏 目录 Qt终极教程--用Qt编程实现中国象棋游戏 简介 运行可执行程序体验象棋游戏 Qt 安装 源代码的编译.运行与调试 生成预编译的可执行程序 简介 本文 ...

  3. QT小游戏——中国象棋

    QT小游戏--中国象棋 前言 项目整体结构 棋子类 棋盘类 几个重要方法 1.坐标转化 2.移动规则 3.悔棋和撤销 项目文件 前言 最近用qt做了个中国象棋的小游戏. 目前只能左右互博,支持悔棋.效 ...

  4. java简单实现中国象棋

    java简单实现中国象棋 可以实现简单的人机对战功能,棋子移动会插入关键帧,可以悔棋等功能 运行效果 import java.awt.Canvas; import java.awt.Color; im ...

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

    一.图片及棋盘分析 1:在上文中已经对单张图片的显示进行了测试,从中可以知道一张图片需要一个QPixmap对象对其进行加载.棋盘图片共有23张,也就需要23个QPixmap的对象.同时要求对象名与图片 ...

  6. 【C++课程设计】期末大作业 - 基于Qt开发的中国象棋软件

    1 题目 基于Qt的中国象棋软件开发 本博客只是简略的描述论文的大致结构.框架,以及软件开发的大致过程.有兴趣的参考原文档资料. 2总体设计与主要功能 2.1概述 中国象棋是起源于中国的一种棋,属于二 ...

  7. 程序员大佬教你如何用python制作中国象棋!一看就会

    中国象棋想必大家都玩过,突发奇想,想着怎么用python把中国国粹的中国象棋做出来呢?????? 首先老样子看看用python做出来的效果: 国粹--中国象棋 第一步:导入资源包 第二步:初始化 第三 ...

  8. 手把手教学!利用C++制作中国象棋,界面MFC内含详细源码!

    VC++中国象棋源码附毕业设计文档资料,源程序编译于VC++6.0或者VS2003版本,二者任选其一都可以,项目文件完整. 总项目展示: 制作过程截图: 代码展示: 效果展示: 这是我要和大家分享的基 ...

  9. qt pcl设置镜头初始位置_Qt中国象棋二——棋盘与棋子的绘制

    上次和大家分享了Qt的2D绘图基础知识,这样可以更好地理解象棋中一些关于绘图的程序.这次要和大家分享的则是棋盘与棋子的绘制,也可以说是Qt 2D绘图的一些具体应用. 源程序是我在网上找的,而且是下载了 ...

最新文章

  1. 5GtoB即将迎来规模商用,如何共创行业新价值?
  2. 把Ubuntu 9.04版本的Samba 服务器加入到Active Directory中
  3. MySQL Proxy 读写分离(实战总结)
  4. WPF资源的基本概念
  5. 0408互联网新闻 | 区块链医疗解决方案落地应用,阿里云、支付宝共同研发;安卓全球开发者峰会将于10月23-24日在加州召开...
  6. Go gin使用html模板
  7. 【Python数据结构】 抽象数据类型 Python类机制和异常
  8. 干翻Java_Java第三次作业第一题
  9. 不懂电容原理?那是你没看到这些动图
  10. 再记一次 应用服务器 CPU 暴高事故分析
  11. python实例 81,82
  12. c语言字符串去除第一个和最后一个_387. 字符串中的第一个唯一字符
  13. 【VS开发】ConvertBSTRToString(filename) 不能将string转换为BSTR
  14. 在阿里巴巴如何管理代码分支?
  15. 抓包工具神器,fiddler全解
  16. C语言运算符优先级列表(超详细)
  17. 2014.10.10 ——Jim Foley第二场讲座User Interface Design——An Overview
  18. Aurora 论坛图片下载
  19. linux中lv的详细创建流程【化分区-pv-vg-lv创建整套流程】,centos中lv脚本创建vg-pv-lv,-bash: lvs: command not found处理方法
  20. WIZnet——W5100S震撼来袭!

热门文章

  1. 企业微信员工离职成员客户,客户群分配接口
  2. 安誉生物宣布完成数亿元融资,公司背景和达安基因、安杰思均有关
  3. 车联网布局,阿里领先了百度腾讯多少?
  4. sikuli java_Sikuli--基于像素的图像识别(JAVA)
  5. 2022年A特种设备相关管理(电梯)考题模拟考试平台操作
  6. 免费报表工具知多少?
  7. 用Android Studio 编写简易计算器
  8. 康耐视智能相机Insight的FTP存图详细讲解
  9. 2021,烦死了,烦死了,烦死了!
  10. Python报错:ProgrammingError: LOB variable no longer valid after subsequent fetch