C++ 检索QTableView的行号

C++ 检索QTableView的行号,c++,qt,qtableview,C++,Qt,Qtableview,我使用QTableView来显示表中的一些数据。由于没有给出垂直标题,Qt会自动为行分配行id。下例显示了下表: id|data ------- 1 | B 2 | A 3 | D 4 | C 根据“数据”列对表格进行排序后: 当用户双击一个条目时,我希望能够通过其id(即a=2、B=1、C=4、D=3)来识别单击的行。不幸的是,“onDoubleClicked”中使用的方法只返回“new”行id(即A=1、B=2、C=3、D=4) 那么,当用户双击一行时,如何检索正确的行id呢 表h #if

我使用QTableView来显示表中的一些数据。由于没有给出垂直标题,Qt会自动为行分配行id。下例显示了下表:

id|data
-------
1 | B
2 | A
3 | D
4 | C
根据“数据”列对表格进行排序后:

当用户双击一个条目时,我希望能够通过其id(即a=2、B=1、C=4、D=3)来识别单击的行。不幸的是,“onDoubleClicked”中使用的方法只返回“new”行id(即A=1、B=2、C=3、D=4)

那么,当用户双击一行时,如何检索正确的行id呢

表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
#ifndef表
#定义表H
#包括
#包括
#包括
#包括
类表:公共QTableView{
Q_对象
公众:
显式表():QTableView(){
setSortingEnabled(真);
连接(此,&表::双击,此,&表::onDoubleClicked);
}
公众时段:
void onDoubleClicked(QModelIndex索引){

qDebug()如果值与
A
绑定,则可以使用
QTableWidgetItem
提供的
setData
方法。设置值并通过特定标志获取值。可能
Qt::UserRole

编辑:

基于你的代码

items.append(新的QStandardItem(“B”);
然后您可以获得
QStandardItem
使
项.setData(1,Qt::UserRole)
,而
1
是绑定到
项.data(Qt::UserRole)的值
。注意:它将返回一个变量,然后您需要将其
传输到int

这些对我有用

void DeviceData::doubleClicked(QModelIndex cell)
{
    cell.column();
    cell.row();
}
然后可以将其输入到模型中:
model.at(cell.row())


或者您创建了一个
find()
函数。

模型没有新行(),您忘记了您正在通过代理模型传递它们。代理模型与原始模型具有不同的行()和列(),因为它可以重新排列或筛选字段

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

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());
}
void onDoubleClicked(QModelIndex索引){
QSortFilterProxyModel*m=qobject_cast(model());
自动源IDX=m->mapToSource(索引);

qDebug()我不确定,如果我理解正确,你能重新表述你的答案吗?不幸的是,我无法访问通过QSqlQueryModel添加的单个项目。你可以通过
QTableView
获取单个项目。如果你不能,我的方法不可用。那么如何排序?这与OP问题无关。
void DeviceData::doubleClicked(QModelIndex cell)
{
    cell.column();
    cell.row();
}
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());
}