• 5903阅读
  • 8回复

[提问](急!)懂qtablewidget来帮下忙! [复制链接]

上一主题 下一主题
离线ssa8023ddy
 
只看楼主 倒序阅读 楼主  发表于: 2012-06-11
QTableWidget的每一行最后都加了个按钮,想实现单击这个按钮就删除此行数据,但是在槽函数里获取到的currentRow()是不对的,该怎么样才能实现这样的功能,小弟新手,最好能给出代码例子!谢谢!
离线passion_wu
只看该作者 1楼 发表于: 2012-06-11
你的按钮是放在QTableWidget里面的么?有个截图么?
离线ssa8023ddy
只看该作者 2楼 发表于: 2012-06-11
回 1楼(passion_wu) 的帖子
如图:

离线passion_wu
只看该作者 3楼 发表于: 2012-06-11
回 2楼(ssa8023ddy) 的帖子
我先学习下你是怎么把按钮放进去的,我再帮你想办法。
离线passion_wu
只看该作者 4楼 发表于: 2012-06-11
我知道了,应该是void QTableWidget::setCellWidget ( int row, int column, QWidget * widget )吧?
离线ssa8023ddy
只看该作者 5楼 发表于: 2012-06-11
回 3楼(passion_wu) 的帖子
QPushButton *btn = new QPushButton; tableWidget->setCellWidget(row, cloumn, btn);
我是这样加进去的额
离线passion_wu
只看该作者 6楼 发表于: 2012-06-11
我试了下,好多方法都不行,但下面这个方法可行,没什么问题。
你看下代码,我相信你明白的。
有什么问题期待你的交流。
#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());
}
离线ssa8023ddy
只看该作者 7楼 发表于: 2012-06-11
回 6楼(passion_wu) 的帖子
懂了,学到很多!谢谢!!!
离线passion_wu
只看该作者 8楼 发表于: 2012-06-11
回 7楼(ssa8023ddy) 的帖子
不谢,今天上班刚好无聊。
快速回复
限100 字节
 
上一个 下一个