一、QTableWidget 使用过程注意的问题
1、添加行时要先设置行数
往表格重添加行时,要先设置行数,不然添加的内容看不到,如下:
void QCustomWidget::InitTableContent()
{
for (int row = 0; row < m_rowData.size(); row ++)
{
// 注意:如果不设置行数,表格的内容显示不出来
m_pTableWidget->setRowCount(m_pTableWidget->rowCount() + 1);
for (int col = 0; col < MAX_COLUMN_SIZE; col ++)
{
QTableWidgetItem* pTableWidgetItemItem = new QTableWidgetItem;
switch(col)
{
case 0:
pTableWidgetItemItem->setText(m_rowData[row].name);
break;
case 1:
pTableWidgetItemItem->setText(m_rowData[row].age);
break;
default:
break;
}
m_pTableWidget->setItem(row, col, pTableWidgetItemItem);
}
}
}
2、初始化表格时屏蔽信号
某个单元格的内容发生变化,会触发cellChanged(int,int)信号。如果在初始化表格时,不希望触发信号,可以直接屏蔽QTableWidget相关的信号,如下:
// 屏蔽QtableWidget信号
m_ui->tableWidget->blockSignals(true);
for (int col = 0; col < MAX_COLUMN_SIZE; col++)
{
QTableWidgetItem* pTableWidgetItem = new QTableWidgetItem;
std::wstring text = GetTextByColumnIndex(col);
pTableWidgetItem->setText(QString::fromStdWString(text));
pTableWidgetItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
// 添加Item (注意:如果不屏蔽信号,下面添加item的操作会触发cellChanged(int,int)信号)
m_ui->tableWidget->setItem(rowCount - 1, col, pTableWidgetItem);
}
// 解除信号屏蔽
m_ui->tableWidget->blockSignals(false);
3、代理的Qt::EditRole存储的是界面显示的数据
如果界面用户输入的小数,界面显示时保留三位小数,但是实际存储时需要精度与输入的保持一致(即:输入的小数是12.345678,预期:界面显示的小数是12.346,实际存储的是12.345678)。此时、通过代理往模型存储数据时,为了保证精度不丢失,就要使用其它角色来存储数据,例如:使用Qt::UserRole存储实际的数据。
void LineEditDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
QLineEdit* pLineEdit = qobject_cast<QLineEdit*>(editor);
QString text = pLineEdit->text();
model->setData(index, text, Qt::UserRole);
}
如果直接使用Qt::EditRole存储数据,会导致精度丢失,因为执行完m_pTableWidget->item(index.row(), index.column())->setText(strText)会改变Qt::EditRole存储的数据,通过下面的输出结果可以很清晰地证明这一点,如下:
void LineEditDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
QString text = index.model()->data(index, Qt::UserRole).toString();
double value = floor((text.toDouble() * pow(10, 3) + 0.5)) / pow(10, 3);
// 单元格设置修改的值时,会修改Qt::EditRole角色存储的数据,通过下面的打印可以很清楚地证明这一点
QString strText = QString::number(value, 'f', 3);
m_pTableWidget->item(index.row(), index.column())->setText(strText);
qDebug() << "setEditorData data(Qt::EditRole) = " << m_pTableWidget->item(index.row(), index.column())->data(Qt::EditRole);
qDebug() << "setEditorData data(Qt::UserRole) = " << m_pTableWidget->item(index.row(), index.column())->data(Qt::UserRole);
QLineEdit* pLineEdit = qobject_cast<QLineEdit*>(editor);
pLineEdit->setText(text);
}
从前面界面输入小数12.345678
输出结果
setEditorData data(Qt::EditRole) = QVariant(QString, "12.346")
setEditorData data(Qt::UserRole) = QVariant(QString, "12.345678")