2013-02-15 2 views
0

QABableView는 QABstractTableModel에서 파생 된 모델을 사용합니다.더 많은 행을 동적으로 QTableView 업데이트

모델은 여러 행으로 시작하여 데이터를 올바르게 표시합니다.

이 모델에는 만료시 행과 열의 수를 얻고 인덱스를 생성하고 dataChanged 신호를 방출하여 테이블의 동적 내용을 업데이트하는 타이머가 있습니다.

문제점은 표시 할 행 수가 변경 될 때 발생합니다.

이 경우, 변경된 번호로 새 색인을 얻더라도. 행을 갱신하고 테이블을 갱신하더라도 여전히 새로운 행을 표시하지 않습니다.

나는 아마도 그 이유를 발견했습니다. 시작 부분에 2 개의 행이 있고 그 다음에 5 개의 행이 표시되어야한다고 가정 해 보겠습니다. 타이머 만료 로직에서 새 행 수와 함께 새 인덱스를 작성하도록 요청했지만 dataChanged() 신호는 이미 첫 번째 행에 삽입 된 행의 데이터 만 변경합니다. 새 행은 표시되지 않습니다.

이것은 내 모델 코드입니다.

TableLayout::TableLayout() 
    : QAbstractTableModel() 
    { 
    rowCount(); 
    columnCount(); 
timer = new QTimer(this); 
    timer->setInterval(3000); 
timer->start(); 
    connect(timer, SIGNAL(timeout()) , this, SLOT(timerHit())); 


//ItemList[0].SetFields("Blah" ,"Blah" , "Blah" , "Blah" , "Blah", "Blah", true ); 
//ItemList[1].SetFields("Blah1" ,"Blah1" ,"Blah1" ,"Blah1" ,"Blah1", "Blah1", true); 
} 

void TableLayout::timerHit() 
{ 
    int row = this->rowCount(); 
    qDebug()<<"RowCOunt::"<<row; 
    qDebug()<<" Now IT IS : "<<row; 
    int col = this->columnCount(); 
    qDebug()<<"ColumnCOunt::"<<col; 
    QModelIndex Ind = createIndex(0 , 0); 
    QModelIndex Ind1 = createIndex(row, col); 
    data(Ind1); 
    emit dataChanged(Ind, Ind1); 
} 


int TableLayout::rowCount(const QModelIndex & /*parent*/) const 
{ 
    RtdbReader *rtdbReader = RtdbReader::instance(); 
    if (isConnected) 
    return rtdbReader->Get_Number_of_Items(); 
    else return 2; 
} 

int TableLayout::columnCount(const QModelIndex & /*parent*/) const 
{ 

    return 6; 
} 

QVariant TableLayout::data(const QModelIndex &index, int role) const 
{ 
    int row = index.row(); 
    int col = index.column(); 


    //return row; 
    int row_count , col_count = 0; 
    if (role == Qt::DisplayRole) { 

    if(col == 1) 
    return ItemList[row]->GetExplanation(); 
    if (col == 2) 
    {qDebug()<<" Now printing Sig name for row"<< index.row(); 
    return ItemList[row]->GetCond_Sig_Name(); 
    } 
    if (col == 3) 
    return ItemList[row]->GetDescription(); 
    if (col == 5) 
    return ItemList[row]->GetLogic(); 
    if (col == 4) 
    return ItemList[row]->Get_State_Text(); 
    } 
    else if (role == Qt::DecorationRole && col == 0) 
    { 
    bool col_to_display = ItemList[row]->GetValueColour(); 
    qDebug()<<"colour in view:"<<col_to_display; 
    if (col_to_display) 
    { 
    QString path = "Green.png"; 
    //QPixmap p(s_type1Icon); 
    // return s_type1Icon; 

    QIcon icon (path); 
    return icon; 
    } 
    else 
    { 
    QString path = "Yellow.png"; 
    //QPixmap p(s_type1Icon); 
    // return s_type1Icon; 

    QIcon icon (path); 
    return icon; 
    } 
    } 

    if (role == Qt::TextAlignmentRole) 
      return Qt::AlignCenter | Qt::AlignVCenter; 

/* else if (role == Qt::BackgroundRole) 
    { 
    QBrush yellowBackground(Qt::yellow); 
      return yellowBackground; 
    }*/ 

    return QVariant(); 
} 

새 행이 추가되도록보기를 어떻게 바꿀 수 있는지 제안하십시오.

감사합니다.

답변

-1

row, col에있는 요소에 QModelIndex을 작성했기 때문에 해당 요소에 대한 데이터를 작성한 것은 아닙니다 (현재 엔드와 요소 사이의 요소가 아님).

테이블에 새 데이터를 추가하려면 setData(...)을 사용한 다음이를 표시하려면보기에 dataChanged(...)을 내야합니다.

+0

이 경우 모든 행을 제거하고 새 행을 삽입하고 싶습니다. '재설정'과 같은 것입니다. 리셋이 완료되면 어디에서해야합니까? ItemList의'data()'함수에서 볼 수 있듯이 데이터는 항상 가져와야합니다. 따라서'timerHit()'슬롯에서 행의 수를 저장하고 새로운 행 'beginResetModel()'을 호출해야한다면 이전과 다른 수입니다.이게 맞습니까? 아니면 어디에서 가져야합니까? – user1173240

+1

당신이하려는 일을 완전히 이해하지 못합니다. 정말로 모든 것을 지우고 싶다면 모델에서, 당신은 모든 행을 별도로 제거해야한다고 생각합니다 .' beginRemoveRows (parent, 0, nrOfRows);로 시작한 다음'removeRows (0, nrOfRows);를 실행 한 다음'endRemoveRows (parent, 0 , nrOfRows)'. 그리고 그 후에 당신은 행을 삽입하는 것을 시작할 수있다. 모델의 데이터를 기반으로 전체 업데이트를 수행하기를 원한다면'QAbstractTableModel :: modelReset()'을 사용하면된다. – PrisonMonkeys

+0

나는 가지고있다. 일부 행을 가진 테이블. 번호는 고정되어 있지 않습니다. 처음에는 아무것도 될 수 없습니다. . 나중에 .. 행 수가 늘어납니다. 해당 행의 내용은 완전히 다릅니다. 각 행에는 변경해야 할 수도있는 2 개의 데이터가 있으므로'dataChanged() '를 사용하여 그렇게 할 수 있습니다. 그러나 일부 입력은 거기에 있으며, 그것은 자신의 다른 데이터와 함께 새로운 행을 포함합니다. 이 경우 리셋을 사용하는 것이 더 좋을까요? 그렇다면 리셋을 어디에 넣을 수 있습니까? 코드의'timerHit()'에? – user1173240