如何使用自动添加的 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<QLineEdit*> lineEditList = ui->scrollArea_2->widget()->findChildren<QLineEdit*>()
;
【参考方案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 中添加动态高度/空间元素? [复制]