私は、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();
}