Как обновить данные в QAbstractTableModel с другим количеством строк - PullRequest
1 голос
/ 08 марта 2011

Я разрабатываю приложение, которое обновляет данные в 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();
}

1 Ответ

2 голосов
/ 12 марта 2011

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

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

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

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

Ниже приведен пример реализации QAbstractTableModel: Пример адресной книги

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

...