我在尝试设置 SourceModel 时遇到使用 QSortFilterProxyModel 的编译问题。
错误信息是:没有匹配函数调用 QSortFilterProxyModel::setSourceModel(NavaidsModel&)
候选人是:virtual void SortFilterProxyModel::setSourceModel(QAbstractItemModel*)
Đây là mã của tôi:
主要.cpp
#include "navaidsmodel.h"
#include
#include
#include
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_ĐỐI TƯỢNG
công cộng:
NavaidsModel(QObject *parent = Q_NULLPTR):QAbstractListModel(parent){
}
enum NavaidsRoles {
PositionRole = Qt::UserRole + 1,
OACICodeRole,
CountryCodeRole
};
所以,我理解 setSourceModel 请求 QAbstractItemModel。
对我来说,NavaidsModel 继承自 QAbstractListModel,而 QAbstractListModel 继承自 QAbstractItemModel。
所以,它应该没问题,但事实并非如此。
你能解释一下问题的根本原因是什么吗?
Cảm ơn sự giúp đỡ của bạn.
setSourceModel
需要一个指向模型的指针,而不是值或引用。所以你所要做的就是改变线路
proxyModel->setSourceModel(model);
đến
proxyModel->setSourceModel(&model);
或者,您也可以使用 new 创建模型,即
NavaidsModel *model = new NavaidsModel();
biên tập:
在使用指针时,您应该始终选择智能指针或使用 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);
// ...
Tôi là một lập trình viên xuất sắc, rất giỏi!