从代理过滤器中的子类访问数据

时间:2017-12-31 14:54:51

标签: c++ qt

我正在尝试从我自己的类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)以在边界限制内进行比较,此时,我无法在任何边界限制中获取它们方式。

我怎样才能实现这一目标?

感谢您的帮助。

1 个答案:

答案 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,因为此课程将在短时间内消除。