如何使用自动添加的Qt元素

时间:2017-01-05 15:29:20

标签: c++ qt qtgui

我的程序可以在单击按钮后将新的QLabel和QLineEdits添加到QScrollArea。我们的想法是创建一个购物清单。我的问题是当点击第二个按钮时我想获得所有QLineEdits的文本。但我不知道如何使用这些元素,因为每个新的QLineEdit变量都有相同的名称,我不知道如何改变它。

以下是一个小例子:

我的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();
}

3 个答案:

答案 0 :(得分:1)

我只是将指针存储到QLineEdit中的每个QVector,然后在此向量中循环以获取每个{。p>的文本。

部首:

#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 :(得分:0)

如果要在每次调用插槽时更改变量的名称(即指向QLineEdit的指针),并且假设i保持较小(<10),则例如,可以使用switch(i)为每个案例选择不同的变量名称,但您必须将所有这些变量存储为类的成员。因此,最好将指针存储在QList或QVector中,并在这些容器上循环以访问每个QLineEdit上的text()方法。

答案 2 :(得分:-1)

你不能,因为你没有任何指针或对这些对象的引用,一个解决方案就是在你的类定义中有一个QLabel数组。

例如:

QVector<QLabel*> _labels;

并按下按钮逐个添加和实例化,然后您将拥有整个对象列表,因此他们的名称