2017-12-31 131 views
0

내 클래스 NavaidsModel 내의 QGeoCoordinate에서 데이터를 가져 오려고합니다.프록시 필터 내의 하위 클래스에서 데이터에 액세스

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() 결과입니다

다음
class NavaidsModel : public QAbstractListModel 
{ 
    Q_OBJECT 
public: 

NavaidsModel(QObject *parent = Q_NULLPTR):QAbstractListModel(parent){ 
} 
enum NavaidsRoles { 
    PositionRole = Qt::UserRole + 1, 
    OACICodeRole, 
    CountryCodeRole 
}; 

이 NavaidsFilter 내 proxyfilter의 filterAcceptsRow()입니다 : 여기

는 NavaidsModel의 생성자

OACICode와 CountryCode는 결과에서 알 수 있듯이 괜찮습니다. 그러나 데이터 257의 경우 경계 한계 내에서 비교할 값 (lat = 21.75; lon = -107.12556; alt = 0)을 가져오고 싶습니다. 현재로서는 어떤 방식으로도 얻을 수 없습니다. .

어떻게해야합니까?

도움 주셔서 감사합니다.

+1

이것이 단순히 qDebug 및 QVariant의 제한이라고 생각합니다. 'QVariant'를 출력 할 때'qDebug'는'QString' 등의 기본 유형을 처리하는 방법을 알고 있지만'QGeoCoordinate'는 처리하지 않습니다. 'sourceIndex.data (257)'을'sourceIndex.data (257) .value (). toString()'으로 바꾸어보십시오. –

답변

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 

참고 : 그들이 당신의 코드를 더 읽기 쉽게하기 때문에 역할과 관련된 번호를 사용하지 않는 것이 좋습니다

  • , 열거의 값을 사용하는 것이 바람직하다.

  • QRegExp 대신 QRegularExpression을 사용하십시오.이 클래스는 짧은 시간에 제거 될 것이기 때문에.

+0

좋습니다. 두 분, 고맙습니다. Eyllanesc, 나는 당신이 나에게 일찍 준 기지에서 진전을 이뤘다. 그리고 당신도 저를 도와주세요. 나는 그것을 얻는 방법이 성공하지 못한 ix :: PositionRole과 같은 것이라고 잘못 생각했다. navaidsmodel.h의 포함은 소스의 역할을 이해합니다. – kontiki