qt如何连接QPushButton的二维数组和return的位置

qt how to connect 2D array of QPushButton and return the location

我是 QT Creator GUI 的新手,在使用信号和槽时遇到困难。我正在使用 QT 4.2.1 制作一个用于练习的单词搜索拼图

下面是我的代码的一部分,使用矢量创建一个 2D 拼图。我尝试使用数组,但拼图的大小将由用户决定。我在使用数组时遇到了很多编译错误。所以我决定使用 Vector

我尝试了 post 中的一些选项:Get index of QPushButton on 2D array QPushButton 但它们都不起作用。

你能帮我看看为什么信号槽没有连接上吗?有没有办法检查信号是否已连接? 我将不胜感激任何帮助和反馈。谢谢!

void MainWindow::displayPuzzle(QVector<QVector<QPushButton*>>& button, QVector<QVector<QChar>> puzzle2D){

widget1 = new QWidget;
QGridLayout* l = new QGridLayout;
QSignalMapper mapper;

for (int r = 0; r < puzzle2D.size(); r++) {
    QVector<QPushButton*> vect;
    for (int c = 0; c < puzzle2D[r].size(); c++) {

        //format the button
        vect.push_back(new QPushButton);
        vect.last()->setText(puzzle2D[r][c]);
        vect.last()->setFixedSize(60,60);
        vect.last()->show();
        auto pos = QString{"%1 %2"}.arg(r).arg(c);

        //connect with signals and slots
        mapper.connect(vect.last(), SIGNAL(clicked()), SLOT(map()));
        mapper.setMapping(vect.last(), pos);

        //add button to layout
        l->addWidget(vect.last(), r, c);
        l->setSpacing(0);
        l->setMargin(0);
        l->setContentsMargins(-1,-1,-1,-1);

    }
    button.push_back(vect);
}
connect(&mapper, SIGNAL(mapped(QString)), SLOT(puzzleClick(QString)));

widget1->setLayout(l);

}

void MainWindow::puzzleClick(QString text){

    int r = text.split(" ").at(0).toInt();
    int c = text.split(" ").at(1).toInt();

    QMessageBox::information(this, "click:", r + " " + c );

}

您链接的答案非常完整和有用,我认为您应该坚持使用那个。关于这些方法的任何建议都只是重写原始答案。也许你可以问一些更具体关于你不理解这些选项的问题。

该答案中未引用的另一种解决方案是实施 class 扩展 QPushButton,拦截 clicked() 信号并使用您想要的数据重新发射它。使用 Qt5 和 C++11 中的 lambda 函数可以获得相同的结果:看看这个: 这个问题的两个答案解释了如何做到这一点。