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

问题描述 投票:0回答:1

在尝试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。

所以,它应该没问题,但事实并非如此。

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

感谢帮助。

c++ qt
1个回答
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);

    // ...
© www.soinside.com 2019 - 2024. All rights reserved.