检索 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());
}
我正在使用 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());
}