Как обновить элемент из 2d массива меток по клику? - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь настроить графический интерфейс для игры Gomoku, используя QT. До сих пор мне удалось создать двумерный массив ячеек, и я прикрепил к ним изображение с пустой ячейкой. Сейчас я пытаюсь обновить ячейку по щелчку мыши, но не могу понять, как это сделать правильно. Я не могу понять, как отправить сигнал, содержащий индекс ячейки, которую я хочу изменить (ячейки [x] [y]).

Я пытался собрать некоторые сигналы и слоты, но я не смог заставить их работать.

Это мой GameCell.h:

class GameCell : public QLabel
{
public:
    enum State {Unused, White, Black};
    GameCell(QWidget *parent = nullptr);
    State getState() const { return currentState; }
    void setState(State newState);
private:
    State currentState;
    void updateCell();
};

А это GameCell.cpp:

#include "gamecell.h"

GameCell::GameCell(QWidget *parent) : QLabel (parent), currentState(Unused)
{
    updateCell();
}

void GameCell::setState(State newState) {
    if (currentState != newState) {
        currentState = newState;
        updateCell();
    }
}

void GameCell::updateCell(){
    QImage cellImage;
    switch (currentState) {
    case Unused:
        cellImage.load("emptyCell.png");
        break;
    case White:
        cellImage.load("whiteCell.png");
        break;
    case Black:
        cellImage.load("blackCell.png");
        break;
    }
    this->setPixmap(QPixmap::fromImage(cellImage));
}

Вот как я храню ячейки на экране:

GameMap::GameMap(QWidget *parent) : QWidget(parent)
{
    layout = new QGridLayout (this);
    for(int column = 0; column < Columns; column++)
        for(int row = 0; row < Rows; row++) {
            GameCell* cell = new GameCell(this);
            cells[column][row] = cell;
            layout->addWidget(cell, row, column);
        }
}

И вот как я их отображаю в классе Game:

Game::Game(QWidget *parent) : QDialog (parent)
{
    board = new GameMap (this);

    layout = new QHBoxLayout (this);
    layout->addWidget(board);
    setLayout(layout);

    setWindowTitle(tr("Gomoku"));
}

Я надеюсь, что вы можете помочь мне с подходом, который я должен попытаться реализовать. Я новичок в QT и не могу найти помощь по моей проблеме. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...