当前位置: 首页 > news >正文

「Qt Widget中文示例指南」如何实现行编辑功能

Qt是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

Line Edits(行编辑)示例演示了QLineEdit的多种使用方式,并显示了各种属性和验证器对用户提供的输入和输出的影响。

该示例由单个Window类组成,其中包含具有不同输入约束和显示属性的行编辑选择,这些属性可以通过从组合框中选择项来更改。将它们放在一起可以帮助开发人员选择合适的属性用于行编辑,并且可以很容易地比较每个验证器对用户输入的影响。

Window类定义

Window类继承了QWidget并包含一个构造函数和几个槽:

class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = nullptr); public slots: void echoChanged(int); void validatorChanged(int); void alignmentChanged(int); void inputMaskChanged(int); void accessChanged(int); private: QLineEdit *echoLineEdit; QLineEdit *validatorLineEdit; QLineEdit *alignmentLineEdit; QLineEdit *inputMaskLineEdit; QLineEdit *accessLineEdit; };

当在关联的组合框中选择了新的验证器时,这些槽用于更新给定行编辑的验证器类型,行编辑保存在窗口中,以便在这些槽中使用。

Window类实现

Window构造函数用于设置行编辑器、验证器和组合框,将来自组合框的信号连接到Window类中的槽,并在布局中安排子部件。

我们首先构建一个组框来保存标签、组合框和行编辑器,这样就可以演示QLineEdit::echoMode属性:

Window::Window(QWidget *parent) : QWidget(parent) { QGroupBox *echoGroup = new QGroupBox(tr("Echo")); QLabel *echoLabel = new QLabel(tr("Mode:")); QComboBox *echoComboBox = new QComboBox; echoComboBox->addItem(tr("Normal")); echoComboBox->addItem(tr("Password")); echoComboBox->addItem(tr("PasswordEchoOnEdit")); echoComboBox->addItem(tr("No Echo")); echoLineEdit = new QLineEdit; echoLineEdit->setPlaceholderText("Placeholder Text"); echoLineEdit->setFocus();

在这一点上,这些小部件都没有被安排在布局中。最后echoLabel、echoComboBox和echoLineEdit将被放置在echoGroup组框内的垂直布局中。

类似地,我们构造组框和小部件集合来显示QIntValidator 和QDoubleValidator对行编辑器内容的影响:

QGroupBox *validatorGroup = new QGroupBox(tr("Validator")); QLabel *validatorLabel = new QLabel(tr("Type:")); QComboBox *validatorComboBox = new QComboBox; validatorComboBox->addItem(tr("No validator")); validatorComboBox->addItem(tr("Integer validator")); validatorComboBox->addItem(tr("Double validator")); validatorLineEdit = new QLineEdit; validatorLineEdit->setPlaceholderText("Placeholder Text");

文本对齐由另一组小部件演示:

QGroupBox *alignmentGroup = new QGroupBox(tr("Alignment")); QLabel *alignmentLabel = new QLabel(tr("Type:")); QComboBox *alignmentComboBox = new QComboBox; alignmentComboBox->addItem(tr("Left")); alignmentComboBox->addItem(tr("Centered")); alignmentComboBox->addItem(tr("Right")); alignmentLineEdit = new QLineEdit; alignmentLineEdit->setPlaceholderText("Placeholder Text");

QLineEdit 支持使用输入掩码,它们只允许用户在行编辑中输入遵循简单规范的字符,我们构建了一组小部件来演示预定义掩码的选择:

QGroupBox *inputMaskGroup = new QGroupBox(tr("Input mask")); QLabel *inputMaskLabel = new QLabel(tr("Type:")); QComboBox *inputMaskComboBox = new QComboBox; inputMaskComboBox->addItem(tr("No mask")); inputMaskComboBox->addItem(tr("Phone number")); inputMaskComboBox->addItem(tr("ISO date")); inputMaskComboBox->addItem(tr("License key")); inputMaskLineEdit = new QLineEdit; inputMaskLineEdit->setPlaceholderText("Placeholder Text");

QLineEdit的另一个有用特性是使其内容只读的能力,此属性用于控制对以下小部件组中的行编辑访问:

QGroupBox *accessGroup = new QGroupBox(tr("Access")); QLabel *accessLabel = new QLabel(tr("Read-only:")); QComboBox *accessComboBox = new QComboBox; accessComboBox->addItem(tr("False")); accessComboBox->addItem(tr("True")); accessLineEdit = new QLineEdit; accessLineEdit->setPlaceholderText("Placeholder Text");

现在所有的子部件都已经构造好了,我们将来自组合框的信号连接到Window对象中的槽:

connect(echoComboBox, &QComboBox::activated, this, &Window::echoChanged); connect(validatorComboBox, &QComboBox::activated, this, &Window::validatorChanged); connect(alignmentComboBox, &QComboBox::activated, this, &Window::alignmentChanged); connect(inputMaskComboBox, &QComboBox::activated, this, &Window::inputMaskChanged); connect(accessComboBox, &QComboBox::activated, this, &Window::accessChanged);

这些连接中的每一个都使用QComboBox::activated()信号,该信号向插槽提供一个整数,这将用于有效地更改每个槽中的适当行编辑。

我们将每个组合框、行编辑和标签放置在每个组框的布局中,从echoGroup组框的布局开始:

QGridLayout *echoLayout = new QGridLayout; echoLayout->addWidget(echoLabel, 0, 0); echoLayout->addWidget(echoComboBox, 0, 1); echoLayout->addWidget(echoLineEdit, 1, 0, 1, 2); echoGroup->setLayout(echoLayout);

其他布局的构造方式相同:

QGridLayout *validatorLayout = new QGridLayout; validatorLayout->addWidget(validatorLabel, 0, 0); validatorLayout->addWidget(validatorComboBox, 0, 1); validatorLayout->addWidget(validatorLineEdit, 1, 0, 1, 2); validatorGroup->setLayout(validatorLayout); QGridLayout *alignmentLayout = new QGridLayout; alignmentLayout->addWidget(alignmentLabel, 0, 0); alignmentLayout->addWidget(alignmentComboBox, 0, 1); alignmentLayout->addWidget(alignmentLineEdit, 1, 0, 1, 2); alignmentGroup-> setLayout(alignmentLayout); QGridLayout *inputMaskLayout = new QGridLayout; inputMaskLayout->addWidget(inputMaskLabel, 0, 0); inputMaskLayout->addWidget(inputMaskComboBox, 0, 1); inputMaskLayout->addWidget(inputMaskLineEdit, 1, 0, 1, 2); inputMaskGroup->setLayout(inputMaskLayout); QGridLayout *accessLayout = new QGridLayout; accessLayout->addWidget(accessLabel, 0, 0); accessLayout->addWidget(accessComboBox, 0, 1); accessLayout->addWidget(accessLineEdit, 1, 0, 1, 2); accessGroup->setLayout(accessLayout);

最后我们将每个组框放置在Window对象的网格布局中,并设置窗口标题:

QGridLayout *layout = new QGridLayout; layout->addWidget(echoGroup, 0, 0); layout->addWidget(validatorGroup, 1, 0); layout->addWidget(alignmentGroup, 2, 0); layout->addWidget(inputMaskGroup, 0, 1); layout->addWidget(accessGroup, 1, 1); setLayout(layout); setWindowTitle(tr("Line Edits")); }

槽响应用户更改组合框时发出的信号。

当Echo分组框的组合框被改变时,echoChanged()槽被调用:

void Window::echoChanged(int index) { switch (index) { case 0: echoLineEdit->setEchoMode(QLineEdit::Normal); break; case 1: echoLineEdit->setEchoMode(QLineEdit::Password); break; case 2: echoLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit); break; case 3: echoLineEdit->setEchoMode(QLineEdit::NoEcho); break; } }

槽更新同一分组框中的行编辑,来使用与分组合框中描述的条目对应的回显模式。

当Validator分组框的组合框被改变时,validatorChanged()槽被调用:

void Window::validatorChanged(int index) { switch (index) { case 0: validatorLineEdit->setValidator(nullptr); break; case 1: validatorLineEdit->setValidator(new QIntValidator( validatorLineEdit)); break; case 2: validatorLineEdit->setValidator(new QDoubleValidator(-999.0, 999.0, 2, validatorLineEdit)); break; } validatorLineEdit->clear(); }

槽或者为要使用的行编辑创建一个新的验证器,或者通过调用带有零指针的QLineEdit::setValidator()来删除正在使用的验证器。在本例中,我们清除了行编辑,以确保最初为新的验证器提供了有效的输入。

当对齐分组框的组合框被改变时,alignmentChanged()槽被调用:

void Window::alignmentChanged(int index) { switch (index) { case 0: alignmentLineEdit->setAlignment(Qt::AlignLeft); break; case 1: alignmentLineEdit->setAlignment(Qt::AlignCenter); break; case 2: alignmentLineEdit->setAlignment(Qt::AlignRight); break; } }

这会改变文本在行编辑器中的显示方式,使其与组合框中选择的描述相对应。

inputMaskChanged()插槽处理输入掩码分组框中组合框的更改:

void Window::inputMaskChanged(int index) { switch (index) { case 0: inputMaskLineEdit->setInputMask(""); break; case 1: inputMaskLineEdit->setInputMask("+99 99 99 99 99;_"); break; case 2: inputMaskLineEdit->setInputMask("0000-00-00"); inputMaskLineEdit->setText("00000000"); inputMaskLineEdit->setCursorPosition(0); break; case 3: inputMaskLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#"); break; } }

相关组合框中的每个条目都与一个输入掩码相关联,我们通过使用合适的字符串调用QLineEdit::setInputMask()函数来设置一个新的掩码;如果使用空字符串,则禁用掩码。

accessChanged()槽处理Access分组框中组合框的更改:

void Window::accessChanged(int index) { switch (index) { case 0: accessLineEdit->setReadOnly(false); break; case 1: accessLineEdit->setReadOnly(true); break; } }

这里,我们简单地将分组合框中的False和True条目与传递给QLineEdit::setReadOnly()的False和True值关联起来,这允许用户启用和禁用对行编辑的输入。

http://www.jsqmd.com/news/1212438/

相关文章:

  • SweetAlert2-React-Content:如何在SweetAlert2中无缝集成React元素的终极指南
  • UniLab入门指南:如何快速搭建机器人强化学习环境
  • bat脚本xcopy取消提示 “是文件名还是目录名”
  • RL4CO模型部署指南:从训练到生产环境的完整流程
  • LeetCode算法模板宝典:滑动窗口与双指针的终极解法
  • npm命令
  • 百达翡丽全国腕表官方售后服务中心|原厂配件更换网点完整披露(2026 年 7 月最新) - 百达翡丽中国服务中心
  • 解锁AI编程新境界:24个生产级工程技能让代码质量飙升
  • 嵌入式面试核心技巧:从基础到项目深挖的避坑指南
  • GPT-5.6技术解析:多代理并行与程序化工具调用的AI新突破
  • Gaea MySQL代理中间件:如何快速构建高性能数据库架构的终极指南
  • 劳力士沈阳官方售后服务中心|官方网站权威指南(2026年7月最新) - 劳力士中国服务中心
  • 【AI大模型】量化技术:4bit/8bit量化的原理与效果解读
  • 终极手机号码定位查询系统:3分钟快速查询归属地位置指南
  • Go+Echo+Vue技术栈实战:blog45/blog架构设计与实现指南
  • 唐山2026装修市场现状与工期痛点解析 - 装企自媒体训练营辉哥
  • 知微传感Dkam系列3D相机PCL应用篇:PCL读入3D相机含颜色的点云并显示
  • NCMDump实用指南:3种方法轻松解锁网易云音乐加密文件
  • React Native Tabs与react-native-router-flux集成教程:打造流畅导航体验
  • Go语言端口复用终极指南:如何用cmux在单端口运行多个服务
  • RT-Thread PIN设备驱动开发与GPIO控制实践
  • TM4C123 PWM寄存器深度解析:从原理到电机控制实战
  • 3分钟极速指南:用ncmdump免费解锁网易云NCM加密音乐
  • 苹果起诉 OpenAI 窃取商业机密,约 40 名员工被要求与律师会面并保留记录
  • MEV-template-rs错误处理与监控:构建稳定运行的MEV机器人系统
  • 四川仪表工业学校2026年招生简章:四十余年公办名校,技能成才的首选之地 - 学习招生
  • Verb实战案例:用Emacs构建完整的RESTful API测试工作流
  • JarkViewer:面向未来的高效图像查看器终极指南
  • cann/asc-devkit SIMT half精度转换函数
  • 如何用Win Application Framework (WAF)构建企业级应用:BookLibrary示例架构解析