棋盘用的是ChessBoard类,主要是显示界面上的棋子,响应鼠标点击事件,激发走棋的信号,MainWindow调用相关的槽,从而完成走棋。下面将一一介绍,错误之处,恳请各位指正,谢谢。棋盘主要是下面的区域:数组
ChessBoard要显示一张背景图和18个棋子,还有走棋路迹。背景图是一个QPixmap对象,至于棋子,由于界面上有90个位置能够放棋子,因此用了90个QPixmap对象。棋盘的渲染是在paintEvent中实现的,咱们用QPainter的drawPixmap函数来显示图片。函数
void ChessBoard::paintEvent(QPaintEvent *event) { Q_UNUSED(event); int xx = 0; int yy = 0; int index = 0; QPainter painter(this); painter.drawPixmap(0, 0, background); for (int row = 0; row < CHESSBOARD_ROW; ++row) { for (int column = 0; column < CHESSBOARD_COLUMN; ++column) { index = row * CHESSBOARD_COLUMN + column; getPixmapPos(row, column, xx, yy); painter.drawPixmap(xx, yy ,arrChessman[index]); } } }
显示图片,只要改变arrChessman这个数组中的值,好比说要第九个显示马,咱们只须要对应的QPixmap对象load马的图片,可是要记得update一下。否则paintEvent中仍是显示原来的图片,至关于没变。像下面这样:this
chessBoard->update();响应鼠标事件须要在mousePressEvent中实现的。咱们捕获鼠标左键点击事件,而后激发信号,MainWindow中就会调用相应的槽,去完成走棋的逻辑,固然后面会介绍这些。
void ChessBoard::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { int row = 0; int column = 0; getPixmapIndex(event->pos().x(), event->pos().y(), row, column); int sq = getChessmanIndex(row, column, fliped); emit doMove(sq); } }开发这个东西时,曾经遇到过图片不能显示的问题,发如今new一个ChessBoard对象时要指定参数,就像下面那样,必须指定this指针为其参数:
chessHandler = new ChessHandler(this);
棋盘都画出来,对于咱们来讲总算是开了个头,完成这个东西是早晚的事。没有想象中的那么难吧。是否是很简单?spa
源代码下载连接:http://download.csdn.net/detail/zxywd/9172917
.net