使用代理模型

时间:2011-11-26 17:39:54

标签: c++ qt

我通过继承QAbstractProxyModel创建了Proxy模型,并将其作为模型连接到我的视图。我还为这个代理模型设置了源模型。不幸的是有些错误,因为我没有在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 :(得分:0)

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