C++ 检索QTableView的行号
我使用QTableView来显示表中的一些数据。由于没有给出垂直标题,Qt会自动为行分配行id。下例显示了下表: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
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());
}