使用Qt開發中國象棋(三):走棋着法列表

        在一個完整的中國象棋遊戲中,一般界面上都顯示了中文着法,爲了簡單起見,我開發的這個用了兩個着法列表,紅方一個,黑方一個,其實用一個就夠了,只是感覺那樣稍微會麻煩些。着法列表顯示了每一步的走棋。下圖是着法列表的截圖:

 

着法列表用的是一個叫StepList的類來實現的,因爲有兩個着法列表,所以用了兩個StepList對象。實例化的時候,指定一個特殊的參數用來標示是左邊的還是右邊的。像下面那樣。

    leftStepList = new StepList(this, true);
    rightStepList = new StepList(this, false);

       StepList類包括以下數據成員:

        一個QPixmap對象:用來標示是哪一方。

       一個QTableView指針對象:用於顯示中文着法。

       一個QStandardItemModel指針對象:用於向tableView賦值。

      四個QPushButton指針對象:用於實現翻頁和翻行功能。

       一個QLabel指針對象:用於顯示當前頁面信息。

       一個int類型成員:用於標示當前是第幾步。在翻頁和翻行中用到。

      一個QVector容器:用於保存所有的着法歷史。

      有哪些成員函數,我就不介紹了,大家可以去看代碼。

      關於tableView,下面是創建的代碼:

void StepList::initTableView()
{
    tableView = new QTableView(this);
    tableView->move(0, 60);

    model = new QStandardItemModel(15, 3);
    model->setHeaderData(0, Qt::Horizontal, tr("序號"));
    model->setHeaderData(1, Qt::Horizontal, tr("走法"));
    model->setHeaderData(2, Qt::Horizontal, tr("時間"));

    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    tableView->setModel(model);
    tableView->setColumnWidth(0, 30);
    tableView->setColumnWidth(1, 70);
    tableView->setColumnWidth(2, 75);
    tableView->setFixedSize(200, 480);
}

        我們指定了tableView是3列15行,顯示哪些內容。每列的大小。

        翻頁和翻行是整個類中最主要的內容,用一個currentOrderNumber的成員變量記錄當前走法的序號,根據這個我們可以確定當前頁是第幾頁以及當前頁的序號範圍,這樣我們就可以從vector中取數據,然後顯示到界面上,比如說當我們點擊“>”按鈕後,當前選中的記錄就是下一條記錄,序號就會加一。下面是下一行和下一頁所做的事情:

void StepList::nextRecord()
{
    currentOrderNumber++;
    updateHistoryDisplay();
}

void StepList::nextPage()
{
    currentOrderNumber = std::min(currentOrderNumber + MOVE_STEP_PER_PAGE, vecMoveHistory.size());
    updateHistoryDisplay();
}

void StepList::updateHistoryDisplay()
{
    QModelIndex modelIndex;
    for (int i = 0; i < MOVE_STEP_PER_PAGE; ++i)
    {
        for (int j = 0; j < COLUMN_PER_STEP; ++j)
        {
            modelIndex = model->index(i, j, QModelIndex());
            model->setData(modelIndex, tr(""));
        }
    }

    int currentPage = getPageNumber(currentOrderNumber);
    int totalPage = getPageNumber(vecMoveHistory.size());
    int currentRecordIndex = getRecordIndex(currentOrderNumber);

    if (vecMoveHistory.size() == 0)
    {
        btnPrevPage->setEnabled(false);
        btnPrevRecord->setEnabled(false);
        btnNextRecord->setEnabled(false);
        btnNextPage->setEnabled(false);
        tableView->clearSelection();
    }
    else
    {
        int startIndex = (currentPage - 1) * MOVE_STEP_PER_PAGE;
        int endIndex = std::min(currentPage * MOVE_STEP_PER_PAGE, vecMoveHistory.size()) - 1;

        for (int i = startIndex; i <= endIndex; i++)
        {
            modelIndex = model->index(i % MOVE_STEP_PER_PAGE, 0, QModelIndex());
            model->setData(modelIndex, vecMoveHistory.at(i).orderNumber);

            modelIndex = model->index(i % MOVE_STEP_PER_PAGE, 1, QModelIndex());
            model->setData(modelIndex, vecMoveHistory.at(i).moveStepInfo);

            modelIndex = model->index(i % MOVE_STEP_PER_PAGE, 2, QModelIndex());
            model->setData(modelIndex, vecMoveHistory.at(i).moveStepTime);
        }

        modelIndex = model->index(currentRecordIndex - 1, 0, QModelIndex());
        tableView->setCurrentIndex(modelIndex);

        btnPrevRecord->setEnabled(currentRecordIndex > 1);
        btnPrevPage->setEnabled(currentPage > 1);
        btnNextRecord->setEnabled(currentOrderNumber < vecMoveHistory.size());
        btnNextPage->setEnabled(currentPage < totalPage);
    }

    QString pageInfo;
    pageInfo.sprintf("當前頁:%d/%d", currentPage, totalPage);
    lblPageInfo->setText(pageInfo);
}

         翻行和翻頁,都是先設置currentOrderNumber的值,讓後調用updateHistoryDisplay更新列表顯示。我們每走一步完整的棋,記錄就會下移一行,就相當於調用nextRecord。

源代碼下載鏈接:http://download.csdn.net/detail/zxywd/9172917

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