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

Posted

技术标签:

【中文标题】如何使用不同的行数更新 QAbstractTableModel 中的数据【英文标题】:How to update data in QAbstractTableModel with different row count 【发布时间】:2011-03-08 20:40:08 【问题描述】:

我正在开发一个应用程序,每秒一次从 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】:

您似乎没有提供 TxTableModel 模型的完整源代码,因为它缺少 rowCount、columnCount、data、setData 等方法的实现。

至于问题,我的猜测是:

    正如已经建议的那样,您可以在重新加载模型之前尝试清理模型,方法是调用 removeRows(0, rowCount());

    在您的removeRows 实现中,您应该在更新行集合之前调用beginRemoveRows,并在完成之后调用endRemoveRows。这应该通知视图模型内容的变化。

这里有一个关于如何实现 QAbstractTableModel 的示例:Address Book Example

希望这会有所帮助,问候

【讨论】:

以上是关于如何使用不同的行数更新 QAbstractTableModel 中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“批量更新从更新返回意外的行数;实际行数:0;预期:1”问题?

获取使用 PreparedStatement 更新的行数

Kotlin Exposed 获取更新的行数

如何获取受 SQL Alchemy 影响的行数?

在 SQLite-WinRT 包装器中使用“更新”或“删除”查询获取受影响的行数

postgresql函数-获取受更新查询影响的行数[重复]