「a」の奇妙な使用法に基づいて、投稿していないコードが他にもたくさんあると推測しています。現在のところ、ループは と同等for (int i = 0; i < 2; ++i)
であり、したがって i=0 と i=1 だけを反復します。最初のパスで、新しい QString を作成し、アドレスを bugname ポインターに割り当て、(誤って) 文字列をそれに割り当てようとします。2 行目を に変更する*BugName = QString::number(i);
と、動作するはずです。さらに良いことに、QString コンストラクターの 1 つを使用して、最初の行を に変更しQString* BugName = new QString(QString::number(i))
、2 行目を完全に削除することができます。
2 つ目の問題は、メモリ リークです。最初のパスの後、ループがリセットされ、2 番目の qstring を作成して、バグ名を新しいアドレスで上書きします。残念ながら、これは作成した最初の qstring を孤立させ、リークを引き起こします。delete BugName;
ループの終了直前に行を追加して修正します。ループの後で使用するために実際に 'BugNames' の配列を作成しようとしている場合は、代わりに配列を使用することをお勧めします。QString BugNames[2]
ループの前に配置し、ループを使用して繰り返し処理し、BugNames[i] = QString::number[i]
. delete
配列は自動変数であるため、この後者の場合の部分は必要ありません。
編集
あなたの修正されたコードを見て、私はそれをこのようにします(古い方法はまだ有効です):
for(int i=0; i < bugModel->rowCount(); i++){
qDebug() << i;
QString BugName = QString::number(i);
setting.beginGroup(BugName.toAscii());
bugModel->setData(bugModel->index(i,0), setting.value("theBugName", "A Bug!").toString());
setting.endGroup();
}
「a」の使用は冗長であることに注意してください。これは、(実際にはループ自体も) コンパイラによって削除される可能性が高いためです。あなたが何をしているのかがわかったので、ポインター文字列を完全に捨てて、単一の自動変数を使用します。動かない問題は、qDebugが「0 1」を出力しているはずですよね?qDebug() << BugName;
割り当て後に試すこともできますが::number
、「0 1」も出力されると思います。これは、実際の問題begin/endGroup()
がこのループではなく、関数のどこかにあることを意味します。への引数beginGroup
が静的なものに割り当てられた場合、2 番目のパスで値を上書きしている可能性があります。