QTableWidget::itemAt() 返回似乎随机的项。

3

我刚开始使用Qt,请多多包涵。当我使用QTableWidget->itemAt()时,它返回的项与我使用currentItemChanged并单击相同项时返回的项不同。我认为需要使用itemAt(),因为我需要获取单击行的第一列。

以下是一些示例代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QList<QString> rowContents;

    rowContents << "Foo" << "Bar" << "Baz" << "Qux" << "Quux" << "Corge" << "Grault" << "Garply" << "Waldo" << "Fred";

    for(int i =0; i < 10; ++i)
    {
        ui->tableTest->insertRow(i);
        ui->tableTest->setItem(i, 0, new QTableWidgetItem(rowContents[i]));
        ui->tableTest->setItem(i, 1, new QTableWidgetItem(QString::number(i)));
    }
}

//...

void MainWindow::on_tableTest_currentItemChanged(QTableWidgetItem* current, QTableWidgetItem* previous)
{
    ui->lblColumn->setText(QString::number(current->column()));
    ui->lblRow->setText(QString::number(current->row()));
    ui->lblCurrentItem->setText(current->text());
    ui->lblCurrentCell->setText(ui->tableTest->itemAt(current->row(), current->column())->text());
}

对于1x9的项目,lblCurrentItem显示为“9”(应该是这样),而lblCurrentCell显示为“Quux”。我做错了什么吗?

2个回答

7

Qt文档中提到:

QTableWidgetItem * QTableWidget::itemAt(int ax, int ay) const

返回表格窗口坐标系中等价于QPoint(ax, ay)位置的项目,如果该指定点不被表格窗口中任何项目覆盖,则返回0。

另请参见item()。

因此,最好使用item(row, column)代替:

ui->lblCurrentCell->setText(ui->tableTest->item(current->row(), current->column())->text());

是的,你说得对,看起来我在使用itemAt()时应该使用item()。我应该更仔细地阅读文档。谢谢你的帮助! - undefined
我犯了同样的错误。感谢你的澄清。 - undefined

1

看起来你的表格按照第0列(“Foo,Bar,...”)进行排序。这样,'Q'uux在Waldo之前排在第9位是有意义的。要么在第0列插入数字,要么禁用排序,或者我认为你已经明白了。有很多解决方案。


Jordon,你可以尝试使用item(row, col)而不是itemAt。同时注意Qt API接受(行,列)作为参数。你可能在反过来使用它-(列,行)。希望对你有帮助。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接