2

我有一个连接到 QAbstractItemModel 的 rowsInserted SIGNAL 的 onText 方法,因此可以在插入新行时收到通知:

QObject::connect(model, SIGNAL(rowsInserted ( const QModelIndex & , int , int  )  ),
                        client_,SLOT(onText( const QModelIndex & , int , int  )) )

信号工作正常,因为插入行时我会收到通知。这是 onText 方法:

void FTClientWidget::onText( const QModelIndex & parent, int start, int end ) 
{
    Proxy::write("notified!");

    if(!parent.isValid())
        Proxy::write("NOT VALID!");
    else
        Proxy::write("VALID");

     QAbstractItemModel* m = parent.model();


}

但我似乎无法从插入的项目中获取字符串。传递的 QModelIndex“父级”无效,并且“m”QAbstractItemModel 为 NULL。我认为这是因为它不是一个实际的项目,而只是一个指向一个的指针?如何获取插入的文本/元素?

4

2 回答 2

2

由于父级对顶级项目无效,另一种选择是让 FTClientWidget 访问模型(如果它不违反您的预期设计),然后 FTClientWidget 可以直接在模型本身上使用开始和结束参数:

void FTClientWidget::onText( const QModelIndex & parent, int start, int end ) 
{
   //Set our intended row/column indexes 
   int row = start;
   int column = 0;

   //Ensure the row/column indexes are valid for a top-level item
   if (model_->hasIndex(row,column))
   {
      //Create an index to the top-level item using our 
      //previously set model_ pointer
      QModelIndex index = model_->index(row,column);

      //Retrieve the data for the top-level item
      QVariant data = model_->data(index);
   }
}
于 2009-07-30T20:29:29.513 回答
1

父级对于顶级项目将始终无效,因此您可以预期它是无效的。Qt 文档很好地解释了父级的工作原理。start是插入子项的第一行,也是插入子项end的最后一行。

因此,您可以通过以下方式访问它:

int column = 0;

// access the first child
QModelIndex firstChild = parent.child(first, column);
QModelIndex lastChild = parent.child(end, column);

// get the data out of the first child
QVariant data = firstChild.data(Qt::DisplayRole);

或者,如果您愿意,您可以使用索引来检索您可以从中访问它的模型。

于 2009-07-29T21:30:18.027 回答