Функция модели прокси не вызывается - PullRequest
1 голос
/ 30 ноября 2011

Я подключил исходную модель к своей прокси-модели и мою прокси-модель как модель к представлению:

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

Вышеуказанная функция подключается через соединение SIGNAL SLOT кнопкой в ​​диалоговом окне:
QObject :: connect (pushButton, SIGNAL(нажал ()), диалоговое окно, слот (вставить ()));и вставка из диалога выглядит следующим образом:

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

 }

Но, несмотря на все это, ничего не показывает.С другой стороны, если я подключаю в качестве модели к представлению мой класс Model obj вместо Proxy, то все работает.
Кто-нибудь знает, что здесь не так?
EDIT :: После тестирования модели:

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

После тестирования только прокси:

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

Мой основной fnc выглядит так:

#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();
}

вот мои классы Model и Proxy: http://pastebin.com/DiAAkiNY

1 Ответ

1 голос
/ 30 ноября 2011

Вот полный пример модели прокси, использующей (как рекомендовано в документации) a 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...