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

Posted

技术标签:

【中文标题】如何使用自动添加的 Qt 元素【英文标题】:How to use automatically added Qt-elements 【发布时间】:2017-01-05 15:29:20 【问题描述】:

单击按钮后,我的程序可以将新的 QLabels 和 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();

【问题讨论】:

为什么不将它们存储在一个向量中,当你想要获取文本时,你循环遍历这个向量并在上面调用text() 你也可以使用QList&lt;QLineEdit*&gt; lineEditList = ui-&gt;scrollArea_2-&gt;widget()-&gt;findChildren&lt;QLineEdit*&gt;(); 【参考方案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 中删除。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

例如:

QVector<QLabel*> _labels;

并通过按下按钮逐一添加和实例化,然后您将拥有整个对象列表,以及它们的名称

【讨论】:

以上是关于如何使用自动添加的 Qt 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序

在 QT 创建者中,如何自动为 cpp 文件或整个项目中的所有方法添加断点?

如何使用情节提要和自动布局在 UIScrollView 中添加动态高度/空间元素? [复制]

qt creator 中如何使用c++库

如何在 JQuery UI 自动完成中添加一个 html 元素?

如何将 jquery ui 自动完成添加到动态创建的元素?