Qt Как проверить флажок состояния в QtableWidget

Недавно я обнаружил, что флажок помещается в середине элемента QtableWidget. Однако я не знаю, как проверить состояние, нажата ли кнопка. Не могли бы вы рассказать мне, как проверить состояние кнопки?

вот что я нашел код:

QWidget *pWidget = new QWidget();
QCheckBox *pCheckBox = new QCheckBox();
QHBoxLayout *pLayout = new QHBoxLayout(pWidget);
pCheckBox->setCheckState(Qt::Checked);
pLayout->addWidget(pCheckBox);
pLayout->setAlignment(Qt::AlignCenter);
pLayout->setContentsMargins(0,0,0,0);
pWidget->setLayout(pLayout);
ui->tableWidget2->setCellWidget(2,2, pWidget);

person Jongju Kim    schedule 30.11.2013    source источник
comment
есть прогресс в этом?   -  person froderik    schedule 16.03.2015


Ответы (2)


Хотя это очень поздно, вы можете решить это следующим образом:

auto field = ui->tableWidget2->cellWidget(2, 2, pWidget);

std::cout << qobject_cast<QCheckBox*>(field)->isChecked() << std::endl;

Это работает и для других типов (QComboBox и т. д.). Хотя, вероятно, было бы лучше просто использовать функциональность флажка, которая уже есть у QTableWidgetItem.

Этот пример может не работать, если вы используете флажок с тремя состояниями, и в этом случае вы должны вызвать: checkState() и сравнить его с Qt::CheckState. Если qobject_cast<T> не получится, можно использовать reinterpret_cast<T>.

person Floris Velleman    schedule 30.03.2015

Я предполагаю, что вы создали свои флажки в QWidgetTable следующим образом:

int row...;int column...;
...
QTableWidgetItem *checkBoxItem = new QTableWidgetItem();
checkBoxItem->setCheckState(Qt::Unchecked);
ui->Table->setItem(row, column, checkBoxItem);

Вы можете проверить статус элемента, который соответствует вашему виджету, в другой функции, например:

void MainWindow::on_Table_cellClicked(int row, int column)
{
    QTableWidgetItem *checkBoxState = ui->Table->item(row, column);

    if(ui->Table->item(row,column)->checkState())
    {
        checkBoxState->setCheckState(Qt::Unchecked);
        ui->Table->setItem(row, column, checkBoxState);
    }
    else
    {
        checkBoxState->setCheckState(Qt::Checked);
        ui->Table->setItem(row, column, checkBoxState);
    }
}
person Ferhat Özdogan    schedule 13.12.2018
comment
Подождите, а зачем вы создаете новый QTableWIdgetItem? - person rubenvb; 13.12.2018
comment
изменить QTableWidgetItem *checkBoxState = new QTableWidgetItem(); на QTableWidgetItem *checkBoxState = ui->Table->item(row, column); - person eyllanesc; 13.12.2018
comment
можете ли вы сказать, как мы можем проверить тип ячейки, ее флажок или текстовое поле и т. д. - person user889030; 18.12.2019
comment
Я думаю, вы не знали, что понимаете особую точку этого вопроса, особая точка использует setCellWidget для установки элемента вместо использования ui->Table->setItem для установки элемента, я не проверял это, но я думаю, таким образом, ui->Table->item(row, column) что-то вернет что вы не ожидали. - person Wade Wang; 01.07.2021