使用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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章