2017-12-31 239 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'などの基本型を扱う方法