c++ - 错误:没有用于调用 QSortFilterProxyModel::setSourceModel(NavaidsModel&

标签 c++ qt

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

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

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

这是我的代码:

主要.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);

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

NavaidsModel *model = new NavaidsModel();

编辑:

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

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/

相关文章:

c++ - Ncurses:面板的 doupdate() 和 refresh() 之间的区别

qt - 如何在 qml 的 ListModel 中找到特定的 ListElement?

C++/阿杜伊诺 : dynamic int array

c++ - 带有自定义谓词的 unordered_set 使链接器错误(重复符号)

C++ 继承获取错误

c++ - 迭代 QML XYSeries 中的点

qt - 在 Qt 中创建旋转进度条

c++ - QPainter 构图在背景下无法按预期工作

c++ - 在 QFileDialog 中禁用文件名框

c++ - 在 C++ 中调用复制构造函数