2011-07-09 20 views
1

私の現在のプロジェクトでは、ユーザーからの寸法を考慮して、実行時に作成するQCheckBoxesの配列があります。ユーザーが[生成]ボタンをクリックするたびに、入力した寸法が集められ、QCheckBoxの配列が作成されます。次のコードで行われます。各要素へのポインタのベクトルを使用してQCheckBoxの配列を削除するにはどうすればよいですか?

void MainWindow::on_generateBoxes_clicked() 
{ 
    int x_dim = ui->xDim->value(); 
    int y_dim = ui->yDim->value(); 
    int z_dim = ui->zDim->value(); 

    for(int i = 0; i < x_dim; ++i){ 
     for(int j = 0; j < y_dim; ++j){ 
      checkBoxVector.append(new QCheckBox(ui->dim1)); 
      checkBoxVector.last()->setGeometry(i * 20, j * 20, 20, 20); 
     } 
    } 
} 

checkBoxVectorが別のソースファイルで宣言ポインタのグローバル配列である:

QVector<QCheckBox*> checkBoxVector; 

私の質問は、どのように私はすべてのQCheckBoxを削除するcheckBoxVectorて行くだろうか?配列の以前の次元は、関数が戻ったときに失われるローカル変数であるため、再呼び出し時に削除する要素の数をどのように知っているでしょうか?

ユーザーが 'Generate'ボタンを2回押すと、QCheckBoxesが重複するため、関数が呼び出されるたびにすべてを消去する必要があります。 (また、誰もがメモリリークを望んでいない!)

答えて

5

まず、ベクトル内のすべての要素(QCheckBoxes)を削除してからベクトルをクリア:

qDeleteAll(checkBoxVector); 
checkBoxVector.clear(); 

あなたはベクトルにあるチェックボックスのポインタを追加しているので、ちょうどベクトルをクリアすると、削除されません。チェックボックス。

+0

ありがとう、これは完全に動作します! –

1

あなたはメンバ関数clear()を使用してベクトルをクリアすることができ、すなわち

checkBoxVector.clear(); 

あなたは再びそれを埋めることができるようにこれがすべてを削除します。要素は「1d」に格納され、QVectorにはその数が分かるため、次元は関係ありません。

編集:これはポインタを削除するより慎重に読む必要があります。あなたが望むのは、ポインタが指すオブジェクトを削除することです。すなわち、

vector<QCheckBoxes*>::iterator itr = checkBoxVector.begin(); 
while(itr != checkBoxVector.end()) 
{ 
    delete *(*(itr)); 
    ++itr; 
} 
+0

注意をitr'はポインタと' QCheckBox'オブジェクトを取得する2番目の時間を得るために1回、2回逆参照されます。 – Dan

+0

エラー: 'QCheckBox **'から非スカラー型 'std :: vector > :: iterator'への変換がエラー と エラー:いいえT = QCheckBox **]() ' と エラー:タイプ' class QCheckBox '引数に' operator 'が指定されていません:' iter!= checkBoxVector.QVector '削除 '、予期したポインタ –

+0

はい、申し訳ありません、私はミューペットされていた。 delete()はオブジェクトへのポインタを期待しているので、オブジェクトデストラクタを呼び出します。 他のエラーはおそらくQVectorではなくベクトルを書いたためです。また、表記法がstd :: vectorと似ていると仮定していたため、わずかに異なる場合があります。 – Dan

0

すべてのQCheckBoxを削除しますか?

foreach (QCheckBox *checkBox, checkBoxVector) 
    delete checkBox; 

//QVector::clear() // clear does not release objects 
+0

このソリューションは、関数を2〜3回呼び出すとプログラムが予期せず終了する原因となります。 –

+0

QVectorのすべてのQCheckBox()とcheckBoxVector.clear()は、ベクトルから要素を削除するために使用し、ベクトルによって使用されるメモリを解放します。 –

0

そのまま使用QVector < QSharedPointer<QCheckBox> >すべてが自動的に削除されます。

次のようなものになります追加: `

CheckBoxes.append(QSharedPointer<QCheckBox>(new QCheckBox())); 
関連する問題