尝试设置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,而QAbstractListModel继承自QAbstractItemModel。

因此,应该没问题,但事实并非如此。

您能否解释一下问题的根本原因是什么?

感谢帮助。

最佳答案

setSourceModel想要一个指向模型的指针,而不是一个值或引用。所以你要做的就是换线

proxyModel->setSourceModel(model);




proxyModel->setSourceModel(&model);


另外,您也可以改用新的模型来创建模型,即

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

    // ...

关于c++ - 错误:没有用于调用QSortFilterProxyModel::setSourceModel(NavaidsModel&,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47951640/

10-13 08:23