使用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中还是显示原来的图片,相当于没变。像下面这样:

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

 棋盘都画出来,对于我们来说总算是开了个头,完成这个东西是迟早的事。没有想象中的那么难吧。是不是很简单?

源代码下载链接:http://download.csdn.net/detail/zxywd/9172917


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值