QTableWidget中,某一列使用了控件而并非TableItem,因此需要获取到某个控件的当前值用于保存。程序示例如下:
添加CellWidget代码如下:
QComboBox *combo = new QComboBox;
QCheckBox *checkBox = new QCheckBox;
QWidget *cwidget = new QWidget;
QHBoxLayout *layout = new QHBoxLayout;
layout->setSpacing(0);
layout->setMargin(0);
layout->addWidget(checkBox);
layout->setAlignment(checkBox, Qt::AlignCenter); // 控件居中
cwidget->setLayout(layout);
combo->addItems(varlist);
if (instr_var_list->rowCount() <= Var_Max_Num)
{
instr_var_list->insertRow(instr_var_list->rowCount());
instr_var_list->setCellWidget(instr_var_list->rowCount() - 1, 2, combo);
instr_var_list->setCellWidget(instr_var_list->rowCount() - 1, 3, cwidget);
instr_var_list->setItem(var_count, 0 ,new QTableWidgetItem(QString::number(var_count + 1)));
var_count++;
}
插入之后,需要以CellWidget的形式获取某一个位置Item的信息,其中,cellWidget返回值为QWidget*。此处三个参数分别为:
table:传入的QTableWidget对象;
row:需要查找的CellWidget所在的行;
column:需要查找的CellWidget所在的列
QWidget *getCellWidget(QTableWidget *table, int row, int column)
{
return table->cellWidget(row,column);
}
获取到之后返回之后,需要将QWidget*转化为所对应的对象,如上,添加了一个QComboBox*和一个QWidget*对象,这里转化函数则是:
// 获取QComboBox的当前值
QString currentText = qobject_cast<QComboBox*>(getCellWidget(instr_var_list,i,2))->currentText();
紧接着是获取QCheckBox中的选中状态,之前上面设置CellWidget时候,并没有直接设置的QCheckBox为CellWidget,而是将QCheckBox放入的QWdiget中,因此,需要获取QCheckBox的选中状态,还需要对获取到的CellWidget做进一步的转化,转化过程如下:
QCheckBox* check = getCellWidget(instr_var_list,i,3)->findChild<QCheckBox*>();
这里通过找到CellWidget中的Wigdet*,利用其findChild函数找到获取Widget中的CheckBox子对象,即可找到所需的QCheckBox对象。其它同理。