32769
Qt 5.7.1 + Qt Creator 4.2.0の環境でアプリを作成しています。  
QTで作成した可変するObjectへのアクセス方法がわからず質問させていただきます。

Window内にTabを作成し、その中にラベルとTextEditを作成し、  
必要になった時、TextEditの文字列を変更する、TextEditの文字列を取得する  
という内容を目指しているのですが、Tab内に作成したObject指定の方法がわからず  
TextEditの文字列を変更することができていない状況です。

以下のような方法で作成しております。  
一つのTabの中に最大64個のTextEdit欄を作成するという感じです。  
Tabの名前が「Tab0」「Tab1」みたいになり、  
Tab0内にQPlainTextEditで作成した入力欄が「te0」「te1」といった感じでいれています。

*tabWidgetからどうすれば作成したTab内のTextEditにアクセスできるでしょうか。  
以上、よろしくお願いいたします。

```

    private
    QTabWidget *tabWidget;
    
    
    void ParamTabWidget::WindowsSetting(unsigned int size)
    {
    int tabNum = 0;
    int lastTabNum = 0;
    tabNum = size / TABinItem;
    if( size % TABinItem != 0 ){
        tabNum++;
        lastTabNum = size % TABinItem;
    }
    else{
        lastTabNum = TABinItem;
    }
    
    /* make TAB */
    tabWidget = new QTabWidget(this);
    for( int i = 0; i < tabNum ; i++ ){
        int startAddress = i * TABinItem;
        int endAddress = startAddress + TABinItem - 1;
        int makeTabCnt = TABinItem;
        if ( i == tabNum - 1 ){
            /* Last Tab */
            endAddress = startAddress + lastTabNum -1;
            makeTabCnt = lastTabNum;
        }
        /* make TAB name */
        QString start,end,tabname;
        start.setNum(startAddress);
        end.setNum(endAddress);
        tabname = start + " - " + end;
        /* make TAB_Layout  */
        QGridLayout *lay = new QGridLayout();
        for( int j = 0; j < makeTabCnt; j++ ){
            if( j % 8 == 0 ){
                /* make row label in TAB_Layout */
                QString str1,str2;
                str1.setNum( (i * 64) + j   );
                str2.setNum( (i * 64) + j+7 );
                QLabel *label = new QLabel( str1 + " - " + str2);
                label->setText( str1 + " - " + str2);
                lay->addWidget(label, j / 8, (j % 8) );
            }
            /* make PlainTextEdit in TAB_Layout */
            QPlainTextEdit *editor3 = new QPlainTextEdit("");
            QString teObjName;
            teObjName.setNum(j);
            teObjName = "te" + teObjName;
            editor3->setObjectName(teObjName);
            editor3->setFixedSize(100,30);
            lay->addWidget( editor3,  j / 8, (j % 8) + 1 ); /* +1 with label */
        }
        /* add TAB */
        QWidget *editor = new QWidget(tabWidget);
        QString TabObjName;
        TabObjName.setNum(i);
        TabObjName = "Tab" + TabObjName;
        editor->setObjectName(TabObjName);
        tabWidget->addTab(editor, tabname);
        /* set TAB_Layout */
        editor->setLayout(lay);
        //tabWidget->setCurrentIndex(i);
        }
    }
    
```
CC BY-SA 3.0
2017-02-16T06:56:15.970
32712
2017-02-20T14:34:25.940
20378
question
qt qt-creator
QTTab内に作成したObjectの操作の仕方
`tabWidget`(`QTabWidget`)からウィジェット(`QPlainTextEdit`)を参照する方法と理解しました。  
これでどうでしょう。(カレントタブの(1,1)の`QPlainTextEdit`に現在時刻を設定する例)

```

    QPlainTextEdit* editor3 = qobject_cast<QPlainTextEdit*>(
        qobject_cast<QGridLayout*>(
            tabWidget->currentWidget()->layout()
        )->itemAtPosition(1, 1 + 1)->widget()
    );
    editor3->setPlainText(QDateTime::currentDateTime().toString());
    
```

ただ、`tabWidget`に指定されているレイアウトが`QGridLayout`であることを前提と  
していることや、レイアウトの1列目はQLabelであることを前提としています。  
保守性がよいとは言い難いと思うので、データモデルとして`QPlainTextEdit`の2次元配列を  
用意して、タブへの設定や値の操作はそちらに行ったほうがよいかと思います。  
(2次元配列の例: `QVector<QVector<QPlainTextEdit> >`)
CC BY-SA 3.0
2017-02-18T08:03:27.473
32769
2017-02-18T08:03:27.473
20098
32712
answer
名前で検索するならこういう感じでしょうか。(先と同じ例)

```

    QPlainTextEdit* editor3 = 
        tabWidget->currentWidget()->findChild<QPlainTextEdit*>("te11");
    editor3->setPlainText(QDateTime::currentDateTime().toString());
    
```

＃元の実装方法だと`tabWidget->currentWidget()`は不要かも知れませんが。
CC BY-SA 3.0
2017-02-20T14:34:25.940
32816
2017-02-20T14:34:25.940
20098
32712
answer