Qt - 找不到合适的发件人()

时间:2018-05-02 08:23:12

标签: c++ qt

我想确定点击了哪个按钮,但在我的 for循环中,我用它来找到正确的 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

的对象的方法

当我在 Game :: move()我的 x 中浏览 for循环时会遇到问题y 获取值 5 (因此我认为无法找到 sender()。)

可能是什么问题?如果需要更多代码,我可以提供更多代码。

没有显示错误

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

作为替代方案,如果你有Qt 5和C ++ 11或更高版本的编译器,你可以只包含原始的xy连接。

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