目前有一个窗口类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);
}请多指教!