尝试设置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/