Aiuta a ottenere dati inseriti dopo la riga Qt Segnale inserito
-
05-07-2019 - |
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?
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.