为了省事,看到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的类里面了,但这样你在代理类里面就不要管理数据了