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

源程序是我在网上找的,而且是下载了好几个,之后会把这些程序融合下。

一、 绘制棋盘

主窗体是继承MainWidget的,将棋盘设置为背景图片,到这棋盘就绘制好了。惊喜吧~

绘制程序也很少:

    //窗口以棋盘图片为大小    QPixmap pixChessBoard(":/image/Resources/image/chessBoard.png");    setFixedSize(pixChessBoard.size());    QPalette palette(this->palette());    palette.setBrush( QPalette::Window,QBrush(pixChessBoard));    this->setPalette(palette);

之后说明下程序中用到的几个宏定义:

#define RECT_WIDTH    55#define RECT_HEIGHT    56#define START_X  (35 - RECT_WIDTH/2)      #define START_Y  (45 - RECT_HEIGHT/2)

① RECT_WIDTH 棋盘图片方格的像素宽度,对应下图中1到2的像素距离

② RECT_HEIGHT 棋盘图片方格的像素高度,对应下图中2到3的像素距离

③ 35,45 是棋盘左上角像素坐标,即与1对应

④ START_X,START_Y 计算棋子位置的起点像素坐标,如图4的像素坐标

二、 绘制棋子

1. 棋子属性类(Item) 的定义

棋子属性类中主要包括棋子类型,如車、马、相、士、炮、兵、将

棋子颜色                    ,红色、黑色

棋子位置                    ,QPoint 等

Item::Item(ITEM_TYPE t,ITEM_COLOR c,QPoint pt){    m_type = t;    m_color = c;    m_pt = pt;    m_bShow = true;}

2. 初始化黑色棋子的逻辑属性

主要是初始化棋子的类型与逻辑位置。

void MainWindow::initItems(){    m_items.clear();    //初始化所有黑方棋子    Item item1(ITEM_JU,COLOR_BLACK,QPoint(0,0));    Item item2(ITEM_MA,COLOR_BLACK,QPoint(1,0));    Item item3(ITEM_XIANG,COLOR_BLACK,QPoint(2,0));    Item item4(ITEM_SHI,COLOR_BLACK,QPoint(3,0));    Item item5(ITEM_SHUAI,COLOR_BLACK,QPoint(4,0));    Item item6(ITEM_SHI,COLOR_BLACK,QPoint(5,0));    Item item7(ITEM_XIANG,COLOR_BLACK,QPoint(6,0));    Item item8(ITEM_MA,COLOR_BLACK,QPoint(7,0));    Item item9(ITEM_JU,COLOR_BLACK,QPoint(8,0));    Item item10(ITEM_PAO,COLOR_BLACK,QPoint(1,2));    Item item11(ITEM_PAO,COLOR_BLACK,QPoint(7,2));    Item item12(ITEM_BING,COLOR_BLACK,QPoint(0,3));    Item item13(ITEM_BING,COLOR_BLACK,QPoint(2,3));    Item item14(ITEM_BING,COLOR_BLACK,QPoint(4,3));    Item item15(ITEM_BING,COLOR_BLACK,QPoint(6,3));    Item item16(ITEM_BING,COLOR_BLACK,QPoint(8,3));    m_items.push_back(item1);    m_items.push_back(item2);    m_items.push_back(item3);    m_items.push_back(item4);    m_items.push_back(item5);    m_items.push_back(item6);    m_items.push_back(item7);    m_items.push_back(item8);    m_items.push_back(item9);    m_items.push_back(item10);    m_items.push_back(item11);    m_items.push_back(item12);    m_items.push_back(item13);    m_items.push_back(item14);    m_items.push_back(item15);    m_items.push_back(item16);}

3. 绘制棋子

①从图片中切割棋子

资源文件中棋子是这样的,通过drawPixmap(rcTarget,m_itemImage,rcSrc)函数将图片中指定的像素区域切割出来,然后绘制到棋盘上的目标区域,最后就看到棋盘上有棋子的效果了。

这里所有绘制的动作都是在void paintEvent(QPaintEvent *)绘图事件中完成的。

void MainWindow::paintEvent(QPaintEvent *){    QPainter painter(this);    for (int i = 0; i    {        drawItem(painter,m_items[i]);    }# if 0   //方便理解棋盘中宏定义的位置    painter.setPen(QPen(Qt::blue,5));    painter.drawPoint(35,45);    painter.drawPoint(90,45);    painter.drawPoint(90,101);    painter.drawPoint(START_X,START_Y);#endif//    update();}

② 绘制棋子

OK,接下来看下drawItem()

painter 是事件中传入的,

item 是类中定义所有棋子属性的容器,QVector<Item> m_items;

void MainWindow::drawItem(QPainter &painter, Item item){    if (!item.m_bShow)    {        return;}//根据顺序切割棋子图片像素位置QRect rcSrc(m_nItemWidth*item.m_color,m_nItemHeight*item.m_type,m_nItemWidth,m_nItemHeight);//将对应棋子的逻辑位置映射为棋盘上的像素位置    QRect rcTarget( START_X + item.m_pt.x()*RECT_WIDTH,                    START_Y + item.m_pt.y()*RECT_HEIGHT,                    RECT_WIDTH,RECT_HEIGHT);//在棋盘上绘制m_itemImage中对应的像素棋子    painter.drawPixmap(rcTarget,m_itemImage,rcSrc);}

最终就是下面这样:

下次和大家分享的则是对棋子的操作,主要通过鼠标事件来完成,这次的则是通过绘图事件来完成的。通过本次的练习结合上次所说的,大家会对Qt的绘图事件有一个整体的概念了。Qt是基于事件驱动的,以后对这句话的理解会越来越深刻的。

对了,如果觉得有帮助,欢迎关注:

qt pcl设置镜头初始位置_Qt中国象棋二——棋盘与棋子的绘制相关推荐

  1. java中国象棋棋盘放置棋子,Qt中国象棋二——棋盘与棋子的绘制

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

  2. Qt中国象棋二——棋盘与棋子的绘制

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

  3. java实现中国象棋2:移动棋子

    java实现中国象棋2:移动棋子 我在"java实现中国象棋1"的博客中说了一下如何把棋子画在棋盘上,使用一个flagflagflag二维数组即可实现.因此如果我们想让棋子移动,只 ...

  4. 使用QT简单制作中国象棋之棋盘

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

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

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

  6. qt qss设置字体大小_Qt编写自定义控件70-扁平化flatui

    一.前言 对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反 ...

  7. qt creator 设置按键颜色_Qt编写自定义控件30-颜色多态按钮

    一.前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得 ...

  8. qt qss设置字体大小_Qt编写自定义控件55-手机通讯录

    一.前言 前面几篇文章中的控件基本上难度系数接近0,甚至有凑控件数量的嫌疑,这次必须来一个强悍的控件,本控件难度系数在所有控件中排前五,代码量也不少,头文件都550行,实现文件1600行,为什么这么多 ...

  9. qt qss设置字体大小_Qt 第一步 HelloWorld 的第一个程序

    简言 Qt 是基于C++的 GUI 解决方案.QT简单易学(底层封装的好).跨平台.相关资料易得到. 开始写Qt 相关的文章的主要原因是,我本人在编写一个视频录制及相关处理的项目,写到一半发现.net ...

最新文章

  1. 视觉+Transformer最新论文出炉,华为联合北大、悉尼大学发表
  2. wp如何代码实现锁屏
  3. ctags对部分目录生成tags
  4. nginx html 替换,Nginx 服务内容替换功能(sub模块)
  5. 动态规划训练18 [免费馅饼 HDU - 1176 ]
  6. javascript 布尔_JavaScript布尔说明-如何在JavaScript中使用布尔
  7. 反射+javacsv+scv文件构建资源获取
  8. 火狐浏览器中打开java_将Firefox浏览器嵌入Java Swing中
  9. 协议详解_I2C协议详解
  10. 什么是MARC数据?
  11. hive开启kerberos-beeline连接
  12. mysql中IFNULL,IF,CASE的区别
  13. 禁用 Bootstrap 模态框(Modal) 点击空白时自动关闭
  14. 第二阶段冲刺 站立会议 -01个人进度
  15. 软件的工程化管理(二)(转)
  16. 添加打印机其它计算机打不开,windows无法打开添加打印机的解决方法
  17. Android报错:Only fullscreen activities can request orientation的解决方法
  18. 用Python自动化办公操作PPT,掌握这些技巧没压力!
  19. 常用的表情和含义 各种笑脸;-)
  20. Linux计算节点怎么关闭,OpenStack 删除无用的计算结点

热门文章

  1. 牛客网 java刷题_牛客网刷题(纯java题型 1~30题)
  2. 步骤一:入门Linux基础\01.Linux 简介和安装\第2章 Ubuntu系统的安装
  3. Python机器学习:SVM002最大化margin
  4. linux怎么改目录位置,Linux下更改MySQL数据目录位置具体操作方法
  5. Ajax通讯异常12002,前端MVC框架[02] 发送AJAX请求及建立连接池
  6. 8cm等于多少像素_没诚意!红米Note 8 4800万像素是假的?网友:看看realme Q吧
  7. git配置中文乱码_解决git中文乱码问题
  8. python自动安装pip教程_谈谈全自动安装常使用的pip install的原理及作用!!!
  9. sas java 虚拟机异常_深入理解JAVA虚拟机之异常诊断
  10. linux 安装 mysql off,linux下安装mysql