2011-03-08 4 views
1

QTableView의 데이터를 apache 서버에서 초당 한 번씩 업데이트하는 애플리케이션을 개발 중입니다. 서버는 데이터를 XML 테이블로 보냅니다. 열의 수는 일정하지만 행 수가 매번 변경됩니다. 행의 데이터도 다를 수 있습니다.다른 행 수를 사용하여 QAbstractTableModel에서 데이터를 업데이트하는 방법

XML을 데이터로 변환하려면 TxTableModel (QAbstractTableModel의 하위)에서 사용되는 TxTableData 클래스를 만들었습니다. 또한 TxTableModel은 QTimer를 사용하여 서버의 데이터를 업데이트합니다.

줄 수가 줄면 QTableview가 반응하지 않는 것이 문제입니다. 행 수가 늘어 나면 괜찮습니다.

QTableView에서 모든 행을 제거하고 새 데이터로 채워야하지만 QTableView가이를 수행하지 않아야합니다. 할 수 있습니다

이를 rowCount, 열 개수, 데이터, 사항 setData 등 방법의 구현을 실종대로 TxTableModel 모델의 전체 소스를 제공하지 않는 것 같습니다
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

.

문제에 관해서는, 내 생각은 다음과 같습니다

  1. 이미 당신이 당신의 removeRows 구현에 removeRows(0, rowCount());

  2. 를 호출하여 다시로드하기 전에 모델을 청소 시도 할 수 있습니다 제안했다, 당신이해야 완료되면 행 컬렉션을 업데이트하기 전에 beginRemoveRows으로 전화하고 endRemoveRows을 호출하십시오. 그러면 모델 내용 변경에 대한보기가 표시됩니다. 여기 QAbstractTableModel 구현하는 방법에 대한 예제가

:이 도움이 Address Book Example

희망,