我正在开发一个Windows应用程序,在一个对话框中我从Postgres查询一些数据,并在表格小部件中手动显示输出。
m_ui->tableWidget->setRowCount(joinedData.count());
for(int i=0; i<joinedData.count(); i++) //for each row
{
m_ui->tableWidget->setItem(i, 0, new QTableWidgetItem(joinedData[i].bobin.referenceNumber));
m_ui->tableWidget->setItem(i, 1, new QTableWidgetItem(QString::number(joinedData[i].bobin.width)));
m_ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getHole())));
m_ui->tableWidget->setItem(i, 3, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getLessThanZeroFive()))); m_ui->tableWidget->setItem(i, 4, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getZeroFive_to_zeroSeven())));
m_ui->tableWidget->setItem(i, 5, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getZeroFive_to_zeroSeven_repetitive())));
m_ui->tableWidget->setItem(i, 6, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getZeroSeven_to_Three())));
m_ui->tableWidget->setItem(i, 7, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getThree_to_five())));
m_ui->tableWidget->setItem(i, 8, new QTableWidgetItem(QString::number(joinedData[i].tolerance.getMoreThanFive())));
}
此外,根据行和列信息,我将一些tablewidgetitems绘制成某些颜色,但我不认为它是相关的。
我重新实现了QDialog的contextMenuEvent,以获取右键单击的tableWidgetItem的行和列坐标:
void BobinFlanView::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu(m_ui->tableWidget);
//standard actions
menu.addAction(this->markInactiveAction);
menu.addAction(this->markActiveAction);
menu.addSeparator();
menu.addAction(this->exportAction);
menu.addAction(this->exportAllAction);
//obtain the rightClickedItem
QTableWidgetItem* clickedItem = m_ui->tableWidget->itemAt(m_ui->tableWidget->mapFromGlobal(event->globalPos()));
// if it's a colored one, add some more actions
if (clickedItem && clickedItem->column()>1 && clickedItem->row()>0)
{
//this is a property, i'm keeping this for a later use
this->lastRightClickedItem = clickedItem;
//debug purpose:
QMessageBox::information(this, "", QString("clickedItem = %1, %2").arg(clickedItem->row()).arg(clickedItem->column()));
QMessageBox::information(this, "", QString("globalClick = %1, %2\ntransformedPos = %3, %4").arg(event->globalX()).arg(event->globalY())
.arg(m_ui->tableWidget->mapFromGlobal(event->globalPos()).x()).arg(m_ui->tableWidget->mapFromGlobal(event->globalPos()).y()));
menu.addSeparator();
menu.addAction(this->changeSelectedToleranceToUygun);
menu.addAction(this->changeSelectedToleranceToUyar);
menu.addAction(this->changeSelectedToleranceToDurdurUyar);
//... some other irrevelant 'enable/disable' activities
menu.exec(event->globalPos());
}
问题是,当我右键单击相同的项目时,我得到相同的全局坐标,但随机不同的行列信息。例如,全局pos正好是600,230,但行列对是随机的(5,3)和(4,3)。我的意思是,什么?!
此外,当我点击从最后一行到最后一行(超过13,我猜)时,将永远不会进入条件“if(clickedItem&amp;&amp; clickedItem-&gt; column()&gt; 1&amp;&amp; ; clickedItem-&gt; row()&gt; 0)“,我认为这主要是因为'clickedItem'为空。
我很乐意分享更多信息,甚至是完整的cpp-h-ui三人组以获得帮助。
非常感谢。
答案 0 :(得分:3)
试试这个:
QTableWidgetItem* clickedItem = m_ui->tableWidget->itemAt(event->pos());
问题是您正在尝试将全局位置映射到表小部件位置,而不考虑可滚动区域。要将全局排名映射到可以传递给itemAt
的内容,请使用tableWidget->viewport()->mapFromGlobal
。
答案 1 :(得分:0)
来到这里感谢LukášLalinský,因为他的解释为我结束了半天的苦难。
在我的情况下, itemAt()在使用 QDropEvent :: pos()时,是从表格行返回项目,偏移1。
原因是我有一个水平标题,它缩小了视口,与垂直标题相同,但由于它非常窄,我没有意识到它也导致偏移。 修复是调用QTableWidget的 viewport() - &gt; mapFromParent([drop pos]),因为位置已经在QTableWidget坐标中。
再次感谢很多人!