2017-01-05 9 views
1

ボタンをクリックすると、プログラムは新しいQLabelsとQLineEditsをQScrollAreaに追加できます。アイデアは食料品リストを作成することです。私の問題は、2番目のボタンがクリックされたときです。すべてのQLineEditsのテキストを取得したいのです。しかし、新しいQLineEdit変数はすべて同じ名前で、どのように変更するのか分からないので、これらの要素の使い方はわかりません。自動的に追加されたQt要素の使用方法

以下

は小さな一例です:

私MainWindow.h:

#ifndef MainWINDOW_H 
#define MainWINDOW_H 

#include <QMainWindow> 
#include <string> 

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

    public: 
     explicit MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 
     int i; 

    private: 
     Ui::MainWindow *ui; 

private slots: 
    void on_create_clicked(); 
    read_text(); 
}; 

#endif // MainWINDOW_H 

私MainWindow.cpp:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_create_clicked())); 
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(read_text())); 
    i = 1; 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_create_clicked() 
{ 
    if(i < 10) 
    { 
     i ++; 
     QLabel *label_2 = new QLabel(); 
     QString s = QString::number(zaehlerHeight) + ". "; 
     label_2->setText(s); 
     ui->scrollArea->widget()->layout()->addWidget(label_2); 

     QLineEdit *lineEdit = new QLineEdit(); 
     ui->scrollArea_2->widget()->layout()->addWidget(lineEdit); 
    } 
    else{ 
     ui->label->setText("already 10"); 
    } 
} 

void MainWindow::read_text() 
{ 
    QString mytext = ui->lineEdit->text(); 
} 
+0

なぜベクトルに格納しないのですか?テキストを取得するには、このベクトルをループして 'text()'を呼び出します。 –

+0

'QList lineEditList = ui-> scrollArea_2-> widget() - > findChildrenのようなものを使うこともできます()'; – drescherjm

答えて

1

私は単純にポインタを格納しますQVectorの各QLineEditに入力し、このベクトルをループしてそれぞれのテキストを取得します。

ヘッダー:CPPファイルで

#ifndef MainWINDOW_H 
#define MainWINDOW_H 

#include <QMainWindow> 
#include <string> 
#include <QVector> 

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

    public: 
     explicit MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 
     int i; 

    private: 
     Ui::MainWindow *ui; 
     QVector<QLineEdit *> m_VecLineEdits; 

private slots: 
    void on_create_clicked(); 

private: 
    void read_text(); 
    void GetAllTextEdit(); 
}; 

#endif // MainWINDOW_H 

、次のように変更します。

void MainWindow::on_create_clicked() 
{ 
    if(i < 10) 
    { 
     i ++; 
     QLabel *label_2 = new QLabel(); 
     QString s = QString::number(zaehlerHeight) + ". "; 
     label_2->setText(s); 
     ui->scrollArea->widget()->layout()->addWidget(label_2); 

     QLineEdit *lineEdit = new QLineEdit(); 
     m_VecLineEdits.push_back(lineEdit); // <-- Line added here to save the pointers in a QVector. 
     ui->scrollArea_2->widget()->layout()->addWidget(lineEdit); 
    } 
    else{ 
     ui->label->setText("already 10"); 
    } 
} 

void MainWindow::GetAllTextEdit() 
{ 
    for(int j = 0; j<m_VecLineEdits.size(); ++j) 
    { 
     QString lineEditText = m_VecLineEdits.at(j)->text(); 
     /* Do anything with this value */ 
    } 
} 

あなたQLineEditを削除した場合、またQVectorからそれらを削除することを忘れないでください。あなたは(QLineEditへのポインタIE)あなたスロットが呼び出されるたびに変数の名前を変更したい、とiは(< 10)小さな滞在することに提供されている場合

-1

はできませんので、あなたがいずれかを持っていないため、これらのオブジェクトへの参照、または参照を使用する場合、クラス定義にQLabelの配列を持つ解決策があります。

例:

QVector<QLabel*> _labels; 

とボタンを押すと1つずつ追加し、インスタンス化してから使用すると、オブジェクトのリスト全体を持っています、ので、それらの名前

0

、あなたは、例えばswitch(i)使用して選択することができますそれぞれのケースで異なる変数名を使用しますが、それらの変数をすべてクラスのメンバーとして保存する必要があります。だから、QLineEdit上のtext()メソッドにアクセスするには、ポインタをQListまたはQVectorに格納してそれらのコンテナをループする方がよいでしょう。

関連する問題