QtのrowInsertedシグナルの後に挿入データを取得するのに役立ちます
-
05-07-2019 - |
質問
新しい行が挿入されたときに通知できるように、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です。それは実際のアイテムではなく、単にアイテムへのポインタだからだと思いますか?挿入されたテキスト/要素を取得するにはどうすればよいですか?
解決
親はトップレベルのアイテムに対して無効になるため、別のオプションは、モデルへの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);
}
}
他のヒント
親は常に最上位アイテムに対して無効になるため、無効であると予想できます。 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);
または、必要に応じて、インデックスを使用して、アクセス可能なモデルを取得できます。
所属していません StackOverflow