Как обновить данные в QAbstractTableModel с другим количеством строк

Я разрабатываю приложение, которое обновляет данные в QTableView с сервера apache один раз в секунду. Сервер отправляет данные в виде XML-таблицы. Количество столбцов постоянно, но количество строк каждый раз меняется. Данные в строках также могут отличаться.

Чтобы преобразовать XML в данные, я создал класс TxTableData, который используется в TxTableModel (дочерний элемент QAbstractTableModel). Также TxTableModel использует QTimer для обновления данных с сервера.

Проблема в том, что если количество строк уменьшается - QTableview на это не реагирует. Когда количество рядов увеличивается - все в порядке.

Мне нужно удалить все строки из QTableView и заполнить их новыми данными, но QTableView этого не делает. Не могли бы вы

class TxTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    TxTableModel(QObject *parent = 0);

    void refreshData();
    void parseXml(const QByteArray &xml);

public slots:
    void httpDone(bool error);
    void timerDone();

protected:
    HttpConnect http;
    TxTableData m_Data;
    QTimer * timer;

};

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

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;

    int count = m_Data.getRowCount();

    QXmlInputSource inputSource;
    QXmlSimpleReader reader;
    TxSaxTableHandler handler(&m_Data, false);

    inputSource.setData(xml);
    reader.setContentHandler(&handler);
    reader.setErrorHandler(&handler);

    beginResetModel();
    reader.parse(inputSource);
    endResetModel();
}

void TxTableModel::httpDone(bool error)
{
    if (error) {
        qDebug() << http.errorString();
    } else {
        parseXml(http.readAll());
    }
}

void TxTableModel::timerDone()
{
    refreshData();
}

person Nikolay Kornushkov    schedule 08.03.2011    source источник


Ответы (1)


Похоже, вы не предоставляете полный источник модели TxTableModel, поскольку в нем отсутствует реализация методов rowCount, columnCount, data, setData и т. Д.

Что касается проблемы, я бы предположил:

  1. Как уже было предложено, вы можете попробовать очистить модель перед ее перезагрузкой, позвонив removeRows(0, rowCount());

  2. в вашей реализации removeRows следует вызвать beginRemoveRows перед обновлением коллекции строк и endRemoveRows после того, как вы закончите. Это должно уведомить представления об изменении содержимого модели.

Здесь есть пример реализации QAbstractTableModel: Пример адресной книги

надеюсь, что это поможет, с уважением

person serge_gubenko    schedule 12.03.2011