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

        棋盘用的是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