2017-12-23 3 views
0

Ich bin ein Compilation Problem konfrontiert QSortFilterProxyModel verwenden, wenn zu setSourceModel versuchenFehler: keine passende Funktion für Aufruf QSortFilterProxyModel :: setSourceModel (NavaidsModel &

Die Fehlermeldung lautet:. Keine passende Funktion für Aufruf QSortFilterProxyModel :: setSourceModel (NavaidsModel &)

und der Kandidat ist: virtual void SortFilterProxyModel :: setSourceModel (QAbstractItemModel *)

Hier ist mein Code:

main.cpp

#include "navaidsmodel.h" 
#include <QListView> 
#include <QApplication> 
#include <QSortFilterProxyModel> 

int main(int c, char **v) 
{ 
    QApplication a(c, v); 

    //Model 
    NavaidsModel model; 
    model.readFromCSV(QCoreApplication::applicationDirPath() + "/files/data.csv"); 

    //Proxy 
    QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel; 
    proxyModel->setSourceModel(model);        //Here is the trick 

    //Filter 
    QRegExp rx("ROBU"); 
    rx.setCaseSensitivity(Qt::CaseInsensitive); 
    rx.setPatternSyntax(QRegExp::Wildcard); 
    proxyModel->setFilterRegExp(rx); 
    proxyModel->setFilterKeyColumn(0); 

    //View 
    QListView view; 
    view.setUniformItemSizes(true); 
    view.setModel(proxyModel); 
    view.show(); 

    return a.exec(); 
} 

und hier ist der Konstruktor für navaidsmodel:

class NavaidsModel : public QAbstractListModel 
{ 
    Q_OBJECT 
public: 

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

Also, ich verstehe setSourceModel eine QAbstractItemModel anfordern.

Für mich erbt NavaidsModel von QAbstractListModel, die von QAbstractItemModel erben.

Also sollte es in Ordnung sein, aber es ist nicht.

Können Sie mir erklären, was die Ursache des Problems ist?

Danke für Hilfe.

Antwort

2

setSourceModel möchte ein Zeiger zu einem Modell, kein Wert oder eine Referenz. Also alles, was Sie tun müssen, ist die

proxyModel->setSourceModel(model); 

zu

proxyModel->setSourceModel(&model); 

Alternativ Linie zu ändern, können Sie stattdessen auch Ihr Modell mit neuen schaffen könnte, das heißt

NavaidsModel *model = new NavaidsModel(); 

EDIT:

Wenn Sie mit Zeigern arbeiten, sollten Sie entweder einen intelligenten Zeiger bevorzugen oder die Qt-Eltern-Kind-Mechanismen verwenden um die Modelle automatisch mit ihrer Ansicht zu löschen. Sie sollten Ihre zwei Modelle Kinder der Ansicht machen:

int main(int c, char **v) 
{ 
    QApplication a(c, v); 

    // create the view first 
    QListView view; 

    //Model 
    NavaidsModel *model = new NavaidsModel(&view); 
    model->readFromCSV(QCoreApplication::applicationDirPath() + "/files/data.csv"); 

    //Proxy 
    QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(&view); 
    proxyModel->setSourceModel(model); 

    // ... 
+0

Es ist wirklich ein Schmerz für mich Verwendung zwischen Zeigern und Variablen. Grundsätzlich verstehe ich den Unterschied richtig, aber wenn ich an der Wand bin, kann ich meinen Verstand nicht richtig strukturieren. Gleiches gilt für die Verwendung von "neu". Vielen Dank für Ihre Hilfe und Empfehlungen. – kontiki

+0

Sie sollten wirklich versuchen, Ihren Kopf darum zu wickeln. Eine falsche Verwendung von Zeigern kann zu einigen sehr unangenehmen Fehlern führen. Sie sollten wahrscheinlich lesen: https://doc.qt.io/qt-5/objecttrees.html, https://doc.qt.io/qt-5/qsharedpointer.html und https://doc.qt.io /qt-5/qscopedpointer.html. Dies sind alle sicheren Möglichkeiten, Zeiger zu behandeln, die Sie versuchen sollten, zu folgen und zu verwenden. – Felix

Verwandte Themen