2013-09-16 4 views
0

У меня очень простая пользовательская модель, полученная от QStandardItemModel. Функции rowCount и columnCount вызываются несколько раз, тогда как ни одна из оставшихся функций, в частности data(), никогда не вызывается. Я не могу найти причину.qt QStandardItemМодель данных() не называется

#include <IBAdditions/IB_events.h> 

#include <QtGui/QStandardItemModel> 
#include <QtGui/QStandardItem> 
#include <QtCore/QtCore> 

#include <vector> 

/** 
* model which allows for display 
* of available data streams as tickers 
*/ 
class TickerDisplayModel : public QStandardItemModel { 

Q_OBJECT 
public: 
    TickerDisplayModel(std::vector<IBAdditions::ContractEvent> availableTickers, QObject *parent = 0); 
    int rowCount(const QModelIndex &parent = QModelIndex()) const ; 
    int columnCount(const QModelIndex &parent = QModelIndex()) const; 
    QVariant headerData(int section, Qt::Orientation orientation, int role) const; 
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; 
    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); 
    Qt::ItemFlags flags(const QModelIndex & index) const; 
private: 
    int m_; 
    int n_; 
    std::vector<IBAdditions::ContractEvent>& availableTickers_; 
signals: 
    void editCompleted(const QString &); 
}; 

, как это называется:

SubscribeToDataGUI::SubscribeToDataGUI(QWidget* parent) : QDialog(parent) { 
    widget_.setupUi(this); 
    IBAdditions::ContractEvent c; 
    c.symbol = "EUR"; c.currency = "USD"; c.event_ = IBAdditions::TickPrice; 
    availableTickers_.push_back(c); 
    model_.reset(new TickerDisplayModel(availableTickers_)); 
    widget_.listView->setModel(model_.get()); 
    widget_.listView->show(); 
} 
+1

Do ROWCOUNT) 'и' ColumnCount) функции возвращают ненулевое значение '(' (? – vahancho

+0

да, они возвращают 2 и 3 соответственно – 4pie0

+0

Ну, еще один момент: вы используете QStandardItemModel, однако я не вижу, чтобы вы явно добавляли QStandardItems к нему. Документы говорят, что: «QStandardItemModel обеспечивает классический подход к работе с моделью на основе элементов. ** Элементы в QStandardItemModel предоставляются QStandardItem **.". Возможно, стоит попробовать то же самое, но используя QAbstractTableModel, который лучше подходит для того, что вы делаете, ИМО? – vahancho

ответ

1

Я думаю, что это не представляется возможным подклассы данных в QStandardItemModel.

Я просто попробую изменить свой собственный QAbstractItemModel на QStandardItemModel, и данные также не вызываются.

Попробуйте использовать QAbstractItemModel. Я думаю, что вы внедрили почти все, что вам нужно для использования QAbstractItemModel

Вам необходимо реализовать индекс и родительский элемент. Поскольку у вас нет иерархической модели, родитель должен всегда возвращать недействительный индекс.

Он может быть реализован следующим образом:

QModelIndex TickerDisplayModel::index(int row, int column, const QModelIndex &parent) const 
    { 
     return hasIndex(row, column, parent) ? createIndex(row, column, 0) : QModelIndex(); 
    } 

    QModelIndex TickerDisplayModel::parent(const QModelIndex &child) const 
    { 
     return QModelIndex(); // since no hiearchy model, this should always return invalid index 
    } 
+1

Я думаю, что это причина, вам нужно добавлять элементы, используя QStandardItem и appendRow() или изменять модель, чтобы получить абстрактную – 4pie0