Qtのデザイナーは、XMLのようなファイルを使用してユーザーインターフェイス(UI)フォームのレイアウトを表現するためにファイルと呼ばれます。このファイルは、hirarchicalな方法で構造を記述します。
ビルドプロセス中に.uiファイルは、User Interface Compiler(uicまたはuic.exe)というツールで使用され、ソースコードが生成されます。ソースコードは、UIファイルに関連するクラスに含まれるヘッダーファイルに格納されます。
もちろんこれは手動で行うこともできます。このアプローチとあなたが達成したいことの違いは、意思決定の時間です。上述の手順は、コンパイル時間で知られている情報を使用します。プログラマーは、ソースコードを書く時にそのような変数があり、その名前を使ってアクセスできることを知っています。
ランタイムで決定したいようです。これはおそらく、人々が配列を使用することを提案している理由です。問題は、コンパイラが必要なオブジェクトの数を知ることができないことです。そのため、ポインタを格納する変数がないため、実行時に作成するオブジェクトへのポインタを格納するために、何らかの動的データ構造が必要です。
Qt(適切に使用される)はメモリ管理を担当するため、オブジェクトへのポインタは必ずしも必要ではないことに注意してください。一時的な使用にローカル変数を使用し、グリッドに空QGridLayoutがあると仮定すると、以下のような何かを行うことができ、GridLayoutのと呼ばれる:
bool cond1;
bool cond2;
int row = 0;
int column = 0;
/* set cond1 and cond2 based on your decision logic */
if(cond1)
{
QLineEdit *lineEdit = new QLineEdit("Text for LineEdit 1", this);
gridLayout->addWidget(lineEdit, row, column);
row++;
column++;
}
if(cond2)
{
QLineEdit *lineEdit = new QLineEdit("Text for LineEdit 2", this);
gridLayout->addWidget(lineEdit, row, column);
row++;
column++;
}
他の一般的な解決策は、(これは必ずしも可能ではないながら)静的にすべての可能なウィジェットを追加するだけで、次のように動的に表示を切り替えることです:あなたもQtのデザイナを使用することができますし、切り替えたいウィジェットの数が少ない場合に使用することができるアプローチで
bool cond1;
bool cond2;
lineEdit1->setVisible(cond1); /* Alternatevily show(), hide() */
lineEdit2->setVisible(cond2);
。欠点は、それがうまくスケールされないということです。
'.ui'ファイルaおそらく[moc](https://doc.qt.io/qt-5/moc.html)を使ってC++コードを生成します。 – nwp
@nwp実際には、 '.ui' - >' .h'コンパイルは['uic'](https://doc.qt.io/qt-5/uic.html)を使って行います。 – Angew