2011-11-26 89 views
1

我已经创建了代理模型,通过继承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_); 
} 

回答

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

好像这并未”不要做诡计。 – smallB

+0

@smallB:即使没有修复,listview似乎显示的项目(但他们都禁用/灰色)。所以这个问题可能与你的源模型有关。 – alexisdm

+0

您是否告诉您已将代理模型插入到该模型中,并让它们工作?如果是这样,你可以发布这个代码,这样我可以看看它?谢谢。 – smallB