Помогите получить вставленные данные после сигнала Qt's rowInserted - PullRequest
2 голосов
/ 29 июля 2009

У меня есть метод onText, который подключается к QInbstractItemModel's rowInserted SIGNAL, чтобы я мог получать уведомления о вставке новых строк:

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. Я думаю, потому что это не фактический элемент, а просто указатель на него? Как мне получить вставленный текст / элементы?

Ответы [ 2 ]

2 голосов
/ 31 июля 2009

Поскольку родительский элемент будет недопустимым для элементов верхнего уровня, другой вариант мог бы дать FTClientWidget доступ к модели (если это не нарушает ваш предполагаемый дизайн), и тогда FTClientWidget может использовать аргументы start и end непосредственно на Сама модель:

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);
   }
}
1 голос
/ 30 июля 2009

Родитель всегда будет недействительным для элементов верхнего уровня, поэтому вы можете ожидать, что он будет недействительным. Документация 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);

Или, если хотите, вы можете использовать индекс, чтобы получить модель, из которой вы можете получить к ней доступ.

...