Создаю приложение где необходимо с сервера Apache грузить XML, парсить и показывать в табличном виде данные. Так как в системе могут работать несколько клиентов то изменение данных будет происходить и извне.
Гружу данные с помощью QHttp, потом используя SAX парсю в свой класс для данных. Этот класс используется в моем потомке QAbstractTableModel, который в свою очередь показывает данные в QTableView. Для обновления данных использую QTimer в QAbstractTableModel, который срабатывает раз в секунду. Количество строк в загружаемых данных может изменяться как в большую сторону так и в меньшую, строки могут меняться местами. Количество столбцов неизменно.
Проблема заключается в следующем. Я получаю новую XML, парсю ее и заменяю старые данные новыми. После этого вызываю reset(). Таким образом если строки прибавляются - то все отображается очень хорошо. Но стоит какимто строкам удалится - они не удаляются в QTableView. Подскажите куда мне смотреть чтобы исправить это?
На всякий случай прилагаю код QAbstractTableModel в котором и происходит все колдовство:
C++ (Qt)
TxTableModel::TxTableModel(QObject *parent) :
QAbstractTableModel(parent)
{
timer = new QTimer(this);
connect(&http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
connect(timer, SIGNAL(timeout()), this, SLOT(timerDone()));
timer->start(1000);
}
int TxTableModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_Data.getRowCount();
}
int TxTableModel::columnCount(const QModelIndex & parent) const
{
Q_UNUSED(parent);
return m_Data.getColumnCount();
}
QVariant TxTableModel::data(const QModelIndex & index, int role) const
{
if (role == Qt::DisplayRole) {
return m_Data.getCell(index.row(), index.column());
}
if (role == Qt::SizeHintRole) {
return QSize(400, 50);
}
return QVariant();
}
QVariant TxTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation == Qt::Horizontal) {
if (role == Qt::DisplayRole) {
return m_Data.getColumnCaption(section);
}
if (role == Qt::SizeHintRole) {
return QSize(450, 30);
}
}
return QAbstractTableModel::headerData(section, orientation, role);
}
void TxTableModel::refreshData()
{
TxRequest request;
request.setObject("order");
request.setMethod("getlist");
request.addParam("begin_time", 60*60*4);
request.addParam("end_time", 60*4);
http.queryAsync(request);
}
void TxTableModel::parseXml(const QByteArray &xml)
{
//qDebug() << xml;
// обновляем данные из полученной XML
int count = m_Data.getRowCount();
QXmlInputSource inputSource;
QXmlSimpleReader reader;
TxSaxTableHandler handler(&m_Data, false);
inputSource.setData(xml);
reader.setContentHandler(&handler);
reader.setErrorHandler(&handler);
reader.parse(inputSource);
emit reset();
}
void TxTableModel::httpDone(bool error)
{
if (error) {
qDebug() << http.errorString();
} else {
parseXml(http.readAll());
}
}
void TxTableModel::timerDone()
{
refreshData();
}