2017-01-05 4 views
1

Mein Programm kann nach dem Klicken auf eine Schaltfläche neue QLabels und QLineEdits zu einer QScrollArea hinzufügen. Die Idee ist, eine Einkaufsliste zu erstellen. Mein Problem ist, wenn eine zweite Schaltfläche angeklickt wird Ich möchte den Text aller QLineEdits erhalten. Aber ich weiß nicht, wie ich diese Elemente verwenden soll, denn jede neue QLineEdit-Variable hat denselben Namen und ich weiß nicht, wie ich das ändern soll.So verwenden Sie automatisch hinzugefügte Qt-Elemente

Unten ist ein kleines Beispiel:

mein 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 

mein 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

Warum speichern Sie sie nicht in einem Vektor, und wenn Sie den Text erhalten möchten, durchlaufen Sie diesen Vektor und rufen 'text()' darauf auf? –

+0

Sie können auch etwas wie 'QList lineEditList = ui-> scrollArea_2-> widget() -> findChildren ()'; – drescherjm

Antwort

1

ich einfach den Zeiger speichern würde zu jedem QLineEdit in einem QVector, und dann in diesem Vektor Schleife, um den Text von jedem zu erhalten.

Rubrik:

#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 

In CPP-Datei, ändern Sie die folgenden Schritte aus:

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 */ 
    } 
} 

Wenn Sie Ihren QLineEdit löschen, denken Sie daran, auch sie aus dem QVector zu entfernen.

-1

Sie können nicht, weil Sie haben keine Zeiger oder Verweis auf diese Objekte, eine Lösung wäre ein Array von QLabel in Ihrer Klassendefinition.

ex:

QVector<QLabel*> _labels; 

und das Hinzufügen und eins nach dem anderen mit dem Druck auf die Taste instanziieren und dann werden Sie die ganze Liste von Objekten, damit ihre Namen

0

Wenn Sie den Namen der Variablen (dh der Zeiger auf die QLineEdit) jedes Mal, wenn Slot aufgerufen ändern möchten, und vorausgesetzt, dass i klein bleiben (< 10), können Sie switch(i) zum Beispiel verwenden, und wählen Sie verschiedene Variablennamen für jeden Fall, aber Sie müssen alle diese Variablen als Mitglieder Ihrer Klasse speichern. Daher ist es besser, die Zeiger in einer QList oder einem QVector zu speichern und diese Container zu durchlaufen, um auf die Methode text() für jeden QLineEdit zuzugreifen.