如何使用不同的行计数更新QAbstractTableModel中的数据

时间:2011-03-08 20:40:09

标签: qt qt4 qtableview qabstracttablemodel

我正在开发一个应用程序,每秒从apache服务器更新一次QTableView中的数据。服务器将数据作为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 个答案:

答案 0 :(得分:2)

看起来你没有提供TxTableModel模型的完整源代码,因为它缺少rowCount,columnCount,data,setData等方法的实现。

至于问题,我的猜测是:

  1. 如前所述,您可以尝试清理模型,然后通过调用removeRows(0, rowCount());

  2. 重新加载模型
  3. removeRows实施中,您应该在更新行集合之前调用beginRemoveRows,并在完成后endRemoveRows调用Address Book Example。这应该通知有关模型内容更改的视图。

  4. 有一个关于如何在这里实现QAbstractTableModel的示例:{{3}}

    希望这有帮助,尊重