QTableWidget Checkbox 获取状态和位置

QTableWidget Checkbox get state and location

如何获取所有checkbox的状态和checked的行列? Onclick 按钮函数。

    QTableWidget *t = ui->tableWidget;
    t->setRowCount(2);
    t->setColumnCount(2);

    QStringList tableHeader;
    tableHeader<<"item01"<<"item02";
    t->setHorizontalHeaderLabels(tableHeader);

    for (int i = 0; i < t->rowCount(); i++) {
        for (int j = 0; j < t->columnCount(); j++) {
            QWidget *pWidget = new QWidget();
            QHBoxLayout *pLayout = new QHBoxLayout(pWidget);
            QCheckBox *pCheckBox = new QCheckBox();
            pLayout->setAlignment(Qt::AlignCenter);
            pLayout->setContentsMargins(0,0,0,0);
            pLayout->addWidget(pCheckBox);
            pWidget->setLayout(pLayout);
            t->setCellWidget(i, j, pWidget);
        }
    }

当我单击按钮时,我需要获取所有选定的元素及其行、列。

void Widget::on_pushButton_clicked()
{

    // Code here    

    // For example: Selected ["item01", 2]
}

我只是遍历所有单元格小部件:

for (int i = 0; i < t->rowCount(); i++) {
    for (int j = 0; j < t->columnCount(); j++) {
        QWidget *pWidget = t->cellWidget(i, j);
        QCheckBox *checkbox = pWidget->findChild<QCheckBox *>();
        if (checkbox && checkbox->isChecked())
            qDebug() << t->horizontalHeaderItem(j)->text() << i;
    }
}

我已经有一段时间没有使用 Qt 编程了,但我相信没有什么好的方法可以做到这一点。我已成功完成所有这些解决方案。

1) 像 svlasov 的回答说的那样遍历所有单元格小部件。这有一些可扩展性问题。

2) 创建哈希映射,其中指向按钮的指针是键,您想要的索引是值。您可以通过 QObject::sender().

获取点击了哪个按钮

3) 创建按钮时,将所需的索引存储为按钮的属性(参见 setProperty() in QObject's documentation)。例如,

button->setProperty("x index", x);  

在您的 slot 中,使用 QObject::sender() 获取指向按钮的指针,然后调用

button->property("x");

我通常发现第三个选项最干净、性能最好。

请注意,这些答案也适用于 QTreeWidgets 和 QListWidgets。