0

編集済み-

これが私が投げ込まれているところです:

for(int i=0, a=bugModel->rowCount(); i<a; i++){
        qDebug() << i;
        QString *BugName = new QString(QString::number(i));
        setting.beginGroup(BugName->toAscii());
        bugModel->setData(bugModel->index(i,0), setting.value("theBugName",  "A Bug!").toString());
        setting.endGroup();
        delete BugName;
    }

設定グループから名前をロードして、名前がiに等しいリストモデルに設定しようとしています。ただし、モデルをロードするたびに、グループ「0」の情報のみが表示されます。これは、ここではiが0であるためです。例えば:

「0」と「1」という名前の2つの設定グループがあります。forループを2回実行して、これらのグループから値をロードし、QListViewに設定するようにします。しかし、私はそれをテストし、それが「0」グループの値のみをロードするたびに、それに変更するとfor(int i=1..)、グループ「1」の値をロードします。

4

2 に答える 2

1

最初のケースを修正するには、(*BugName) = QString::number(i)またはを実行できますBugName->setNum(i);が、より大きな問題は、何を達成しようとしているのか、それがゼロのままかどうかをどのように確認するのかということです。何を変えると思いますか?多分もっと文脈を与える?

于 2012-09-26T09:46:44.763 に答える
0

「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 番目のパスで値を上書きしている可能性があります。

于 2012-09-26T10:05:54.047 に答える