【问题标题】:qt QStandardItemModel data() not being calledqt QStandardItemModel data() 没有被调用
【发布时间】:2013-09-17 16:08:39
【问题描述】:

我有一个从QStandardItemModel 派生的非常简单的自定义模型。函数rowCountcolumnCount 被多次调用,而其余函数,特别是data() 从未被调用。我找不到原因。

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

【问题讨论】:

  • rowCount()columnCount() 函数是否返回非零值?
  • 是的,它们确实分别返回 2 和 3
  • 好吧,还有一点:您使用 QStandardItemModel,但是我没有看到您明确地将 QStandardItems 添加到其中。文档说:“QStandardItemModel 提供了一种经典的基于项目的方法来处理模型。QStandardItemModel 中的项目由 QStandardItem 提供。”。也许值得尝试相同的方法,但使用更适合您的工作的 QAbstractTableModel,IMO?
  • 是的,看来你不能使用 QStandardItemModel 中的 data() 来绘制它

标签: c++ qt qlistview qstandarditemmodel


【解决方案1】:

我认为不可能对 QStandardItemModel 中的数据进行子类化。

我只是尝试将自己的 QAbstractItemModel 更改为 QStandardItemModel 并且数据也没有被调用。

尝试使用 QAbstractItemModel。 我认为您已经实现了使用 QAbstractItemModel 所需的几乎所有内容

你需要实现 index 和 parent。由于您没有分层模型,因此父级应始终返回无效索引。

可以这样实现:

    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
    }

【讨论】:

  • 我认为这是原因,您必须使用 QStandardItem 和 appendRow() 添加项目或更改模型以从抽象派生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多