我在尝试使用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。
所以,它应该没问题,但它不是。
你能解释一下这个问题的根本原因吗?
感谢您的帮助。
答案 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);
// ...