0

QTableViewから派生したモデルを使用する、がありますQAbstractTableModel

モデルはいくつかの行から始まり、データを適切に表示します。

モデルにはタイマーも接続されており、有効期限が切れると、行と列の数を取得し、そのインデックスを作成し、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();
}

新しい行が追加されるようにビューを変更する方法を提案してください。

ありがとう。

4

1 に答える 1

-1

QModelIndexで要素にを作成したからといってrow, col、その要素のデータを作成したわけではありません(また、現在の端とその要素の間の要素のデータも作成していません)。

を使用setData(...)してテーブルに新しいデータを追加してからdataChanged(...)、ビューに出力して表示する必要があります。

于 2013-02-15T08:16:09.573 に答える