我对自定义qabstracttablemodel的更新有很大的麻烦。 我想要一个表格显示几个股票的价格。我从我控制的本地服务器获取价格。此设置仅用于测试目的。定价信息在工作者线程中接收。C++ qt qabstracttablemodel子类在更新底层qmap时崩溃
PriceModel.h:
class PriceModel : public QAbstractTableModel {
Q_OBJECT
public:
PriceModel(QObject* parent = 0);
void setPriceMap(const QMap<QString, ITick*> &curTickMap);
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
private:
QMap<QString, ITick*> currentTicks;
QString stockAt(int offset) const;
};
PriceModel.cpp
#include "PriceModel.h"
PriceModel::PriceModel(QObject* parent) : QAbstractTableModel(parent) {
}
int PriceModel::rowCount(const QModelIndex& parent) const {
return this->currentTicks.count();
}
int PriceModel::columnCount(const QModelIndex& parent) const {
return 4;
}
QString PriceModel::stockAt(int offset) const {
return (currentTicks.begin() + offset).key();
}
QVariant PriceModel::data(const QModelIndex& index, int role) const {
if (!index.isValid()) {
return QVariant();
}
if (role == Qt::TextAlignmentRole) {
return int(Qt::AlignRight | Qt::AlignVCenter);
} else if (role == Qt::DisplayRole) {
QString stock = stockAt(index.row());
int i = index.column();
switch (i) {
case 0 : return currentTicks.value(instrument)->getTime().toString("hh:mm:ss:zzz");
case 1 : return currentTicks.value(instrument)->getBid();
case 2 : return currentTicks.value(instrument)->getAsk();
case 3 : return currentTicks.value(instrument)->getBidVolume();
case 4 : return currentTicks.value(instrument)->getAskVolume();
}
}
return QVariant();
}
QVariant PriceModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role != Qt::DisplayRole) {
return QVariant();
}
if (orientation == Qt::Horizontal) {
switch (section) {
case 0 : return QString("Time");
case 1 : return QString("Bid");
case 2 : return QString("Ask");
case 3 : return QString("Bid Volume");
case 4 : return QString("Ask Volume");
}
} else {
return instrumentAt(section)->getCurrencyPairWithDelimiter();
}
return QVariant();
}
void PriceModel::setTickMap(const QMap<QString,ITick*>& curTickMap) {
beginResetModel();
this->currentTicks = curTickMap;
endResetModel();
}
模型填充的tableview当我打电话setTickMap(
我已经通过以下方式子类的qabstracttablemodel qmap < ...>)方法,并显示所有不同的股票,正如预期。 (初始化我的模型中的数据工作正常)
问题出现时,我想再次调用setTickMap(qmap < ...>)方法。应用程序崩溃,我不明白为什么我也没有得到一个重要的错误消息 - 即一个segvault。
在调试配置的NetBeans崩溃打开一个名为“Disassemlby”具有以下内容标签:
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+50: add %ebx,%r15d
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+85: testb $0x4,0x20(%rax)
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+89: jne 0x7ffff63f4df8 <QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+536>
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+102: add 0x6c(%rsp),%ebx
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+118: mov %ebx,0x2c(%rsp)
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+106: movq $0x0,0x40(%rsp)
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+95: mov 0x31c19a(%rip),%rdx # 0x7ffff6710de0
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+115: mov (%rdx),%rax
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+122: test %rax,%rax
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+125: je 0x7ffff63f4c72 <QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+146>
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+127: lea 0x40(%rsp),%rdx
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+132: test %r13,%r13
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+135: mov %ebx,%esi
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+137: mov %r12,%rdi
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+140: cmovne %r13,%rdx
QMetaObject::activate(QObject*, QMetaObject const*, int, void**)+144: callq *%rax
我夹在beginResetModel的映射分配()方法,但似乎并没有因为我刚参加工作得到一个崩溃的应用程序。足够奇怪的是,这在setter方法的第一次调用中起作用。这让我认为这是一个相当愚蠢的错误。我认为,由于第一次调用工作正常,我们可以排除它与线程间通信问题有关。
这个模型不应该由用户通过GUI编辑,我知道我可以使用tablewidget来显示数据,但我不确定是否会有另一个视图将共享这个模型信息。与目前的价格地图不会非常大(25项TOPS),所以我不舒服模型重置每个新的价格在未来。提前
感谢,我希望有人能帮助我这个 micropor
你确定这编译? 'currentTicks'是一个'QMap',而你的'setTickMap'作为'QMap '的参数。 –
pnezis
2012-01-15 23:28:14
我很抱歉,但为了让问题更容易,我将自定义接口IInstrument更改为像qstring这样已知的东西... – MicroPor 2012-01-16 07:12:39