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

Qt 常用控件 - 7

Text Edit(多行输入框)

QTextEdit 表示多行输入框,也是一个富文本 & markdown 编辑器,能在内容超出范围时自动提供滚动条。

QTextEdit:不仅仅能表示纯文本,还可以表示 htnl 和 markdown

QPlainTextEdit:只能表示纯文本

核心属性
属性说明
markdown支持 Markdown 格式并自动渲染为 HTML。
html支持大部分 HTML 标签(如 imgtable)。
placeHolderText输入框为空时的提示文本。
readOnly是否只读。
undoRedoEnable启用撤销/重做(Ctrl+Z 撤销,Ctrl+Y 重做)。
autoFormatting开启自动格式化。
tabStopWidth缩进占用的空格数。
overwriteMode是否开启覆盖写模式。(光标接下来是否插入或者覆盖?)
acceptRichText是否接收富文本内容 --- html 标签。
verticalScrollBarPolicy垂直滚动条策略:
• Qt::ScrollBarAsNeeded(默认)根据内容自动决定是否需要滚动条
• Qt::ScrollBarAlwaysOff 总是关闭滚动条
• Qt::ScrollBarAlwaysOn 总是显示滚动条
horizontalScrollBarPolicy水平滚动条策略:
• Qt::ScrollBarAsNeeded(默认)根据内容自动决定是否需要滚动条
• Qt::ScrollBarAlwaysOff 总是关闭滚动条
• Qt::ScrollBarAlwaysOn 总是显示滚动条
核心信号
  • textChanged():文本内容改变时触发。

  • selectionChanged():选中范围改变时触发。

  • cursorPositionChanged():光标移动时触发。

  • undoAvailable(bool):可撤销时触发。

  • redoAvailable(bool):可重做时触发。

  • copyAvailable(bool):文本选中/取消选中时触发。

代码示例:获取输入框内容

1.界面:创建一个多行输入框和一个 label

2.槽函数给多⾏输⼊框添加 slot 函数. 处理 textChanged 信号

  • 通过 toPlainText ⽅法获取到内部的⽂本。  
  • 类似的,QTextEdit 还提供了 toMarkdown 和 toHtml。根据需要我们调整不同的获取⽅式。
void Widget::on_textEdit_textChanged()
{// 获取到多行输入框中的内容const QString& text = ui->textEdit->toPlainText();// 和之前的Text()不太一样!ui->label->setText(text);
}

3.效果:输入框内容变化时,label 同步更新。

代码示例:验证信号

1.创建多行输入框

2.给输入框添加以下几个 slot 函数

QTextEdit 中包含了一个 QTextCursor 对象,通过这个对象可以获取到当前光标位置和选中的内容

void Widget::on_textEdit_textChanged()
{qDebug()<<"textChanged: "<<ui->textEdit->toPlainText();
}void Widget::on_textEdit_selectionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();qDebug()<<"selectionChanged: "<<cursor.selectedText();
}void Widget::on_textEdit_cursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();qDebug()<<"cursorPositionChanged: "<<cursor.position();
}void Widget::on_textEdit_undoAvailable(bool b)
{qDebug()<<"undoAvailable: "<<b;
}void Widget::on_textEdit_redoAvailable(bool b)
{qDebug()<<"redoAvailable: "<<b;
}void Widget::on_textEdit_copyAvailable(bool b)
{qDebug()<<"copyAvailable: "<<b;
}

3.执行程序,观察结果

可以看到:

  1. 编写内容时,textChanged 和 cursorPositionChanged 会触发

  2. 选中一段文本时,cursorPositionChangedselectionChangedcopyAvailable 会触发

  3. 按下 Ctrl + Z 时,textChangedundoAvailableredoAvailablecursorPositionChanged 会触发

  4. 按下 Ctrl + Y 时,textChangedundoAvailableredoAvailablecursorPositionChanged 会触发


Combo Box(组合框/下拉框)

QComboBox 表示下拉框。

核心属性
属性说明
currentText当前选中文本。
currentIndex当前选中下标(从 0 开始,未选中时为 -1)。
editable是否允许编辑(设为 true 时行为类似 QLineEdit)。
iconSize下拉图标大小。(下拉点击的图标(倒三角))
maxCount最大条目数。
核心方法
方法说明
addlitem(const QString&)添加一个条目
currentindex()获取当前条目的下标,从0开始计算;如果当前没有条目被选中,值为-1
currentText()获取当前条目的文本内容
核心信号
  • activated(int):用户选择选项时触发(这时候相当于用户点开下拉框,并且鼠标滑过某个选项,此时还没有确认做出选择)。

  • currentIndexChanged(int)/currentIndexChanged(const QString& text):选项改变时触发(此时用户已经明确的选择一个选项,用户操作或者通过程序操作都会出发这个信号)。

  • editTextChanged(const QString&):可编辑时文本变化触发(editable 为 true 时有效)。

代码示例:麦当劳点餐
  1. 界面:三个下拉框(汉堡、小食、饮料)和一个按钮。

  2. 初始化

    Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
    {ui->setupUi(this);ui->comboBox->addItem("麦辣鸡腿堡");ui->comboBox->addItem("巨无霸");ui->comboBox->addItem("培根蔬菜双层牛堡");ui->comboBox_2->addItem("中薯条");ui->comboBox_2->addItem("麦乐鸡块");ui->comboBox_2->addItem("麦辣鸡翅");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("雪碧");
    }
  3. 按钮槽函数

    void Widget::on_pushButton_clicked()
    {qDebug()<<ui->comboBox->currentText()<<", "<<ui->comboBox_2->currentText()<<", "<<ui->comboBox_3->currentText();
    }
  4. 执⾏程序, 可以看到, 在点击确定按钮时, 就能获取到当前下拉框中选中的内容:

我们也可以通过ui界面进行编辑:

代码示例:从文件加载下拉框的选项

很多时候下拉框的选项并非是固定的,而是通过读取文件/读取网络获取得到的!(选课的时候,加载出所可选的选项!每年都不同)

1.在界面上创建一个下拉框

2.创建文件 d:/for_test/config.txt,编写选项,每个选项占一行

火灵儿 - 出自《完美世界》。
李慕婉 - 出自《仙逆》。
陆雪琪 - 出自《诛仙》。
焰灵姬 - 出自《天行九歌》。
赤练 - 出自《秦时明月》。
少司命 - 出自《秦时明月》。
仙清儿 - 出自动漫《牧神记》。
灵毓秀 - 出自《牧神记》动画。
云霄 - 出自动漫《师兄啊师兄》。
唐雅 - 出自动漫《斗罗大陆2绝世唐门》。

3.修改 widget.cpp,读取文件

  • 使⽤ ifstream 打开⽂件
  • 使⽤ getline 读取每⼀⾏
  • 使⽤ QString::fromStdString 把 std::string 转成 QString
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 需要读取文件内容,把文件中的每一行读取出来,作为一个 Combobox 的选项// 读写IO --- I: 读(输入) --- 参考点是CPU!!!std::ifstream file("D:/for_test/config.txt");if(!file.is_open()){qDebug()<<"文件打开失败";return;}// 按行读取文本内容 --- getline 函数来完成!!!std::string line;while(std::getline(file, line)){// 取到每一行内容, 设置到下拉框中ui->comboBox->addItem(QString::fromStdString(line));}file.close();;// 关闭文件是很关键的,否则会造成文件资源泄漏!
}

4.执⾏程序, 可以看到⽂件内容已经被加载到下拉框中:


🎉 Qt 中也提供了 QFile 实现读写⽂件的功能。当然使⽤ C++ 标准库的 std::fstream 也是完全可以的。之所以存在两套,是因为 Qt 诞⽣较早 (1991 年左右),此时 C++ 还没有完成 "标准化" 的工作,C++ 标准库这样的概念⾃然也没有诞⽣。因此 Qt 就⾃⼰打造了⼀套库,实现了字符串,容器,⽂件操作,多线程,⽹络操作,定时器,正则表达式等内容。

(由于 C++ 标准委员会的不作为, ⾄今仍然有些 Qt 提供的功能, 是标准库不具备的)

Spin Box(微调框)

使用 QSpinBox 或者 QDoubleSpinBox 来创建“微调框”,它是带有按钮的输入框,可以用来输入整数/浮点数。通过点击按钮来修改数值大小。 由于 SpinBox 和 QDoubleSpinBox 用法基本相同,就只介绍 SpinBox 的使用了。

Spin 英文原意为“旋转”,此处引申成“微调”。 事实上很多术语在翻译的时候,不一定非要按照原始的翻译来表示,更追求的是“信达雅”。 举个例子,地铁上的 “Priority Seat” 会翻译成 “爱心专座”,而不是 “优先座位”。

核心属性
属性说明
value存储的数值。
singleStep每次调整的“步长”。按下一次按钮数据变化多少。
displayInteger数字的进制。例如 displayInteger 设为 10, 则是按照 10 进制表示。设为 2 进制表示。
minimum最小值
maximum最大值
suffix后缀
prefix前缀
wrapping是否允许换行
frame是否带边框
alignment文字对齐方式
readOnly是否允许修改
buttonSymbol按钮上的图标。
- UpDownArrows 上下箭头形式
- PlusMinus 加减号形式
- NoButtons 没有按钮
accelerated (加速的)按下按钮时是否为快速调整模式。
correctionMode输入有误时如何修正。
- QAbstractSpinBox::CorrectToPreviousValue : 如果用户输入了一个无效的值(例如,在只能显示正整数的SpinBox中输入了负数),那么SpinBox会恢复为上一个有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),然后SpinBox会恢复为1。
- QAbstractSpinBox::CorrectToNearestValue : 如果用户输入了一个无效的值,SpinBox会恢复为最接近的有效值。例如,如果SpinBox的初始值是1,用户输入了-1(无效),那么SpinBox会恢复为0。
keyboardTracking是否开启键盘跟踪。
设为 true, 每次在输入框输入一个数字, 都会触发 valueChanged() 和 textChanged() 信号。
设为 false, 只有在最终按下 enter 或 者输入框失去焦点, 才会触发 valueChanged() 和 textChanged() 信号。
核心信号
信号说明
textChanged(QString)微调框的文本发生改变时会触发。参数 QString 带有前缀和后缀。
valueChanged(int)微调框的文本发生改变时会触发。参数 int, 表示当前的数值。
代码示例:调整麦当劳购物车中的份数。

在界面上创建下列内容

  • 三个下拉框:objectName 为 comboBox 到 spinBox_3

  • 三个微调框:objectName 为 spinBox 到 spinBox_3

  • 一个按钮:objectName 为 pushButton

编写代码,修改 widget.cpp, 给下拉框设置初始值。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 初始化下拉框菜单ui->comboBox->addItem("麦辣鸡腿堡");ui->comboBox->addItem("巨无霸");ui->comboBox->addItem("培根蔬菜双层牛堡");ui->comboBox_2->addItem("中薯条");ui->comboBox_2->addItem("麦乐鸡块");ui->comboBox_2->addItem("麦辣鸡翅");ui->comboBox_3->addItem("可乐");ui->comboBox_3->addItem("雪碧");// 初始化微调框// 默认一份ui->spinBox->setValue(1);// 针对 QSpinBox 的范围进行约束ui->spinBox->setRange(1, 5);ui->spinBox_2->setValue(1);ui->spinBox_2->setRange(1, 5);ui->spinBox_3->setValue(1);ui->spinBox_3->setRange(1, 5);
}

编写代码,给按钮添加 slot 函数

void Widget::on_pushButton_clicked()
{qDebug() << "当前下单的内容:"<< ui->comboBox->currentText() << ":" << ui->spinBox->value()<< ui->comboBox_2->currentText() << ":" << ui->spinBox_2->value()<< ui->comboBox_3->currentText() << ":" << ui->spinBox_3->value();
}

执行程序, 可以看到当用户选择不同的内容时, 点击按钮就能获取到对应的结果. 同时我们也无法输入一些超出范围的非法值。

http://www.dtcms.com/a/328370.html

相关文章:

  • 大数据与人工智能在保险行业中的应用:2025年精准理赔的优化
  • VirtualBox 虚拟机磁盘扩容完整手册
  • 深入理解二维数组创建与使用
  • Unity TextMeshPro(二)优化
  • Redis知识点+项目+面试八股
  • 深度解读 WizTelemetry 2.0:链路追踪如何让分布式系统“无所遁形”
  • spring-cloud整合nacos详细攻略
  • 《汇编语言:基于X86处理器》第13章 高级语言接口(2)
  • 无人机在环保监测中的应用:低空经济发展的智能监测与高效治理
  • 一体化步进伺服电机在无人机舱门应用中的应用案例
  • gpt-oss-120b 模型:笔记本上的智能“奇幻之旅”
  • 什么叫渲染效果图?啥是渲染图
  • 如何将 AGV 叉车成功集成到仓库自动化系统中?
  • 智能化评估体系:数据生产、在线化与自动化的三重奏
  • ​苹果应用高版本出现:“无法安装此app,因为无法验证其完整性”是怎么回事竟然是错误的
  • 【前端Vue】如何在log-viewer组件中添加搜索定位功能
  • 基于柔性管控终端的新能源汽车充电站有序充电系统设计与实现
  • PiaRef代码库结构梳理
  • Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用(394)
  • 关于Linux编程:fread/fwrite/流的定位/文件IO
  • C++右值引用学习笔记
  • wordpress获取菜单项的ID并输出
  • FPGA+护理:跨学科发展的探索(三)
  • 解锁大模型调优新姿势:LoRA微调全解析
  • 【算法】堆(Heap)的概念、懒删除(Lazy Deletion)与堆排序(Heap Sort)
  • 【实时Linux实战系列】复杂实时系统中的需求管理
  • Qt树形控件QTreeWidget详解:构建可编辑的多级课程结构
  • Nacos-2--Nacos1.x版本的通信原理
  • Web基础
  • 力扣47:全排列Ⅱ