Russian Qt Forum
Ноябрь 23, 2024, 19:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAbstractTableModel + QTableView не удаляются строки при обновлении данных извне  (Прочитано 3830 раз)
nickla
Гость
« : Март 08, 2011, 23:17 »

Создаю приложение где необходимо с сервера 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();
}
 
Записан
Kolobok
Гость
« Ответ #1 : Март 09, 2011, 01:24 »

Так должно работать.

Код:
void TxTableModel::parseXml(const QByteArray &xml)
{
    beginResetModel();
 
    QXmlInputSource inputSource;
    QXmlSimpleReader reader;
    TxSaxTableHandler handler(&m_Data, false);
 
    inputSource.setData(xml);
    reader.setContentHandler(&handler);
    reader.setErrorHandler(&handler);
 
    reader.parse(inputSource);

    endResetModel();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.145 секунд. Запросов: 20.