我正在尝试从我自己的类NavaidsModel中的QGeoCoordinate获取数据。
这是NavaidsModel的构造函数:
class NavaidsModel : public QAbstractListModel
{
Q_OBJECT
public:
NavaidsModel(QObject *parent = Q_NULLPTR):QAbstractListModel(parent){
}
enum NavaidsRoles {
PositionRole = Qt::UserRole + 1,
OACICodeRole,
CountryCodeRole
};
这是我的proxyfilter NavaidsFilter的filterAcceptsRow():
bool NavaidsFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
QRegExp rx("ROBU");
QAbstractItemModel *model = sourceModel();
QHashIterator<int, QByteArray> it(sourceModel()->roleNames());
while (it.hasNext()) {
it.next();
QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent);
//Here are the tests to get the data
qDebug() <<"Data 257 :" << sourceIndex.data(257); //PositionRole
qDebug() <<"Data 258 :" << sourceIndex.data(258); //OACICodeRole
qDebug() <<"Data 259 :" << sourceIndex.data(259); //CountryCodeRole
QString key = model->data(sourceIndex, it.key()).toString();
if (key.contains(rx))
return true;
}
return false;
}
以下是qDebug()结果:
index.row = 0 role = 257
Point : "MM" "ROBSO" QGeoCoordinate(21.75, -107.12556, 0)
PositionRole QGeoCoordinate(21.75, -107.12556, 0)
Data 257 : QVariant(QGeoCoordinate, )
index.row = 0 role = 258
Point : "MM" "ROBSO" QGeoCoordinate(21.75, -107.12556, 0)
OACICodeRole "ROBSO"
Data 258 : QVariant(QString, "ROBSO")
index.row = 0 role = 259
Point : "MM" "ROBSO" QGeoCoordinate(21.75, -107.12556, 0)
CountryCodeRole "MM"
Data 259 : QVariant(QString, "MM")
OACICode和CountryCode正常,我们可以在结果中看到。 但是,对于Data 257,我希望得到值(lat = 21.75; lon = -107.12556; alt = 0)以在边界限制内进行比较,此时,我无法在任何边界限制中获取它们方式。
我怎样才能实现这一目标?
感谢您的帮助。
答案 0 :(得分:0)
假设您使用的模型我在上一个问题中向您展示:
QVariant data(const QModelIndex & index, int role=Qt::DisplayRole) const {
if (index.row() < 0 || index.row() >= mPoints.count())
return QVariant();
const NavaidsPoint &point = mPoints[index.row()];
if (role == PositionRole)
return QVariant::fromValue(point.position());
else if (role == OACICodeRole)
return point.oaciCode();
else if (role == CountryCodeRole)
return point.countryCode();
return QVariant();
}
data()
方法返回QVariant
,但默认情况下有一些类型不支持,要解决它使用QVariant::fromValue()
,所以如果你想获得值,你应该使用QVariant::value()
const,如下所示。
#ifndef NAVAIDSFILTER_H
#define NAVAIDSFILTER_H
#include "navaidsmodel.h"
#include <QSortFilterProxyModel>
#include <QRegularExpression>
#include <QDebug>
class NavaidsFilter : public QSortFilterProxyModel
{
public:
NavaidsFilter(QObject *parent = Q_NULLPTR):QSortFilterProxyModel(parent){}
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const{
QRegularExpression rx("ROBU");
QModelIndex ix = sourceModel()->index(source_row, 0, source_parent);
QGeoCoordinate pos = ix.data(NavaidsModel::PositionRole).value<QGeoCoordinate>();
QString code = ix.data(NavaidsModel::OACICodeRole).toString();
QString country = ix.data(NavaidsModel::CountryCodeRole).toString();
qDebug()<<pos<<code<<country;
if(code.contains(rx)){
return true;
}
return false;
}
};
#endif // NAVAIDSFILTER_H
注意:强>
不建议使用与角色关联的数字,最好使用枚举的值,因为它们使您的代码更具可读性。
使用QRegularExpression
代替QRegExp
,因为此课程将在短时间内消除。