用更多行动态更新 QTableView

Posted

技术标签:

【中文标题】用更多行动态更新 QTableView【英文标题】:Updating QTableView with more rows dynamically 【发布时间】:2013-02-15 07:35:05 【问题描述】:

我有一个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();

请建议我如何更改视图以便添加新行。

谢谢。

【问题讨论】:

【参考方案1】:

仅仅因为您为row, col 的元素创建了QModelIndex,并不意味着您为该元素创建了数据(也不是为当前端和该元素之间的元素)。

您必须使用setData(...) 将新数据添加到表中,然后发出dataChanged(...) 以便视图显示它。

【讨论】:

在这种情况下,我希望删除所有行并插入新行...类似于reset。如果要进行重置,我应该在哪里进行?数据必须始终是 o(btained,正如您在 ItemList 中的 data() 函数中看到的那样。所以在 timerHit() 插槽中,如果我存储行数,然后如果新的行数不同于老,我应该打电话给beginResetModel()。这样对吗?否则,我应该去哪里? 我不完全明白你想要做什么。如果您真的想从模型中删除所有内容,那么我认为您必须分别删除所有行。从beginRemoveRows(parent, 0, nrOfRows); 开始,然后执行removeRows( 0, nrOfRows );,然后执行endRemoveRows( parent, 0, nrOfRows );。之后,您可以再次开始插入行。如果您只是希望您的视图根据模型中的数据进行完整更新,只需使用QAbstractTableModel::modelReset() 我有一个包含一些行的表。数量不固定。一开始它可能是任何东西。稍后..我可能会得到新的行数。这些行的内容将完全不同。每行有 2 条数据可能需要更改,所以我使用了 dataChanged() 并让它以这种方式工作。但是那里有一些输入,其中将包含具有自己不同数据的新行。在这种情况下,我是否最好进行重置,如果可以,我可以在哪里进行重置?在timerHit()的代码中? 好的,所以不要使用任何重置功能。只需删除所有元素(所有行)并再次开始添加行。您应该在有新行输入的地方执行此操作。

以上是关于用更多行动态更新 QTableView的主要内容,如果未能解决你的问题,请参考以下文章

ANSI sql将行动态转换为列数据

如何在红移中进行动态正则表达式匹配?

使用自动换行动态添加文本块

QSortFilterProxyModel 不更新 QTableview

QTableView() 仅在选择时更新更改

如何在 SQL Server 中将行动态转换为列