我试了下,好多方法都不行,但下面这个方法可行,没什么问题。
你看下代码,我相信你明白的。
有什么问题期待你的交流。
#include <QSignalMapper>
#include <QtGui/QPushButton>
TableWidget::TableWidget(QWidget *parent) :
QWidget(parent)
{
ui.setupUi(this);
ui.tbw->setColumnCount(3);
ui.tbw->setRowCount(5);
//用于信号槽参数转换
QSignalMapper *signalMapper = new QSignalMapper(this);
QTableWidgetItem *item;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
if (j != 2) {
//插入数据的item
if (j == 0) {
//记录每一行第一列的item指针地址
item = new QTableWidgetItem(tr("(%1, %2)").arg(i).arg(j));
ui.tbw->setItem(i, j, item);
} else
ui.tbw->setItem(i, j,
new QTableWidgetItem(tr("(%1, %2)").arg(i).arg(j)));
} else {
//插入按钮的item
QPushButton *btn = new QPushButton;
btn->setText("delete");
/*
* 将item的地址值写入btn的itemAddr属性
*/
QString strAddr;
strAddr.sprintf("%X", item);
btn->setProperty("itemAddr", qPrintable(strAddr));
ui.tbw->setCellWidget(i, j, btn);
connect(btn, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(btn,
btn->property("itemAddr").toString());
}
}
}
connect(signalMapper, SIGNAL(mapped(const QString &)), this,
SLOT(del(const QString &)));
}
void TableWidget::del(const QString &s)
{
//将地址值转换为QTableWidgetItem类型指针
bool ok;
QTableWidgetItem *item = reinterpret_cast<QTableWidgetItem*> (s.toInt(&ok,
16));
if (ok)
ui.tbw->removeRow(item->row());
}