新建项目
新建一个空项目。然后新建文件。
首先新建一个主函数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函数展示。运行。
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);
接下来,画线。先看棋盘,横线一共十条,竖线一共九条,棋子的直径就是两条线的间隔。
(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));
}
运行结果如下, 我们看到这个图跟我们的想要的有一些差距。于是改进代码。
给边距离边框加一点距离,加上棋子直径。
for(int i=1;i<=10;i++)
{
painter.drawLine(QPoint(d,i*d),QPoint(9*d,i*d));
}
现在相对于刚才要美观一点。
(2)九条竖线
首先来看第一条竖线,起点坐标(d,d),终点坐标(d,10*d),这次纵坐标没变化,横坐标在变。
//九条竖线
for(int i=1;i<=9;i++)
{
painter.drawLine(QPoint(d*i,d),QPoint(i*d,10*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));
}
}
(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));
完整代码:
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));
}