Roson讲Qt #5 QComboBox
1.什么是QComboBox
QComboBox小部件是一个组合按钮和弹出列表。
QComboBox提供了一种向用户显示选项列表的方式,这种方式占用的屏幕空间最小。
组合框是一个选择小部件,可以显示当前项,并弹出可选项列表。组合框可以是可编辑的,允许用户修改列表中的每个项目。
组合框可以包含像素映射,也可以包含字符串;适当重载insertItem()和setItemText()函数。对于可编辑的组合框,提供了函数cleararEditText()来清除显示的字符串,而不改变组合框的内容。
如果组合框的当前项发生变化,会发出两个信号currentIndexChanged()和activated()。无论更改是通过编程方式还是通过用户交互完成的,currentIndexChanged()总是被触发,而activate()仅在更改是由用户交互引起的时候才被触发。当用户突出显示组合框弹出列表中的一个项目时,就会发出highlighted()信号。这三个信号都有两个版本,一个带有QString参数,另一个带有int参数。如果用户选择或高亮一个像素映射,则只发出int信号。每当可编辑组合框的文本发生更改时,就会发出editTextChanged()信号。
当用户在一个可编辑的组合框中输入一个新字符串时,小部件可以插入它,也可以不插入它,它可以将它插入多个位置。默认的策略是InsertAtBottom,但是您可以使用setInsertPolicy()来更改它。
可以使用QValidator将输入约束为可编辑的组合框;看到setValidator()。默认情况下,接受任何输入。
可以使用插入函数来填充组合框,例如insertItem()和insertItems()。项目可以使用setItemText()进行更改。可以使用removeItem()删除一个项目,也可以使用clear()删除所有项目。当前项的文本由currentText()返回,编号项的文本由text()返回。当前项可以通过setCurrentIndex()设置。组合框中的项目数量由count()返回;可以使用setMaxCount()设置的最大项目数。可以使用setEditable()进行编辑。对于可编辑的组合框,您可以使用setCompleter()设置自动完成,并且使用setDuplicatesEnabled()设置用户是否可以添加副本。
QComboBox使用模型/视图框架作为它的弹出列表,并存储它的项目。默认情况下,QStandardItemModel存储项目,QListView子类显示弹出窗口。你可以直接访问模型和视图(使用model()和view()),但是QComboBox也提供了设置和获取项目数据的函数(例如,setItemData()和itemText())。您还可以设置一个新的模型和视图(使用setModel()和setView())。对于组合框标签中的文本和图标,使用具有Qt::DisplayRole和Qt::DecorationRole的模型中的数据。注意,你不能改变视图()的SelectionMode,例如,使用setSelectionMode()。
2.QComboBox使用
2.1 添加项
ui.comboBox->addItem("Item1");
ui.comboBox->addItem("Item2");
ui.comboBox->addItem("Item3");
ui.comboBox->addItem("Item4");
2.2一次性添加多个项
QStringList strList;
strList << "Item5" << "Item6" << "Item7";
ui.comboBox->addItems(strList);
2.3添加图标
先通过资源编辑器把图标添加到资源文件:
ui.comboBox->addItem(QIcon(":/QtWidgetsApplication8/test1.ico"), "item1");
ui.comboBox->addItem(QIcon(":/QtWidgetsApplication8/test2.ico"), "item2");
ui.comboBox->addItem(QIcon(":/QtWidgetsApplication8/test3.ico"), "item3");
2.4删除某一项
ui.comboBox->removeItem(0);
2.5删除所有项
ui.comboBox->clear();
2.6设置字体
ui.comboBox->setFont(QFont("宋体",20));
2.7获取当前选中行的下标
int index = ui.comboBox->currentIndex();
2.8获取当前选中的文本
QString strTxt = ui.comboBox->currentText();
2.9获取项数
int iCount = ui.comboBox->count();
2.10设置是否可编辑
ui.comboBox->setEditable(true);
2.11处理选项变化事件currentIndexChanged()
无论更改是通过编程方式还是通过用户交互完成的,currentIndexChanged()总是被触发。
注意:
Qt以前的版本可以这么写:
connect(ui.comboBox,SIGNAL(currentIndexChanged(const QString &text))
,this,SLOT(OnCurrentIndexChanged(const QString &text)));
但是我用的Qt5.9,用上面这种写法,无法捕获这个信号,根据官方文档的描述,需要像下面这样写:
connect(ui.comboBox, static_cast<void(QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged),
[=](const QString &text)
{
qDebug() << "选中的文本是" << text; }
);
2.12处理激活事件activated()
如果组合框的当前项发生变化,会发出信号activated(),仅在更改是由用户交互引起的时候才被触发。
connect(ui.comboBox, static_cast<void(QComboBox::*)(const QString &)>(&QComboBox::activated),
[=](const QString &text)
{
qDebug() << "选中的文本是" << text; }
);
2.13处理编辑事件
需要先设置为可编辑状态。
connect(ui.comboBox, static_cast<void(QComboBox::*)(const QString &)>(&QComboBox::editTextChanged),
[=](const QString &text)
{
qDebug() << "编辑框中的文本是" << text; }
);
还没有评论,来说两句吧...