Domanda

Ho un metodo onText che si collega alle righe di un QAbstractItemModel SEGNALE inserito in modo da poter essere avvisato quando sono state inserite nuove righe:

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

Il segnale funziona bene, poiché mi viene comunicato quando vengono inserite le righe. Ecco il metodo 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();


}

Ma non riesco a ottenere la stringa dagli elementi inseriti. QModelIndex "parent" passato NON è VALIDO e " m " QAbstractItemModel è NULL. Penso che sia perché non è un oggetto reale, ma solo un puntatore a uno? Come posso ottenere una sospensione del testo / elementi inseriti?

È stato utile?

Soluzione

Poiché il genitore non sarà valido per gli elementi di livello superiore, un'altra opzione sarebbe quella di dare a FTClientWidget l'accesso al modello (se non viola il progetto previsto), e quindi FTClientWidget può usare gli argomenti di inizio e fine direttamente sul modello stesso:

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);
   }
}

Altri suggerimenti

Il genitore sarà sempre non valido per gli elementi di livello superiore, quindi puoi aspettarti che non sia valido. La documentazione di Qt ha una buona spiegazione di esattamente come funziona il genitore. start è la prima riga in cui è stato inserito un bambino e end è l'ultima riga in cui è stato inserito un bambino.

Pertanto, puoi accedervi con qualcosa di simile al seguente:

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);

In alternativa, se lo desideri, puoi utilizzare l'indice per recuperare il modello dal quale puoi accedervi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top