polluxus
14th October 2015, 15:02
I am using QTableview + QAbastractTableModel subclass to display order trading data. It works great. But when I use QSortFilterProxyModel for table sorting/filtering, the application crashes if I sort the rows and then add new data row. Sometimes, even a click in the table would result in a crash. I have not changed any codes in the Model . The following are the codes related. Please kindly help.
VIEW:
pTableView = new QTableView();
pModel = new TradeManagerModel(0);
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(pModel);
proxyModel->setDynamicSortFilter(true);
pTableView->setModel(proxyModel);
pTableView->setSortingEnabled(true);
MODEL: The data is stored in QMap<QString, QStringList> mGridData.
int TradeManagerModel::rowCount(const QModelIndex & /*parent*/) const
{
return mGridData.size();
}
int TradeManagerModel::columnCount(const QModelIndex & /*parent*/) const
{
return 10;
}
QVariant TradeManagerModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole)
{
return mGridData[mGridData.keys().at(index.row())].at(index.column());
}
return QVariant();
}
QVariant TradeManagerModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole)
{
if (orientation == Qt::Horizontal) {
switch (section)
{
case 0:
return QString("TIME");
case 1:
return QString("SYMBOL");
case 2:
return QString("B/S");
case 3:
return QString("QTY");
case 4:
return QString("PRICE");
case 5:
return QString("COMM");
case 6:
return QString("STRATEGYID");
case 7:
return QString("EXECID");
case 8:
return QString("ORDERID");
case 9:
return QString("");
}
}
}
return QVariant();
}
void TradeManagerModel::onTradeItemUpdated(const TradeItem &tradeItem)
{
QString execId = tradeItem.execId;
QStringList tmpStrList;
tmpStrList << tradeItem.tradeTimeStamp
<< tradeItem.symbol
<< tradeItem.action
<< QString::number(tradeItem.fillQty)
<< QString::number(tradeItem.fillPrice)
<< QString::number(tradeItem.commission)
<< tradeItem.orderRef
<< execId
<< tradeItem.orderId
<<"";
if(!mGridData.contains(execId))
{
mGridData[execId] = tmpStrList;
emit layoutChanged();
}
}
VIEW:
pTableView = new QTableView();
pModel = new TradeManagerModel(0);
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(pModel);
proxyModel->setDynamicSortFilter(true);
pTableView->setModel(proxyModel);
pTableView->setSortingEnabled(true);
MODEL: The data is stored in QMap<QString, QStringList> mGridData.
int TradeManagerModel::rowCount(const QModelIndex & /*parent*/) const
{
return mGridData.size();
}
int TradeManagerModel::columnCount(const QModelIndex & /*parent*/) const
{
return 10;
}
QVariant TradeManagerModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole)
{
return mGridData[mGridData.keys().at(index.row())].at(index.column());
}
return QVariant();
}
QVariant TradeManagerModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole)
{
if (orientation == Qt::Horizontal) {
switch (section)
{
case 0:
return QString("TIME");
case 1:
return QString("SYMBOL");
case 2:
return QString("B/S");
case 3:
return QString("QTY");
case 4:
return QString("PRICE");
case 5:
return QString("COMM");
case 6:
return QString("STRATEGYID");
case 7:
return QString("EXECID");
case 8:
return QString("ORDERID");
case 9:
return QString("");
}
}
}
return QVariant();
}
void TradeManagerModel::onTradeItemUpdated(const TradeItem &tradeItem)
{
QString execId = tradeItem.execId;
QStringList tmpStrList;
tmpStrList << tradeItem.tradeTimeStamp
<< tradeItem.symbol
<< tradeItem.action
<< QString::number(tradeItem.fillQty)
<< QString::number(tradeItem.fillPrice)
<< QString::number(tradeItem.commission)
<< tradeItem.orderRef
<< execId
<< tradeItem.orderId
<<"";
if(!mGridData.contains(execId))
{
mGridData[execId] = tmpStrList;
emit layoutChanged();
}
}