代理的模式功能不叫

问题描述:

我连源模型到我的代理模式和我的代理模型为模型,视图:代理的模式功能不叫

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent),model_(new Model(this)),proxy_(new Proxy(this)) 
{ 
    setupUi(this); 
    proxy_->setSourceModel(model_); 

    listView->setModel(proxy_); 

} 

在Proxy类我有一个FNC:

int Proxy::rowCount(const QModelIndex&) const 
{ 
    static int a = 0; 
    qDebug() << "Proxy::rowCount sourceModel()->rowCount() " << a++ << ": "<< sourceModel()->rowCount(); 
    return sourceModel()->rowCount(); 
} 

但是当我补充一点通过模型的FNC观看这不叫:

bool Model::set_data(int data) 
{ 
    beginInsertRows(QModelIndex(),0,data_.size()); 
    data_.append(data); 
    static int a = 0; 
    qDebug() << "Model::set_data data_ " << a++ << ":" << data_; 
    endInsertRows(); 
    emit dataChanged(createIndex(0,0),createIndex(data_.size(),0)); 
    return true; 
} 

以上函数是通过信号时隙CONNEC连接一个对话框上的按钮:
QObject :: connect(pushButton,SIGNAL(clicked()),Dialog,SLOT(insert()));并从对话框中插入如下所示:

bool Dialog::insert() 
{ 
    static int a = 0; 
    return model_->set_data(a++); 

} 

但尽管所有此视图不显示任何内容。另一方面,如果我作为模型连接到一个视图,我的模型类obj而不是代理一切正常。
任何人有任何想法这里有什么问题?
编辑:: 测试模型后:

D:\...\tst_mpv.exe exited with code -1073741819 

我主要FNC外观:

ASSERT failure in QList<T>::at: "index out of range", file c:\QtSDK\Desktop\Qt\4.7.4\mingw\include/QtCore/qlist.h, line 456 

测试只是代理后

#include <QApplication> 
#include "Dialog.h" 
#include "Model.h" 
#include "Proxy.h" 
#include "modeltest.h" 
int main(int c,char**v) 
{ 
    QApplication app(c,v); 
    /*Model* m = new Model; 
    new ModelTest(m);*/ 
    Proxy* p = new Proxy; 
    new ModelTest(p); 
    /*Dialog d; 
    d.show();*/ 
    return app.exec(); 
} 

这里是我的模型和代理类:http://pastebin.com/DiAAkiNY

+0

什么代理您使用的模型,是吧'QSortFilterProxyModel'衍生或你自己的'QAbstractProxyModel'派生代理?您是否使用过[模型测试](http://developer.qt.nokia.com/wiki/Model_Test)来检查错误? –

+0

@skyhisi它是我自己的代理模型。 – user336359

+0

你用过模型测试吗? –

这里是代理模型的完整示例,使用(如文档中推荐的)QSortFilterProxyModel

建立从QSortFilterProxyModel是最简单的方法,因为所有的棘手的位完成。

TEST.CPP

#include <QtGui> 

#include "proxy.h" 

int main(int argc, char** argv) 
{ 
     QApplication app(argc, argv); 

     QStringList list; 
     list << "ant" << "bear" << "cat" << "dog"; 

     QStringListModel mdl(list); 

     QListView viewRaw; 
     viewRaw.setModel(&mdl); 
     viewRaw.show(); 

     Proxy proxy; 
     proxy.setSourceModel(&mdl); 

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

     return app.exec(); 
} 

proxy.h

#ifndef _PROXY_H_ 
#define _PROXY_H_ 

#include <QtGui> 

class Proxy : public QSortFilterProxyModel 
{ 
     public: 
       virtual QVariant data(const QModelIndex& proxyIndex, int role = Qt::DisplayRole) const; 
}; 

#endif 

proxy.cpp

#include "proxy.h" 

QVariant Proxy::data(const QModelIndex& proxyIndex, int role) const 
{ 
     QVariant d = QSortFilterProxyModel::data(proxyIndex, role); 
     if (proxyIndex.isValid() && role == Qt::DisplayRole) 
       return QVariant(QString("[[%1]]").arg(d.toString())); 
     return d; 
} 

test.pro

QT += core gui 
SOURCES=test.cpp proxy.cpp 
HEADERS=proxy.h 
+0

但我需要继承QAbstractProxyModel。你介意告诉我如何正确使用QAbstractProxyModel做到这一点? – user336359