2017-12-31 113 views
0

Ich versuche, Daten von einem QGeoCoordinate innerhalb meiner eigenen Klasse NavaidsModel zu erhalten. HierZugriff auf Daten aus der Unterklasse innerhalb eines Proxy-Filters

ist der Konstruktor von NavaidsModel:

class NavaidsModel : public QAbstractListModel 
{ 
    Q_OBJECT 
public: 

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

Hier ist die filterAcceptsRow() meines proxyfilter NavaidsFilter:

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

Und hier sind die qDebug() Ergebnisse:

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 ein CountryCode sind OK, wie wir in den Ergebnissen sehen können. Aber für Daten 257 möchte ich die Werte (lat = 21,75; lon = -107,12556; alt = 0) innerhalb einer Grenze zu vergleichen, und zu diesem Zeitpunkt kann ich sie in keiner Weise erhalten .

Wie kann ich das erreichen?

Danke für Hilfe.

+1

Ich vermute, das ist einfach eine Einschränkung von 'qDebug' und' QVariant'. Bei der Ausgabe eines 'QVariant' weiß' qDebug', wie man mit Grundtypen wie 'QString' etc., aber nicht mit' QGeoCoordinate' umgehen kann. Ersetzen Sie 'sourceIndex.data (257)' durch 'sourceIndex.data (257) .value (). ToString()'. –

Antwort

0

Angenommen, Sie das Modell verwenden ich Ihnen in einer früheren Frage zeigte:

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

Die data() Methode ein QVariant gibt, aber es gibt einige Arten, die standardmäßig nicht unterstützt werden, es zu lösen QVariant::fromValue() verwenden, Wenn Sie also den Wert erhalten wollen, sollten Sie QVariant::value() const verwenden, wie ich unten zeige.

#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 

Hinweis:

  • Es ist nicht ratsam, die Zahlen mit den Rollen zugeordnet zu verwenden, ist es vorzuziehen, die Werte der Enumeration zu verwenden, da sie den Code besser lesbar zu machen.

  • Verwenden Sie QRegularExpression anstelle von QRegExp, da diese Klasse in kurzer Zeit eliminiert wird.

+0

Großartig, großartig. Ich danke Ihnen sehr, zwei. Eyllanesc, ich komme auf den Grundlagen voran, die du mir früher gegeben hast und ja, Daten() bleiben unverändert. Und du hilfst mir auch bei der Rolle. Ich dachte fälschlicherweise, dass der Weg, um es zu bekommen, etwas wie ix :: PositionRole ohne Erfolg war, natürlich. Include of navaidsmodel.h Sinn machen, um die Rolle der Quelle zu bekommen. – kontiki

Verwandte Themen