您的位置:首页 > 编程语言 > Qt开发

使用Qt开发中国象棋(二):棋盘绘制

2015-10-12 16:27 627 查看
棋盘用的是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中还是显示原来的图片,相当于没变。像下面这样:

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);


棋盘都画出来,对于我们来说总算是开了个头,完成这个东西是迟早的事。没有想象中的那么难吧。是不是很简单?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: