检索 QTableView 的行号

Retrieving the row number of a QTableView

我正在使用 QTableView 在 table 中显示一些数据。因为没有给出垂直 header,所以 Qt 自动将 row-id 分配给一行。下面的示例显示以下 table:

id|data
-------
1 | B
2 | A
3 | D
4 | C

根据 "data" 列对 table 进行排序后:

id|data
-------
2 | A
1 | B
4 | C
3 | D

当用户 double-clicks 一个条目时,我希望能够通过其 id(即 A=2、B=1、C=4、D=3)识别被点击的行。不幸的是,"onDoubleClicked"中使用的方法只有return "new" row-id(即A=1,B=2,C=3,D=4)。

那么,当用户双击某行时,如何检索正确的 row-id?

table.h

#ifndef TABLE_H
#define TABLE_H

#include <QTableView>
#include <QModelIndex>
#include <QHeaderView>
#include <QDebug>

class Table : public QTableView {
    Q_OBJECT

public:
    explicit Table() : QTableView() {
        setSortingEnabled(true);
        connect(this, &Table::doubleClicked, this, &Table::onDoubleClicked);
    }

public slots:
    void onDoubleClicked(QModelIndex index) {
        qDebug() << index.row();
        qDebug() << verticalHeader()->logicalIndex(index.row());
        qDebug() << verticalHeader()->logicalIndexAt(index.row());
        qDebug() << verticalHeader()->visualIndex(index.row());
        qDebug() << verticalHeader()->visualIndexAt(index.row());
    }
};

#endif // TABLE_H

main.cpp

#include <QApplication>
#include <QStandardItemModel>
#include <QSortFilterProxyModel>

#include "table.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Table table;
    QStandardItemModel model;

    QList<QStandardItem*> items;
    items.append(new QStandardItem("B"));
    items.append(new QStandardItem("A"));
    items.append(new QStandardItem("D"));
    items.append(new QStandardItem("C"));
    model.appendColumn(items);

    QSortFilterProxyModel proxy;
    proxy.setSourceModel(&model);
    proxy.sort(0, Qt::AscendingOrder);

    table.setModel(&proxy);
    table.show();

    return a.exec();
}

如果该值与 A 绑定,您可以使用 QTableWidgetItem 提供的 setData 方法。设置该值并通过特定的 flag.maybe 取回该值Qt::UserRole

编辑:

基于您的代码。

items.append(new QStandardItem("B")); 然后你可以获得 QStandardItem 使 item.setData(1,Qt::UserRole)1 是绑定到 "B" 的值。稍后你可以从 item.data(Qt::UserRole) 获得绑定值。注意:它会 return 一个变体然后你需要转移它 toInt

这些对我有用。

void DeviceData::doubleClicked(QModelIndex cell)
{
    cell.column();
    cell.row();
}

然后您可以将其输入模型:model.at(cell.row())
或者你创建一个 find() 函数。

该模型没有新的 row(),您忘记了您是通过代理模型传递它们的。代理模型拥有与原始模型不同的 rows() 和 columns(),因为它可以重新排列或过滤字段。

修复很简单 - 您只需将索引从代理模型映射到原始模型。

void onDoubleClicked(QModelIndex index) {
    QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel*>(model()); 

    auto sourceIdx =  m->mapToSource(index);
    qDebug() << sourceIdx.row();
    qDebug() << verticalHeader()->logicalIndex(sourceIdx.row());
    qDebug() << verticalHeader()->logicalIndexAt(sourceIdx.row());
    qDebug() << verticalHeader()->visualIndex(sourceIdx.row());
    qDebug() << verticalHeader()->visualIndexAt(sourceIdx.row());
}