0

次の方法で、QCheckBox を QTableWidget に格納しています。

QCheckBox *checkBox = new QCheckBox();
QWidget *widget = new QWidget();
QHBoxLayout *layout = new QHBoxLayout(widget);
layout->addWidget(checkBox);
layout->setAlignment(Qt::AlignCenter);
layout->setContentsMargins(0,0,0,0);
widget->setLayout(layout);
tableWidget->setCellWidget(row, 2, widget);

次に、次のことをキャッチstateChanged()checkBoxます。

connect( checkBox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxStateChanged(int)) );
void MainWindow::checkBoxStateChanged(int)
{
    QCheckBox * box = qobject_cast< QCheckBox * >( sender() );
    if( !box ) {
        return;
    }
}

今、私は行くことができますQTableWidget- それはbox->parent()->parent()->parent()です。その前のオブジェクト、つまりbox->parent()->parent()is qt_scrollarea_viewport(それはobjectName()) です。「ビューポート」の子を検索しました16 QWidgetsが、テーブル内の行数があります。ただし、その子供はQHBoxLayoutとのみQCheckBoxです。どうやら参照はありませんQTableWidgetItem- 私がいくつかの並列オブジェクト階層にいて、他の階層にいるように見えQTableWidgetItemます。本当?アイテムの入手方法は?

4

1 に答える 1

1

この質問を参照してください: cellWidget セットを使用して QTableWidget セルからのシグナルを処理する方法

あなたのケースに適応:

void MainWindow::checkBoxStateChanged(int)
{
    QCheckBox * box = qobject_cast< QCheckBox * >( sender() );
    if (box)
    {
        int row = box->property("row").toInt();
        int column = box->property("column").toInt();
        QTableWidgetItem* item = tableWidget->item(row, column);
    }
}
于 2016-07-16T23:07:52.630 に答える