c++ - 使用代理模型

标签 c++ qt

我通过子类化 QAbstractProxyModel 创建了 Proxy 模型,并将其作为模型连接到我的 View 。我还为此代理模型设置了源模型。不幸的是,出了点问题,因为我没有在我的 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_);
}

最佳答案

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

关于c++ - 使用代理模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8280302/

相关文章:

c++ - 初始化一个类成员引用变量,就像它是一个常规变量一样

c++ - 如何在 Qt 中调整像素图的大小?

c++ - 在 Qt 项目中禁用 -Wall 编译器警告?

macos - 在 macbook pro 上安装 PYQT5 后如何打开 QT Designer?

c++ - float转QString的格式

c++ - 双击QWidget

c++ - 如何动态地用虚方法实现类

c++ - 为什么泛型编程设计更喜欢自由函数而不是成员函数?

c++ - 考虑 C++ 引用的好方法是什么?

C++使用类从多维 vector 输出一个char数组