2017-01-05 9 views
1

Моя программа может добавлять новые QLabels и QLineEdits в QScrollArea после нажатия кнопки. Идея состоит в том, чтобы создать список продуктов. Моя проблема в том, когда нажата вторая кнопка. Я хочу получить текст всех 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

Я бы просто хранить указатель для каждого QLineEdit в QVector, а затем петля в этом векторе, чтобы получить текст каждого из них.

Заголовок:

#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 

В Cpp файле измените следующее:

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.

-1

вы не можете, потому что вы не имеете любой указатель или ссылка на эти объекты, одно решение будет иметь массив QLabel в определении вашего класса.

например:

QVector<QLabel*> _labels; 

и добавление и инстанцировании один за одним нажатием кнопки, а затем вы будете иметь весь список объектов, таким образом, их имена

0

Если вы хотите изменить имя переменной (т.е. указатель на QLineEdit) каждый раз, когда вы слот называется, и при условии, что i останется мало (< 10), вы можете использовать switch(i), например, и выберите различное имя переменной для каждого случая, но вам придется хранить все эти переменные в качестве членов вашего класса. Поэтому лучше хранить указатели в QList или QVector и перебирать эти контейнеры для доступа к методу text() для каждого QLineEdit.

 Смежные вопросы

  • Нет связанных вопросов^_^