2017-12-31 204 views
0

自分のクラス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()である:

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") 

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()の結果は、

OACICodeとCountryCodeは、結果でわかるようにOKです。 しかし、データ257の場合、境界の制限内で比較する値(lat = 21.75; lon = -107.12556; alt = 0)を取得したいと考えていますが、現時点ではどのような方法でも取得できません。

どうすれば実現できますか?

ありがとうございました。 、data()方法はQVariantを返しますが、QVariant::fromValue()を使用し、それを解決するために、デフォルトでサポートされていないいくつかの種類があり、

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(); 
} 

:あなたは、私は前の質問でお見せしたモデルを使用していると仮定すると、

+1

これは単にqDebugとQVariantの制限であると思われます。 'QVariant'を出力するときに' qDebug'は 'QString'などの基本型を扱う方法を知っていますが、' QGeoCoordinate'は扱いません。 'sourceIndex.data(257)'を 'sourceIndex.data(257).value ()。toString()'に置き換えてみてください。 –

答えて

0

値を取得したい場合は、以下に示すように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 

注:

  • 彼らがあなたのコードをより読みやすくするので、列挙型の値を使用することが好ましい、役割に関連付けられた番号を使用することはお勧めできません。

  • QRegExpの代わりにQRegularExpressionを使用してください。このクラスは短時間で削除されるためです。

+0

素晴らしい、素晴らしい。私はあなたにとても感謝しています。 Eyllanesc、私はあなたが以前に私に与えたベースで進歩します。そして、あなたも私の役割を助けます。私は間違って、それを取得する方法はix:もちろん、成功なしのPositionRoleのようなものだと思った。 navaidsmodel.hをインクルードの役割を果たすには意味があります。 – kontiki

関連する問題