Qt:TableWidget 的 ItemAt() 行为异常

emr*_*dog 4 c++ qt

我正在开发一个 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())));
 }
Run Code Online (Sandbox Code Playgroud)

另外,根据行和列信息,我将其中一些表格小部件绘制为某些颜色,但我认为这不相关。

我重新实现了 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());
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

多谢。

Luk*_*ský 5

尝试这个:

QTableWidgetItem* clickedItem = m_ui->tableWidget->itemAt(event->pos());
Run Code Online (Sandbox Code Playgroud)

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