Использование прокси-моделей - PullRequest
1 голос
/ 26 ноября 2011

Я создал модель Proxy, создав подкласс QAbstractProxyModel, и подключил ее как модель к моему представлению. Я также настроил исходную модель для этой модели прокси. К сожалению, что-то не так, потому что я ничего не отображаю в моем listView (это прекрасно работает, когда моя модель поставляется в качестве модели для просмотра, но когда я предоставляю эту прокси-модель, она просто не работает). Вот некоторые фрагменты из моего кода:

#ifndef FILES_PROXY_MODEL_H
#define FILES_PROXY_MODEL_H
#include <QAbstractProxyModel>
#include "File_List_Model.h"
class File_Proxy_Model: public QAbstractProxyModel
{
public:
    explicit File_Proxy_Model(File_List_Model* source_model)
{
    setSourceModel(source_model);
}

    virtual QModelIndex mapFromSource(const QModelIndex & sourceIndex) const
    {
        return index(sourceIndex.row(),sourceIndex.column());
    }

    virtual QModelIndex mapToSource(const QModelIndex & proxyIndex) const
    {

            return index(proxyIndex.row(),proxyIndex.column());

    }



    virtual int columnCount(const QModelIndex & parent = QModelIndex()) const
    {
        return sourceModel()->columnCount();
    }
    virtual int rowCount(const QModelIndex & parent = QModelIndex()) const
    {
        return sourceModel()->rowCount();
    }

    virtual QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const
    {
        return createIndex(row,column);
    }
    virtual QModelIndex parent(const QModelIndex & index) const
    {
        return QModelIndex();
    }

};

#endif // FILES_PROXY_MODEL_H

//and this is a dialog class:  
Line_Counter::Line_Counter(QWidget *parent) :
    QDialog(parent), model_(new File_List_Model(this)),
                     proxy_model_(new File_Proxy_Model(model_)),
                     sel_model_(new QItemSelectionModel(proxy_model_,this))
{
    setupUi(this);

    setup_mvc_();

}

void Line_Counter::setup_mvc_()
{
    listView->setModel(proxy_model_);
    listView->setSelectionModel(sel_model_);
}

1 Ответ

0 голосов
/ 27 ноября 2011

mapToSource должен возвращать индекс из исходной модели:

virtual QModelIndex mapToSource(const QModelIndex & proxyIndex) const
{
    return sourceModel()->index(proxyIndex.row(),proxyIndex.column());
}

Я тестировал с этим кодом:

#include <QtGui>
#include "file_proxy_model.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QDir dir(QDesktopServices::storageLocation(QDesktopServices::HomeLocation));
    File_List_Model model(dir.entryList());

    File_Proxy_Model proxy(&model);

    QListView listView;
    listView.setModel(&proxy);
    listView.show();

    return a.exec();
}

// In "File_List_Model.h"
class File_List_Model : public QStringListModel
{
public:
    explicit File_List_Model(const QStringList & list, QObject *parent = 0)
        : QStringListModel(list, parent)
    {
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...