You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何创建允许用户动态添加Line Edit的Qt对话框?

如何创建支持动态添加文本输入框的Qt对话框

完全可以实现这个需求!下面我会用Qt Widgets给你一个完整的实现方案,包含动态添加、删除输入框,以及获取所有输入内容的逻辑,上手就能用。

核心思路

我们用**垂直布局(QVBoxLayout)作为主容器承载所有输入行,每个输入行用水平布局(QHBoxLayout)**包裹一个QLineEdit和删除按钮。再放一个“添加另一个”按钮,点击时就往主布局里插入新的输入行,操作直观且灵活。

完整代码实现

1. 头文件(DynamicInputDialog.h)

#ifndef DYNAMICINPUTDIALOG_H
#define DYNAMICINPUTDIALOG_H

#include <QDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPushButton>

class DynamicInputDialog : public QDialog
{
    Q_OBJECT

public:
    explicit DynamicInputDialog(QWidget *parent = nullptr);
    // 获取所有输入框的内容
    QStringList getInputContents() const;

private slots:
    // 添加新的输入行
    void addNewLineEdit();
    // 删除指定的输入行
    void removeLineEdit();

private:
    QVBoxLayout *m_mainLayout;
    // 辅助函数:创建单个输入行的布局
    QHBoxLayout* createInputLine();
};

#endif // DYNAMICINPUTDIALOG_H

2. 实现文件(DynamicInputDialog.cpp)

#include "DynamicInputDialog.h"

DynamicInputDialog::DynamicInputDialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("动态输入表单");
    setMinimumWidth(400);

    // 初始化主布局
    m_mainLayout = new QVBoxLayout(this);

    // 添加第一个输入行
    m_mainLayout->addLayout(createInputLine());

    // 添加"添加另一个"按钮
    QPushButton *addBtn = new QPushButton("添加另一个", this);
    connect(addBtn, &QPushButton::clicked, this, &DynamicInputDialog::addNewLineEdit);
    m_mainLayout->addWidget(addBtn);

    // 添加对话框的确认/取消按钮(可选,提升交互体验)
    QDialogButtonBox *btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
    connect(btnBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
    connect(btnBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
    m_mainLayout->addWidget(btnBox);
}

QHBoxLayout* DynamicInputDialog::createInputLine()
{
    QHBoxLayout *lineLayout = new QHBoxLayout();

    QLineEdit *lineEdit = new QLineEdit(this);
    lineEdit->setPlaceholderText("请输入内容...");
    lineLayout->addWidget(lineEdit);

    QPushButton *deleteBtn = new QPushButton("删除", this);
    // 用UniqueConnection确保每个按钮只绑定一次槽函数
    connect(deleteBtn, &QPushButton::clicked, this, &DynamicInputDialog::removeLineEdit, Qt::UniqueConnection);
    lineLayout->addWidget(deleteBtn);

    return lineLayout;
}

void DynamicInputDialog::addNewLineEdit()
{
    // 在"添加另一个"按钮之前插入新的输入行,布局更合理
    m_mainLayout->insertLayout(m_mainLayout->count() - 2, createInputLine());
}

void DynamicInputDialog::removeLineEdit()
{
    // 获取触发点击的按钮
    QPushButton *btn = qobject_cast<QPushButton*>(sender());
    if (!btn) return;

    // 获取按钮所在的水平布局
    QHBoxLayout *lineLayout = qobject_cast<QHBoxLayout*>(btn->parent()->layout());
    if (!lineLayout) return;

    // 移除并删除布局内的所有控件,避免内存泄漏
    while (QLayoutItem *item = lineLayout->takeAt(0)) {
        if (QWidget *widget = item->widget()) {
            widget->deleteLater();
        }
        delete item;
    }

    // 删除布局本身
    delete lineLayout;
}

QStringList DynamicInputDialog::getInputContents() const
{
    QStringList contents;
    for (int i = 0; i < m_mainLayout->count(); ++i) {
        QLayoutItem *item = m_mainLayout->itemAt(i);
        if (QHBoxLayout *lineLayout = qobject_cast<QHBoxLayout*>(item->layout())) {
            // 获取布局内的第一个控件(即QLineEdit)
            QLayoutItem *editItem = lineLayout->itemAt(0);
            if (QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editItem->widget())) {
                contents.append(lineEdit->text().trimmed());
            }
        }
    }
    return contents;
}

使用示例

在主窗口或其他逻辑中调用这个对话框:

#include "DynamicInputDialog.h"
#include <QApplication>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    DynamicInputDialog dialog;
    if (dialog.exec() == QDialog::Accepted) {
        QStringList inputs = dialog.getInputContents();
        // 处理输入内容,比如弹窗显示
        QMessageBox::information(nullptr, "输入内容", "你输入的内容:\n" + inputs.join("\n"));
    }

    return a.exec();
}

关键点说明

  • 布局自动适配:Qt布局会自动处理控件的位置和大小,添加/移除输入框时界面会实时更新,不用手动调整位置。
  • 内存安全:用deleteLater()延迟删除控件,避免界面卡顿;布局和控件的内存都做了妥善处理,不会泄漏。
  • 可扩展性:你可以根据需求修改输入行样式,比如添加标签、调整按钮文本,或者限制最大输入框数量(在addNewLineEdit里加判断即可)。

内容的提问来源于stack exchange,提问作者arjan

火山引擎 最新活动