2011-11-30 36 views
1

我連源模型到我的代理模式和我的代理模型爲模型,視圖:代理的模式功能不叫

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

你用過模型測試嗎? –

回答

1

這裏是代理模型的完整示例,使用(如文檔中推薦的)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