Saya menghadapi masalah kompilasi menggunakan QSortFilterProxyModel ketika mencoba setSourceModel.

Pesan kesalahannya adalah: tidak ada fungsi yang cocok untuk panggilan ke QSortFilterProxyModel::setSourceModel(NavaidsModel&)

Dan kandidatnya adalah: virtual void SortFilterProxyModel::setSourceModel(QAbstractItemModel*)

Ini kode saya:

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

Dan inilah konstruktor untuk navaidsmodel :

class NavaidsModel : public QAbstractListModel
{
    Q_OBJECT
public:

    NavaidsModel(QObject *parent = Q_NULLPTR):QAbstractListModel(parent){
    }
    enum NavaidsRoles {
        PositionRole = Qt::UserRole + 1, 
        OACICodeRole,
        CountryCodeRole
    };

Jadi, saya mengerti setSourceModel meminta QAbstractItemModel.

Bagi saya, NavaidsModel mewarisi dari QAbstractListModel yang mewarisi dari QAbstractItemModel.

Jadi, itu seharusnya baik-baik saja, tetapi tidak.

Bisakah Anda menjelaskan kepada saya apa akar penyebab masalahnya?

Terimakasih atas bantuannya.

0
kontiki 23 Desember 2017, 13:18

1 menjawab

Jawaban Terbaik

setSourceModel menginginkan penunjuk ke model, bukan nilai atau referensi. Jadi yang harus Anda lakukan adalah mengubah garis

proxyModel->setSourceModel(model);

Untuk

proxyModel->setSourceModel(&model);

Atau, Anda juga dapat membuat model Anda dengan yang baru, mis.

NavaidsModel *model = new NavaidsModel();

EDIT:

Saat bekerja dengan pointer, Anda harus selalu memilih smart pointer atau menggunakan mekanisme parent-child Qt untuk menghapus model secara otomatis dengan tampilannya. Anda harus menjadikan dua model Anda sebagai anak-anak dari tampilan:

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

    // ...
2
Felix 23 Desember 2017, 10:28