新建项目

新建一个空项目。然后新建文件。

QT象棋练习(3)-绘制棋盘

 

                                                   QT象棋练习(3)-绘制棋盘 

首先新建一个主函数main.cpp文件。然后新建一个Board.cpp文件来绘制棋盘。注意,Board是继承QWidget。

代码编写

主函数

#include<QApplication>
#include"Board.h"

int main(int argc,char *argv[])
{
    QApplication app(argc, argv);

    Board board;
    board.show();
    return app.exec();
}

首先是函数的一些常规代码,其次,需要引用我们重新的定义的类,Board他是继承QWidget。

#include"Board.h"

然后声明一个board对象,也就是棋盘对象,用show函数展示。运行。

QT象棋练习(3)-绘制棋盘

 

Board

现在是关于棋盘绘制的函数。

在Board.h中先声明函数。

#ifndef BOARD_H
#define BOARD_H

#include <QWidget>

class Board : public QWidget
{
    Q_OBJECT
public:
    explicit Board(QWidget *parent = 0);
    ~Board();
    void paintEvent(QPaintEvent *);

signals:

public slots:
};

#endif // BOARD_H

在Board.cpp中实现函数。需要画线,就需要引用QPainter。

#include<QPainter>

然后定义一个painter对象。

 QPainter painter(this);

 

接下来,画线。先看棋盘,横线一共十条,竖线一共九条,棋子的直径就是两条线的间隔。

                              QT象棋练习(3)-绘制棋盘

(1)十条横线

画直线是函数painter.drawLine,需要两个坐标,起点和重点坐标。

painter.drawLine(QPoint(x1,y1),QPoint(x2,y2));

看图可以发现规律,第一条横线的七点是(0,0),重点是(9*d,0),d是棋子的直径。那按照这个规律,十条横线,横坐标是不变的,纵坐标是变化的。所以下以下代码:

    for(int i=0;i<10;i++)
    {
        painter.drawLine(QPoint(0,i*d),QPoint(9*d,i*d));
    }

运行结果如下, 我们看到这个图跟我们的想要的有一些差距。于是改进代码。

QT象棋练习(3)-绘制棋盘

给边距离边框加一点距离,加上棋子直径。

    for(int i=1;i<=10;i++)
    {
        painter.drawLine(QPoint(d,i*d),QPoint(9*d,i*d));
    }

现在相对于刚才要美观一点。 

                     QT象棋练习(3)-绘制棋盘

 

(2)九条竖线

首先来看第一条竖线,起点坐标(d,d),终点坐标(d,10*d),这次纵坐标没变化,横坐标在变。

    //九条竖线
    for(int i=1;i<=9;i++)
    {
        painter.drawLine(QPoint(d*i,d),QPoint(i*d,10*d));
    }

运行,象棋楚河汉界所以,需要改代码。

QT象棋练习(3)-绘制棋盘

楚河汉界位于第五条线后面,所以,可以分为两次来画线。一次划到第五条,第二次从第五条开始画,画到第十条。但是。注意这里说的十横线。

同时第一条线和第九条线是画到底的。注意,着说的线是竖线。

   //九条竖线
    for(int i=1;i<=9;i++)
    {
        if(i==1||i==9)
            painter.drawLine(QPoint(d*i,d),QPoint(i*d,10*d));
        else
        {
            painter.drawLine(QPoint(d*i,d),QPoint(i*d,5*d));
            painter.drawLine(QPoint(d*i,6*d),QPoint(i*d,10*d));
        }
    }

QT象棋练习(3)-绘制棋盘

 

(3)九宫格

九宫格一共需要画四条线,直接四句代码搞定,输入每条线的起点终点坐标。

    //九宫格
    painter.drawLine(QPoint(d*4,d),QPoint(6*d,3*d));
    painter.drawLine(QPoint(d*6,d),QPoint(4*d,3*d));

    painter.drawLine(QPoint(d*4,10*d),QPoint(6*d,8*d));
    painter.drawLine(QPoint(d*6,10*d),QPoint(4*d,8*d));

QT象棋练习(3)-绘制棋盘

完整代码:

void Board::paintEvent(QPaintEvent*)
{
    QPainter painter(this);

    int d=40;  //棋子直径
    //十条横线
    for(int i=1;i<=10;i++)
    {
        painter.drawLine(QPoint(d,i*d),QPoint(9*d,i*d));
    }

    //九条竖线
    for(int i=1;i<=9;i++)
    {
        if(i==1||i==9)
            painter.drawLine(QPoint(d*i,d),QPoint(i*d,10*d));
        else
        {
            painter.drawLine(QPoint(d*i,d),QPoint(i*d,5*d));
            painter.drawLine(QPoint(d*i,6*d),QPoint(i*d,10*d));
        }
    }
    //九宫格
    painter.drawLine(QPoint(d*4,d),QPoint(6*d,3*d));
    painter.drawLine(QPoint(d*6,d),QPoint(4*d,3*d));

    painter.drawLine(QPoint(d*4,10*d),QPoint(6*d,8*d));
    painter.drawLine(QPoint(d*6,10*d),QPoint(4*d,8*d));
}

 

相关文章:

  • 2021-11-14
  • 2022-02-21
  • 2022-12-23
  • 2021-11-16
  • 2021-11-22
  • 2021-08-15
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-01-13
  • 2021-10-03
  • 2021-11-12
  • 2021-07-03
  • 2021-09-26
相关资源
相似解决方案