在QtableWidget中,如何使用更改的另一个单元格的数据自动在同一行的单元格中进行计算?

How to automatically make a calculation in a cell in the same row using the data of another cell that is changed in QtableWidget?

基本上我有一个 table 小部件。 table 中的 2 列分别包含直径和面积。

我基本上希望在输入直径时在相应的单元格中计算面积。如果我输入该区域,则类似地计算直径。

我制作了连接函数,当单元格更改时发送信号,这用于检测行和列以确切知道哪个单元格,SLOT 是计算发生的函数。所以这个:

    QObject::connect(TabUI.tableWidget, &QTableWidget::itemChanged, this, &Pressurator::CalculateArea);

还有这个:

void Pressurator::CalculateArea(QTableWidgetItem *item)
{

//        QTableWidgetItem * item = new QTableWidgetItem;
//        double area = 0;
//        QDoubleSpinBox * diameter_SB =  static_cast<QDoubleSpinBox*>(TabUI.tableWidget->cellWidget(item->row(),0));
//        QDoubleSpinBox * area_SB =  static_cast<QDoubleSpinBox*>(TabUI.tableWidget->cellWidget(item->row(),1));

//        area = M_PI * qPow(diameter_SB->value()/2, 2);
//        area_SB->setValue(area);


    row = item->row();
    column = item->column();

    qDebug()<<"DETECTED--->"<<row<<" | "<<column;
if(column == 0){
    diameter = TabUI.tableWidget->item(row,0)->text().toDouble();
    qDebug()<<"Diameter: "<<diameter<<Qt::endl;
    area = M_PI * qPow(diameter/2, 2);
    qDebug()<<"Area: "<<area<<Qt::endl;
    TabUI.tableWidget->item(row,1)->setText(QString::number(area, 'f', 6));
}else if(column == 1){
    area = TabUI.tableWidget->item(row,1)->text().toDouble();
    diameter = qSqrt((4* area)/M_PI);
    TabUI.tableWidget->item(row,0)->setText(QString::number(diameter, 'f', 6));
}

我在其中一个单元格中输入数据后,我的应用程序一直崩溃,所以我真的不知道如何继续或崩溃的原因。

我只是在构造我的表单时定义了我的 tableWidget(不是在 CalculateArea 函数中),如下所示并且它起作用了:

QTableWidget* tableWidget = new QTableWidget();
tableWidget->setRowCount(1);
tableWidget->setColumnCount(2);
QTableWidgetItem* item = new QTableWidgetItem("1.0");
QTableWidgetItem* item2 = new QTableWidgetItem("0.785398");
tableWidget->setItem(0, 0, item);
tableWidget->setItem(0, 1, item2);
tableWidget->show();

在 QTableWidget class 中,只要项目的数据发生变化,就会发出信号“itemChanged”。在“CalculateArea”插槽的定义中,您正在尝试设置导致发出另一个信号的数据。所以会卡在stack overflow。您可以在尝试设置数据之前屏蔽信号。

row = item->row();
column = item->column();
TabUI.tableWidget->blockSignals(true);
.
. // Set your data (if / else if) ...
.
TabUI.tableWidget->blockSignals(false);