smallB
smallB

Reputation: 17138

Same Model Proxy View connection but doesn't work in second project

this works:

/*Just copy and paste*/  
#include <QApplication>
#include <QtGui>
#include <QDebug>
#include <QAbstractProxyModel>

class File_List_Proxy : public QAbstractProxyModel
{
public:
    virtual QModelIndex     mapFromSource ( const QModelIndex & sourceIndex ) const
    {
        return sourceModel()->index(sourceIndex.row(),sourceIndex.column());
    }
    virtual QModelIndex     mapToSource ( const QModelIndex & proxyIndex ) const
    {
        return sourceModel()->index(proxyIndex.row(),proxyIndex.column());
    }
    virtual QModelIndex index(int row, int column, const QModelIndex&) const

    {
        return createIndex(row,column);
    }
    virtual QModelIndex parent(const QModelIndex&) const
    {
        return QModelIndex();
    }
    virtual int rowCount(const QModelIndex&) const
    {
        return sourceModel()->rowCount();
    }
    virtual int columnCount(const QModelIndex&) const
    {
        return sourceModel()->columnCount();
    }
};

class File_List_Model : public QAbstractItemModel
{
private:
    QStringList data_;
public:

    File_List_Model(/*const QStringList& value*/)//:QStringListModel(value)
    {
    }
    QVariant data(const QModelIndex &index, int role) const
    {
        if (role == Qt::DisplayRole){
        /*QVariant t = data_.at(index.row());
        qDebug() << "index.row(): " << index.row();
        qDebug() << "data_.at(index.row()): " << data_.at(index.row());*/
        return data_.at(index.row());
        }
        else
        {
            return QVariant();
        }
    }

    bool set_entries(const QStringList& entries)
    {
        beginInsertRows(createIndex(0,0),0,entries.count());
        data_ = entries;
        endInsertRows();
        emit dataChanged(createIndex(0,0),createIndex(0,entries.count()));
        return true;
    }

    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole)
    {
        switch(role)
        {
        case Qt::DisplayRole:
        data_ =  value.toStringList();
        emit dataChanged(index,index);
        return true;
        }
        return false;
    }

    virtual QModelIndex index(int row, int column, const QModelIndex&) const
    {
        return createIndex(row,column);
    }
    virtual QModelIndex parent(const QModelIndex&) const
    {
        return QModelIndex();
    }
    virtual int rowCount(const QModelIndex&) const
    {
        return data_.size();
    }
    virtual int columnCount(const QModelIndex&) const
    {
        return 1;
    }
};


int main(int argc,char** argv)
{
    QApplication app(argc,argv);
    QDir dir(QDesktopServices::storageLocation(QDesktopServices::HomeLocation));
    File_List_Model* model = new File_List_Model;//(dir.entryList());
   bool t =  model->set_entries(dir.entryList());
   File_List_Proxy* proxy = new File_List_Proxy;
   proxy->setSourceModel(model);
    QListView* view = new QListView;
    view->setModel(proxy);
    //new ModelTest(model);
    view->show();

    return app.exec();
}
/*End of copy*/

This on the contrary from a different project where File_List_Model and File_List_Proxy ARE COPIED AND NOT CHANGED from the code above doesn't work:

Line_Counter::Line_Counter(QWidget *parent) :
    QDialog(parent), model_(new File_List_Model),
    proxy_model_(new File_List_Proxy)
{
    setupUi(this);

    setup_mvc_();

    QDir dir(QDesktopServices::storageLocation(QDesktopServices::HomeLocation));
    File_List_Model* model = new File_List_Model;//(dir.entryList());
   bool t =  model->set_entries(dir.entryList());

}

void Line_Counter::setup_mvc_()
{
    proxy_model_->setSourceModel(model_);


    listView->setModel(proxy_model_);

}

//Line counter  
class Line_Counter : public QDialog, private Ui::Line_Counter
{
    Q_OBJECT
private:
    File_List_Model* model_;
    //QStringListModel* model_;
    File_List_Proxy* proxy_model_;
};

What's going on here?!

Upvotes: 0

Views: 111

Answers (1)

pnezis
pnezis

Reputation: 12331

You call the setup_mvc_ before the model creation. The model_ in this case it a default constructed model where the set_entries has not been called. On the other hand you call the set_entries on the model which you do not set to a view.

This will work:

Line_Counter::Line_Counter(QWidget *parent) :
    QDialog(parent), model_(new File_List_Model),
    proxy_model_(new File_List_Proxy)
{
    setupUi(this);

    QDir dir(QDesktopServices::storageLocation(QDesktopServices::HomeLocation));
    bool t =  model_->set_entries(dir.entryList());

    setup_mvc_();
}

Upvotes: 1

Related Questions