【发布时间】:2017-05-08 07:32:44
【问题描述】:
我正在使用 QTableView 在表格中显示一些数据。因为没有给出垂直标题,所以 Qt 会自动为一行分配一个 row-id。下面的例子显示了下表:
id|data
-------
1 | B
2 | A
3 | D
4 | C
根据“数据”列对表格进行排序后:
id|data
-------
2 | A
1 | B
4 | C
3 | D
当用户双击一个条目时,我希望能够通过其 id 来识别单击的行(即 A=2、B=1、C=4、D=3)。不幸的是,“onDoubleClicked”中使用的方法只返回“新”行ID(即A=1、B=2、C=3、D=4)。
那么当用户双击一行时,我如何检索正确的行 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();
}
【问题讨论】:
标签: c++ qt qtableview