Qt 常用控件 - 7
Text Edit(多行输入框)
QTextEdit
表示多行输入框,也是一个富文本 & markdown 编辑器,能在内容超出范围时自动提供滚动条。
QTextEdit:不仅仅能表示纯文本,还可以表示 htnl 和 markdown
QPlainTextEdit:只能表示纯文本
核心属性
属性 | 说明 |
---|---|
markdown | 支持 Markdown 格式并自动渲染为 HTML。 |
html | 支持大部分 HTML 标签(如 img 、table )。 |
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.执行程序,观察结果
可以看到:
编写内容时,
textChanged
和cursorPositionChanged
会触发选中一段文本时,
cursorPositionChanged
、selectionChanged
、copyAvailable
会触发按下
Ctrl + Z
时,textChanged
、undoAvailable
、redoAvailable
、cursorPositionChanged
会触发按下
Ctrl + Y
时,textChanged
、undoAvailable
、redoAvailable
、cursorPositionChanged
会触发
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 时有效)。
代码示例:麦当劳点餐
界面:三个下拉框(汉堡、小食、饮料)和一个按钮。
初始化:
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("雪碧"); }
按钮槽函数:
void Widget::on_pushButton_clicked() {qDebug()<<ui->comboBox->currentText()<<", "<<ui->comboBox_2->currentText()<<", "<<ui->comboBox_3->currentText(); }
执⾏程序, 可以看到, 在点击确定按钮时, 就能获取到当前下拉框中选中的内容:
我们也可以通过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();
}
执行程序, 可以看到当用户选择不同的内容时, 点击按钮就能获取到对应的结果. 同时我们也无法输入一些超出范围的非法值。