Qt扫盲-QComboBox理论总结

时间:2022-12-15 08:57:14

1. 简述

QComboBox 提供了一种以占用最小屏幕空间的方式向用户显示选项列表的方法。QCombox是显示当前项目的选择小部件,可以弹出可选项目的列表。QComBox其实就是一个下拉列表。选择的项目内容就会显示在外面,其他项目会被隐藏,同时在下拉时之前选择的项目位置会被标记好,可以理解显示的项目其实是一个之前选择位置项目的副本。这个控件其实预制很很多选项给用户选择,减少手动输入的麻烦。当然哈,QComBox可以是可编辑的,允许用户修改列表中的每个项目。但是这个不会影响到预先设置项目。

就像下面这种用法,很多能预制的就不要手写啦
Qt扫盲-QComboBox理论总结

这篇博文主要是还是不是使用 model/view 版本的介绍哈。其实就是QComBox的基础简述。

2. 显示内容

QComBox可以包含像素图以及字符串;可以用 insertItem() 和 setItemText() 的相关重置函数来插入带图标的列表项
Qt扫盲-QComboBox理论总结

还可以设置QComBox 可以编辑。对于可编辑的QComBox,提供了函数 clearEditText(),用于清除显示的字符串而不更改QComBox的内容。(其实就是只是修改当前的显示内容,之前预制的项目还是不会被修改的呐)
Qt扫盲-QComboBox理论总结

3. 信号

如果QComBox的当前项发生变化,则发出两个信号,urrentIndexChanged() 和 activated()。无论更改是通过编程方式还是通过用户交互完成的,始终发出 currentIndexChanged(),而 active() 仅在更改由用户交互引起时发出。当用户突出显示QComBox弹出列表中的项目时,将发出 highlighted() 信号。所有三个信号都存在两个版本,一个带有QString参数,另一个带有int参数。如果用户选择或突出显示像素图,则仅发出 int 信号。每当可编辑QComBox的文本发生更改时,都会发出 editTextChanged() 信号。

QComBox的信号表

信号 含义
activated(int index) QComBox的当前项发生变化,仅在更改由用户交互引起时发出,说那个列表项位置被激活了
currentIndexChanged(const QString &text) combox位置发生后,发生的方式是通过编程方式、或通过用户交互都会触发,携带一个当前项的 text
currentIndexChanged(int index) combox位置发生后,发生的方式是通过编程方式、或通过用户交互都会触发,携带一个当前项的 index
currentTextChanged(const QString &text) 当选择项的文字和上一次选择项不同是,携带一个当前项的 text
editTextChanged(const QString &text) 每当可编辑QComBox的文本发生更改时
highlighted(int index) 就是下拉列表显示的时候,我们可以用 上 下键 移动那个选择的项目时发射这个信号。
textActivated(const QString &text) 这个没用过
textHighlighted(const QString &text) 这个没用过

4. 常用功能

当用户在可编辑QComBox中插入新项目(字符串)的时候,还是有一个插入的策略。默认策略是 InsertAtBottom,但您可以使用 setInsertPolicy() 更改此设置。

策略 含义
Constant Description
QComboBox::NoInsert 不会插入
QComboBox::InsertAtTop 顶部插入
QComboBox::InsertAtCurrent 当前项将被替换输入的新字符串
QComboBox::InsertAtBottom 后的字符串将被插入到QCombox中的最后一项。
QComboBox::InsertAfterCurrent 新的字符串插入当前项的后面
QComboBox::InsertBeforeCurrent 新的字符串插入当前项的前面
QComboBox::InsertAlphabetically 按照首字母顺序的插入字符串

可以使用 QValidator 将输入限制为可编辑的QComBox;参见 setValidator()。默认情况下,接受任何输入。

QComBox提供了很多好用的功能。

  • 可以使用插入单个、多个Item,例如 insertItem() 和 insertItems()
  • 可以使用 setItemText() 修改项目
  • 可以使用 removeItem() 删除项目
  • 可以使用 clear() 删除所有项目
  • 当前项的文本由 currentText() 返回,编号项的文本与 text() 一起返回
  • 可以使用 setCurrentIndex() 设置当前项
  • QComBox中的项目个数由 count() 返回
  • 可以使用 setMaxCount() 设置的最大项目数
  • 还可以用 setEditable() 是否可编辑 等等

对于可编辑的QComBox,您可以使用 setCompleter() 设置自动补全,就是输入一部分内容,就显示一个可能选择列表,等后面专门用 QCompleter 来完成

5. model/view 使用

QComboBox 使用模型/视图框架作为其弹出列表并存储其项目。默认情况下,QStandardItemModel 存储项目,QListView 子类显示弹出列表。这个我后面会把Model/View和这个连在一起重新梳理下

6. 槽函数

因为信号有些是重载的信号,在槽函数连接的时候就要指定一下是哪个信号,就用的QOverload 函数来指定的就好。
就行下面的 currentIndexChanged 信号在连接时候的使用。

connect(comboBox, QOverload<const QString &>::of(&QComboBox::currentIndexChanged),
      [=](const QString &text){ /* ... */ });
      
connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
      [=](int index){ /* ... */ });