QTableWidget不要用QModelIndex做QMap的key

文章指出在Qt编程中,直接使用QModelIndex可能会在删除中间行时引发bug,因为行号会改变导致数据错位。解决方法是创建自定义代理Delegate,如ButtonDelegate,在添加行时为每一项设置独特数据(如UserRole),并在Delegate的paint函数中正确获取和处理数据,避免了索引问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了省事,看到csdn上很多都是这样搞的,这样做会导致bug,因为当你删除中间的任意一行,那么你选中的那行的QModelIndex里面row会减减,这样QMap去contains就是找到了你选中的那行的下面那一行了,这样就bug了

正确的做法是:

设置代理后

m_btnDelegate = new ButtonDelegate(this);

ui->tableWidget->setItemDelegateForColumn(1, m_btnDelegate);//发送按钮

在添加一行AddRow的函数里面:

........

QString key = QString("out%1").arg(allocCount++);

........

Item = new QTableWidgetItem();

Item->setData(Qt::UserRole, key);//设置数据

ui->tableWidget->setItem(rowCount, 1, Item);

........

然后在ButtonDelegate类的void ButtonDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const函数里面:

QString key = qvariant_cast<QString>(index.data(Qt::UserRole));

ItemData* data = m_mapDatas.value(key);

if (!data) {

data = new ItemData;

(const_cast<ButtonDelegate*>(this))->m_datas.insert(key, data);

}

否则的画,你只能把m_mapDatas建立在管理tableWidget的类里面了,但这样你在代理类里面就不要管理数据了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值