2011-07-14 8 views
2

私は複数のテキストボックスが存在するguiフォームを持っています。私はそれらの値を配列の中に入れたい。それを行う1つの方法は、このようなものを書くことです。qtでguiオブジェクト名を使ってループを実行するには?

{array element } = ui->text_1->text(); 

これをtext_2、text_3〜nまで繰り返します。

私が望むのは、ループを実行し、各サイクルでテキストボックス名の数字部分を置き換えることです。それはQTで行うことができますどのようにこの{array element } = ui->text_{This number getting changed }->text();

よう

何か?

答えて

4

記載されたものに別のオプションは、初期化リストを使用してアレイを作成するには、次のようになります。あなたは次のように使用して子のリスト(documentation)を取得することができます。配列の大きさ(および変更頻度)に応じて、これは実行可能かもしれません。ここ

QLineEdit* entries[] = { ui->text_0, ui->text_1, ui=>text_2 }; 
QStringList answers; 
for (int i = 0; i < 3; ++i) 
{ 
    answers += entries[i]->text(); 
} 
+0

この方法では、各テキストボックスの名前を指定する必要があります。 Matyasの2番目の提案ははるかに速く、IMHOはエレガントです。 – sithereal

+0

Matyasの2番目の提案は、テキスト要素の順序がどういうものか、気にしないかを知ることができれば素晴らしいことです。要素を特定の方法で順序付けする必要がある場合、これはこれまでのところ私が思い付いた最も簡単な方法です。 –

+0

これはあなたのUiが.uiファイルで生成されているので、これらの名前を付けなければならないので、これは良いことです。 –

7

これには2通りの方法があります。

  1. あなたの代わりにtext1text2などを使用しての、UIを作成するとき、あなたはその後、それらの値を取得したい場合、単にこの配列

    を反復QLineEdit S(例えば。std::vector<QLineEdit>)との配列を作成
  2. コンテナウィジェットの子を反復処理します。


    QList<QObject *> list = parentWidget->children(); 

1

はマーチャーシュソリューションの拡張バージョンである:それはちょうど数が変化し、常に増えている場合

class MyClass : public QWidget 
{ 
    QStringList answers; 
    void FillAnswersList(QObject *base) 
    { 
     QLineEdit *lineEdit = qobject_cast<QLineEdit>(base); 
     if(lineEdit)answers.append(lineEdit->text());  
     else 
     { 
      foreach(QObject *child, base->children()) 
       FillAnswersList(child); 
     } 
    } 
}; 
0

、として名を取りQObject::findChildを使用して、別の可能な解決策は、そこにありますパラメータ。

QString name_template("text_%1"); 
QStringList answers; 
for(int i = 0; i < MAX_TEXTS; ++i) 
{ 
    QLineEdit *edit = ui->findChild<QLineEdit *>(name_template.arg(i)); 
    answers += edit->text(); 
} 
関連する問題