gpt4 book ai didi

c++ - Qt:TableWidget 的 ItemAt() 行为怪异

转载 作者:太空狗 更新时间:2023-10-29 21:09:05 25 4
gpt4 key购买 nike

我正在开发一个 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());
}

问题是,当我右键单击同一个项目时,我得到了相同的全局坐标,但行列信息随机不同。例如,全局位置正好是 600,230,但行列对是随机的 (5,3) 和 (4,3)。我的意思是,什么?!

此外,当我单击从最后到行(晚于 13,我猜)的项目时,将永远不会进入条件“if (clickedItem && clickedItem->column()>1 && clickedItem->row()> 0)",我认为这主要是因为 'clickedItem' 为空。

我非常乐意分享更多信息,甚至是完整的 cpp-h-ui 三重奏以获得帮助。

非常感谢。

最佳答案

试试这个:

QTableWidgetItem* clickedItem = m_ui->tableWidget->itemAt(event->pos());

问题是您试图将全局位置映射到表格小部件位置,而不考虑可滚动区域。要将全局位置映射到可以传递给 itemAt 的内容,请使用 tableWidget->viewport()->mapFromGlobal

关于c++ - Qt:TableWidget 的 ItemAt() 行为怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1578006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com