1

私は、QTableViewのデータをApacheサーバーから1秒に1回更新するアプリケーションを開発しています。サーバーはデータをXMLテーブルとして送信します。列数は一定ですが、行数は毎回変化します。行のデータも異なる場合があります。

XMLをデータに変換するために、TxTableModel(QAbstractTableModelの子)で使用されるクラスTxTableDataを作成しました。また、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();
}
4

1 に答える 1

2

rowCount、columnCount、data、setDataなどのメソッドの実装が欠落しているため、TxTableModelモデルの完全なソースを提供していないようです。

問題に関しては、私の推測は次のようになります。

  1. すでに提案されているように、モデルをリロードする前に、removeRows(0, rowCount());

  2. removeRows実装では、行コレクションを更新する前にbeginRemoveRowsを呼び出し、完了後にendRemoveRows呼び出す必要があります。これにより、モデルコンテンツの変更についてビューに通知されます。

QAbstractTableModelを実装する方法の例がここにあります:アドレスブックの例

これがお役に立てば幸いです

于 2011-03-12T04:11:04.153 に答える