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();
}
새 행이 추가되도록보기를 어떻게 바꿀 수 있는지 제안하십시오.
감사합니다.
이 경우 모든 행을 제거하고 새 행을 삽입하고 싶습니다. '재설정'과 같은 것입니다. 리셋이 완료되면 어디에서해야합니까? ItemList의'data()'함수에서 볼 수 있듯이 데이터는 항상 가져와야합니다. 따라서'timerHit()'슬롯에서 행의 수를 저장하고 새로운 행 'beginResetModel()'을 호출해야한다면 이전과 다른 수입니다.이게 맞습니까? 아니면 어디에서 가져야합니까? – user1173240
당신이하려는 일을 완전히 이해하지 못합니다. 정말로 모든 것을 지우고 싶다면 모델에서, 당신은 모든 행을 별도로 제거해야한다고 생각합니다 .' beginRemoveRows (parent, 0, nrOfRows);로 시작한 다음'removeRows (0, nrOfRows);를 실행 한 다음'endRemoveRows (parent, 0 , nrOfRows)'. 그리고 그 후에 당신은 행을 삽입하는 것을 시작할 수있다. 모델의 데이터를 기반으로 전체 업데이트를 수행하기를 원한다면'QAbstractTableModel :: modelReset()'을 사용하면된다. – PrisonMonkeys
나는 가지고있다. 일부 행을 가진 테이블. 번호는 고정되어 있지 않습니다. 처음에는 아무것도 될 수 없습니다. . 나중에 .. 행 수가 늘어납니다. 해당 행의 내용은 완전히 다릅니다. 각 행에는 변경해야 할 수도있는 2 개의 데이터가 있으므로'dataChanged() '를 사용하여 그렇게 할 수 있습니다. 그러나 일부 입력은 거기에 있으며, 그것은 자신의 다른 데이터와 함께 새로운 행을 포함합니다. 이 경우 리셋을 사용하는 것이 더 좋을까요? 그렇다면 리셋을 어디에 넣을 수 있습니까? 코드의'timerHit()'에? – user1173240