Qt - не могу найти подходящего отправителя () - PullRequest
0 голосов
/ 02 мая 2018

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

Таким образом я соединяю кнопки с функцией, которую я хочу использовать при использовании кнопки

    for(int i=0; i<size; ++i)
    {
        for(int j=0; j<size; ++j)
        {
            grid->addWidget(board->dis_board[i][j], i, j);
            board->dis_board[i][j]->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
            connect(board->dis_board[i][j], SIGNAL(clicked(bool)), SLOT(move()));
        }
    }
}

И здесь вы упомянули функцию

void Game::move()
{
    unsigned long x=0;
    unsigned long y=0;
    QPushButton* buttonSender = qobject_cast<QPushButton*>(sender());
    for(; x<board->dis_board.size(); ++x)
    {
        for(; y<board->dis_board.size(); ++y)
        {
            if(board->dis_board[x][y] == buttonSender)
                break;
        }
    }
    board->move(x,y);
}

где move (x, y) - это метод объекта, называемый board

Проблема в том, что когда я прохожу цикл for в Game :: move () my x и y получить значение 5 (поэтому я предполагаю, что sender () не может быть найден).

В чем может быть проблема? Если потребуется больше кода, я могу доставить больше.

Ошибки не отображаются

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

В качестве альтернативы, если у вас есть Qt 5 и компилятор C ++ 11 или новее, вы можете просто включить в соединение оригинальные x и y.

for(int i=0; i<size; ++i)
{
    for(int j=0; j<size; ++j)
    {
        grid->addWidget(board->dis_board[i][j], i, j);
        board->dis_board[i][j]->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        connect(board->dis_board[i][j], &QPushButton::clicked, this, [this, i, j](){ board->move(i, j); });
    }
}

// No Game::move
0 голосов
/ 02 мая 2018

Оператор break выходит только из внутреннего y -цикла, но не из внешнего x -петля.

У вас должен работать следующий код:

void Game::move()
{
    QPushButton* buttonSender = qobject_cast<QPushButton*>(sender());
    for(unsigned long x=0; x<board->dis_board.size(); ++x)
    {
        for(unsigned long y=0; y<board->dis_board.size(); ++y)
        {
            if(board->dis_board[x][y] == buttonSender)
            {
                board->move(x,y);
                return;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...