• 12267阅读
  • 1回复

[提问]QTableWidget如何添加或者删除行? [复制链接]

上一主题 下一主题
离线红调
 

只看楼主 正序阅读 楼主  发表于: 2014-04-18
目前有一个窗口类AdaptionExperiment,AdaptionExperiment中有一个属性是QTableWidget *tablewidget.将tablewidget放到窗口类的中间。
目前想实现一个功能就是在tablewidget上邮件单击能弹出一个菜单,可以选择或者在当前位置增加一行或者删除当前位置一行。
我试了三种方法,前两种都没实现,第三种实现了,但我想问一下前两种错在哪里。
第一种方法:

void AdaptionExperiment::contextMenuEvent(QContextMenuEvent *event)
{
    QPoint wpoint = event->pos(); //得到在窗口中的坐标
    QPoint tpoint = this->tablewidget->pos();//tablewidget在窗口中的坐标
    QPoint point = wpoint-tpoint;
    QTableWidgetItem *item1 = this->tablewidget->itemAt(point);
…………………………
}
想要通过itemAt的方法来找到待插入/删除的item的位置,但是发现这个位置总是会偏离一点点(一个格子),于是我直接传参数wpoint给itemAt,发现还是偏离,我不知道如何改正,什么样的点才是itemAt该用的点?

第二种方法:

void AdaptionExperiment::mousePressEvent(QMouseEvent* event)
{
    if(event->button() == Qt::RightButton)
    {
        QPoint wpoint = event->pos(); //得到在窗口中的坐标        QPoint tpoint = this->tablewidget->pos();//tablewidget在窗口中的坐标
        QPoint point = wpoint-tpoint;
        QTableWidgetItem *item1 = this->tablewidget->itemAt(point);
…………………………
    }
}这种方法在邮件点击widget外的部分的时候才会被调用,而点击widget里边的东西的时候完全没反应啊,请问如何使得点击widget里边的时候调用这个函数呢?(我估计是不是它调用了QTableWidget的函数了,就不调用窗口类的函数了)。
第三种方法是我实际用成功的方法,也贴上来吧。
void AdaptionExperiment::contextMenuEvent(QContextMenuEvent *event)
{
    CreateContextMenu();
} void AdaptionExperiment::CreateContextMenu()
{
    QMenu* pop_menu = new QMenu();
    QAction* action_insert = new QAction(this);
    QAction* action_delete = new QAction(this);
    action_insert->setText(tr("Insert Row"));
    action_delete->setText(tr("Delete Row"));
    pop_menu->addAction(action_insert);
    pop_menu->addAction(action_delete);
    connect(action_insert,SIGNAL(triggered()),this,SLOT(addtablerow()));
    connect(action_delete,SIGNAL(triggered()),this,SLOT(deletetablerow()));
    pop_menu->exec(QCursor::pos());
}void AdaptionExperiment::addtablerow()
{
    int rowid = this->tablewidget->currentRow();
    this->tablewidget->insertRow(rowid);
}void AdaptionExperiment::deletetablerow()
{
    int rowid = this->tablewidget->currentRow();
    this->tablewidget->removeRow(rowid);
}请多指教!
离线kimtaikee

只看该作者 1楼 发表于: 2014-04-18
针对前两种,你用globalPos()试试。

快速回复
限100 字节
 
上一个 下一个