错误:没有用于调用QSortFilterProxyModel :: setSourceModel的匹配函数(NavaidsModel&

时间:2017-12-23 10:18:48

标签: c++ qt

我在尝试使用setSourceModel时遇到使用QSortFilterProxyModel的编译问题。

错误信息是:没有匹配函数来调用QSortFilterProxyModel :: setSourceModel(NavaidsModel&)

,候选人是:virtual void SortFilterProxyModel :: setSourceModel(QAbstractItemModel *)

这是我的代码:

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

这里是navaidsmodel的构造函数:

class NavaidsModel : public QAbstractListModel
{
    Q_OBJECT
public:

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

所以,我理解setSourceModel请求一个QAbstractItemModel。

对我来说,NavaidsModel继承自QAbstractListModel,后者继承自QAbstractItemModel。

所以,它应该没问题,但它不是。

你能解释一下这个问题的根本原因吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

setSourceModel想要指针到模型,而不是值或引用。所以你要做的就是改变行

proxyModel->setSourceModel(model);

proxyModel->setSourceModel(&model);

或者,您也可以使用new来创建模型,即

NavaidsModel *model = new NavaidsModel();

编辑:

使用指针时,您应始终选择智能指针或使用Qt父子机制自动删除模型及其视图。你应该让你的两个模特成为观点的孩子:

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

    // ...