Qt编程基础 | 第六章-窗体 | 6.5、QTableWidget 使用过程注意的问题

一、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")

4、动态创建的代理不需要手动释放

Qt 有半自动内存管理机制,动态创建的代理会自动添加到父对象的孩子列表,当父对象释放时,会自动释放创建的代理对象。

QWidget* LineEditDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    QLineEdit *editor = new QLineEdit(parent);
    return editor;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值