跳转至

07-常用控件:输入、列表、对话框

目录页:见 Qt 教程目录

目标

  • 会用三类最常用控件:输入框、列表、下拉选择
  • 会弹出对话框:提示框、确认框、选择文件
  • 能做一个最小“待办清单”界面:输入 → 加到列表 → 删除

先决知识(可选)

  • 会用布局搭一个小界面(见 05 章)
  • 理解信号与槽(见 04 章)

1. 输入控件:把用户的字拿到手

1.1 QLineEdit:单行输入框

  • 专业名称:QLineEdit
  • 类比:一条可以编辑的“输入条”
  • 作用:输入用户名、关键词、路径等
  • 规则/坑点:用 text() 取文本;需要限制输入时用 validator 或 inputMask

最常用动作: - lineEdit->text():取当前文本 - lineEdit->setText(...):设置文本 - lineEdit->setPlaceholderText(...):灰色提示

1.2 QPlainTextEdit / QTextEdit:多行文本

  • 类比:多行输入区(聊天框/日志/备注)
  • 新手结论:需要纯文本就用 QPlainTextEdit,富文本才用 QTextEdit

2. 列表与选择:把很多项展示出来

2.1 QListWidget:最简单的列表

  • 专业名称:QListWidget
  • 类比:一张“条目清单”
  • 作用:快速展示与选择一堆字符串项
  • 规则/坑点:适合简单数据;复杂数据后面会用 Model/View(进阶再讲)

2.2 QComboBox:下拉选择

  • 类比:可展开的下拉菜单
  • 作用:从预设选项里选一个
  • 规则/坑点:选择变化用 currentIndexChanged

3. 对话框:和用户“弹窗说话”

3.1 QMessageBox:提示/确认

  • 专业名称:QMessageBox
  • 类比:系统弹窗的“标准模板”
  • 作用:提示错误、确认删除
  • 规则/坑点:提示信息要明确,不要只写“error”

3.2 QFileDialog:选文件/选目录

  • 类比:打开资源管理器让用户点选
  • 作用:让用户选择文件路径
  • 规则/坑点:返回空字符串表示用户取消

4. 最小可用例子:待办清单(可运行)

功能: - 输入框输入一行文字 - 点击 Add 加到列表 - 选中某一项后点击 Remove 删除(删除前弹确认框)

#include <QApplication>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QListWidget>
#include <QMessageBox>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

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

    QWidget w;
    w.setWindowTitle("Todo Demo");

    auto *root = new QVBoxLayout(&w);
    auto *row = new QHBoxLayout;
    auto *input = new QLineEdit;
    auto *add = new QPushButton("Add");
    auto *remove = new QPushButton("Remove");
    auto *list = new QListWidget;

    input->setPlaceholderText("type something...");

    row->addWidget(input);
    row->addWidget(add);
    row->addWidget(remove);

    root->addLayout(row);
    root->addWidget(list);

    QObject::connect(add, &QPushButton::clicked, &w, [=] {
        QString t = input->text().trimmed();
        if (t.isEmpty()) {
            return;
        }
        list->addItem(t);
        input->clear();
    });

    QObject::connect(remove, &QPushButton::clicked, &w, [=] {
        auto *item = list->currentItem();
        if (!item) {
            return;
        }
        auto r = QMessageBox::question(&w, "Confirm", "Remove selected item?");
        if (r == QMessageBox::Yes) {
            delete item;
        }
    });

    w.resize(520, 360);
    w.show();
    return app.exec();
}

常见坑

  • 错误:删除列表项后继续使用旧指针
    结果:崩溃或访问无效内存
    正确:delete item 后不要再用它;需要的话重新 currentItem() 获取

  • 错误:没处理用户取消对话框
    结果:逻辑误删/误操作
    正确:QMessageBox/QFileDialog 的返回值要判断


小练习

练习 1:双击编辑

  • 题目:双击列表项弹输入框修改内容
  • 输入/输出:修改后列表项文字更新
  • 约束:必须用对话框/输入框,不要新开窗口
  • 提示:可以用 QInputDialog::getText(你需要自己查一下头文件并加入工程)
  • 目标:练“从 UI 获取输入再更新 UI”

练习 2:保存与加载(预告资源/文件)

  • 题目:把 todo 列表保存为文本文件,每行一条;启动时可加载
  • 输入/输出:save 生成文件,load 读取回来
  • 约束:文件路径由 QFileDialog 选择
  • 提示:用 QFile + QTextStream
  • 目标:练文件对话框与基本 I/O

小结

  • QLineEdit 负责输入,QListWidget 负责展示列表,QComboBox 负责选择
  • QMessageBox 用来提示/确认,QFileDialog 用来选文件/目录
  • 把输入→处理→更新界面这条链练熟,你就能做很多小工具

下一篇:见 08-绘制基础-QPainter画图与自定义控件