QComboBox 类是 QWidget 类的直接子类,该类实现了一个组合框
一、QComboBox 类中的 属性
QComboBOx 类(组合框)属性速查表 | |||
属性名 | 说明 | 属性名 | 说明 |
count | 获取项目数量 | minimumContentsLength | 组合框中最少字符数 |
maxCount | 允许的最大项数 | maxVisibleItems | 向用户显示的最大项目数 |
editable | 是否可被编辑 | sizeAdjustPolicy | 组合框大小变更策略 |
currentIndex | 当前项目的索引 | insertPolicy | 插入新项目时在组合框中的 位置策略 |
currentText | 当前项目的文本 | duplicatesEnabled | 内容是否可重复 |
iconSize | 组合框中图标的大小 | modelColumn | 模型中可见的列 |
frame | 是否绘制默认边框 | currentData | 当前项目的数据 |
①、 count: const int
访问函数: int count() const;
获取组合框中的项目数量,默认情况下,对于空组合框或未设置当前项目的组合框,
其值为 0。
②、 maxCount: int
访问函数: int maxCount() const; void setMaxCount(int);
此属性描述组合框允许的最大项数,若设置的最大数小于组合框中当前的项目数量,
则额外的项目会被截断。默认值为可使用的最高带符号整数(通常为 2147483647)。
③、 maxVisibleItems: int
访问函数: int maxVisibleItems() const; void setMaxVisibleItems(int);
此属性描述组合框在屏幕上向用户显示的项目数量(即可见项目数)
④、 minimumContentsLength: int
访问函数: int minimumContentsLength() const; void setMinimumContentsLength(int);
此属性描述,组合框项目的最少字符数量(见下图),若此属性为正值,则
minimumSizeHint()和 sizeHint()会被考虑在内,默认为 0。
⑤、 sizeAdjustPolicy: SizeAdjustPolicy
访问函数: SizeAdjustPolicy sizeAdjustPolicy() const;
void setSizeAdjustPolicy(SizeAdjustPolicy);
此属性描述,当组合框的内容更改时,其组合框的大小如何更改。默认值为
AdjustToContentsOnFirstShow。注意, 当 editable 被启用时, 此属性需位于 editable
属性之前,否则该属性可能不起作用。
SizeAdjustPolicy 是 QComboBox 类中的枚举,用于描述组合框的大小更改策略,
其成员如下
QComboBox::SizeAdjustPolicy 枚举(无标志) | ||
成员 | 值 | 说明 |
QComboBox::AdjustToContents | 0 | 根据内容调整(见下图) |
QComboBox::AdjustToContentsOnFirstShow(默认值) | 1 | 第一次显示时,根据内容调整 |
QComboBox::AdjustToMinimumContentsLength | 2 | 使 用 AdjustToContents 或 AdjustToContentsOnFirstShow 代替 |
QComboBox::AdjustToMinimumContentsLengthWithIcon | 3 | 调整为 minimumContentsLength 属 性的大小加上图标的空间。 |
⑥、 insertPolicy: InsertPolicy
访问函数: InsertPolicy insertPolicy() const; void setInsertPolicy(InsertPolicy);
此属性描述插入新项目时应该出现在组合框中的位置,默认是 InsertAtBottom(新项目
插入到底部),其中 InsertPolicy 是 QComboBox 类中的枚举,该枚举用于描述插入项
目的位置,其成员见下表。
QComboBox::InsertPolicy 枚举(无标志) | ||
成员 | 值 | 说明 |
QComboBox::NoInsert | 0 | 字符串不会插入到组合框中 |
QComboBox::InsertAtTop | 1 | 字符串插入组合框中的第一项 |
QComboBox::InsertAtCurrent | 2 | 使用字符串替换掉当前项目 |
QComboBox::InsertAtBottom | 3 | 字符串插入到组合框的最后一项之后(默认值) |
QComboBox::InsertAfterCurrent | 4 | 字符串插入到组合框的当前项目之后 |
QComboBox::InsertBeforeCurrent | 5 | 字符串插入到组合框的当前项目之前 |
QComboBox::InsertAlphabetically | 6 | 字符串按字母顺序插入到组合框中。 |
⑦、 editable: bool
访问函数: bool isEditable() const; void setEditable(bool);
此属性描述,组合框是否可由用户编辑,默认为 fasle。
注意:当禁用该属性时,将删除 validator 和 completer。
⑧、 duplicatesEnabled: bool
访问函数: bool duplicatesEnabled() const; void setDuplicatesEnabled(bool);
此属性描述,用户是否可把重复项目输入到组合框中,注意:以编程的方式总是可以
插入重复项目到组合框中。默认为 false(不允许重复)
⑨、 currentData: const QVariant //qt5.2
访问函数: QVariant currentData(int role = Qt::UserRole) const;
保存当前项目的数据,对于空组合框或未设置当前项目的组合框,默认情况下,此属
性为无效的 QVariant。
⑩、 currentIndex: int
访问函数: int currentIndex() const; void setCurrentIndex(int);
信号: currentIndexChanged(int); void currentIndexChanged(const QString&);
此属性描述组合框当前项目的索引(从 0 开始),插入或删除时,索引可能会改变,对
于空组合框或未设置当前项目的组合框,默认情况下,此属性的值为-1。
⑪、 currentText: QString
访问函数: QString currentText() const; void setCurrentText(const QString&);
信号: void currentTextChanged(const QString&);
此属性描述当前的文本, 注意:设置函数 setCurrentText()并不能把新文本添加到
组合框中,该函数仅能使组合框显示该文本。
此属性的 setTextCurrentText()仅在组合框可编辑时才会起作用。
若组合框是可编辑的,则 currentText 是编辑时显示的文本,
若组合框为空或未设置当前项目的组合框,则为当前项目的值或空字符串。
若组合框是可编辑的,则设置函数 setCurrentText()只需调用 setEditText()函数。
⑫、 iconSize: QSize
访问函数: QSize iconSize() const; void setIconSize(const QSize&);
此属性描述组合框中显示的图标的大小。默认值是图标可以拥有的最大大小,较小尺
寸的图标不会被放大。
⑬、 frame: bool
访问函数: bool hasFrame() const; void setFrame(bool);
此属性描述组合框是否绘制默认的边框,默认为 true(启用)
⑭、 modelColumn: int
访问函数: int modelColumn() const; void setModelColumn(int);
此属性描述,模型中可见的列,若此属性设置于填充组合框的内容之前,则弹出的视
图不会受到影响,并且会显示第 1 列(默认值)。默认为 0
QComboBox(组合框)的属性 示例:(创建QT项目+ 添加core;gui;widgets )
//m.h 文件内容
#ifndef M_H
#define M_H
#include<QtWidgets>
#include <iostream>
using namespace std;
class B:public QComboBox{
Q_OBJECT
public: B(QWidget* p=0):QComboBox(p){}
public slots:
void f(){ cout<<currentIndex()<<endl; //获取当前项目的索引
cout<<currentText().toStdString()<<endl; //获取当前项目的文本
}
void f1(){setCurrentText("EEE"); }//将 EEE 显示在组合框中,但不会添加到组合框中
};
#endif // M_H
//m.cpp 文件的内容
#include "m.h"
int main(int argc, char *argv[]){
QApplication a(argc,argv);
QWidget w;
QPushButton *b=new QPushButton("cout",&w); b->move(22,22);
QPushButton *b1=new QPushButton("currentText",&w); b1->move(99,22);
//创建组合框对象
B *pc1=new B(&w); pc1->move(55,55);
//向组合框中添加内容
pc1->insertItem(1,"AAA"); pc1->insertItem(2,"BBB"); pc1->insertItem(4,"CCC");
QObject::connect(b, &QPushButton::clicked, pc1, &B::f); //连接信号与槽
QObject::connect(b1, &QPushButton::clicked, pc1, &B::f1);
pc1->setSizeAdjustPolicy(QComboBox::AdjustToContents); //根据内容自动调整组合框大小
pc1->setCurrentIndex(1); //设置当前项目的索引为 1, 初始显示时会显示索引为 1 的项目。
pc1->setDuplicatesEnabled(true); //可向组合框中添加重复的内容。
pc1->setEditable(1); //使组合框可编辑
pc1->setInsertPolicy(QComboBox::InsertAtCurrent);//插入的内容替换当前项目
w.resize(300,200); w.show();
return a.exec();
}
二、QComboBox 类中的成员函数
①、 QComboBox(QWidget* parent = Q_NULLPTR); //构造函数
②、 void addItem(const QString &text, const QVariant& userData = QVariant());
void addItem(const QIcon &icon , const QString &text, const QVariant& userData = QVariant());
void addItems(const QStringList &texts); //注意,该函数后面的字母 s
以上函数用于向组合框中添加内容,其中 userData(暂时不需要理解此参数)存储于
Qt::UserRole 中。
③、 void setItemText(int index, const QString &text);
QString itemText(int index) const;
以上函数分别表示,把索引为 index 处的项目设置为 text (可用于修改项目),和获取
索引为 index 处的文本。 索引是从 0 开始的。
④、 void setItemIcon(int index, const QIcon &icon);
QIcon itemIcon(int index) const;
以上函数分别表示,把索引为 index 处的项目的图标设置为 icon,和获取索引为 index
处的图标。索引是从 0 开始的。
⑤、 void insertItem(int index, const QString &text, const QVariant &userData = QVariant());
void insertItem(int index, const QIcon &icon , const QString &text,
const QVariant &userData = QVariant());
void insertItems(int index, const QStringList &list); //注意最后的字母 s
以上函数用于向组合框中插入内容,若指定的索引大于或等于项目总数,则新项目被
追加到项目的末尾,若索引为 0 或负数,则新项目被添加到现有项目的前面。
⑥、 void removeItem(int index);
删除指定索引处的项目,若索引被删除,将更新当前索引,若索引超出范围,则此函
数不执行任何操作。
⑦、 void clear() //槽, 清除组合框中的所有项目
⑧、 void insertSeparator(int index);
在索引 index 处插入分隔器,若指定的索引大于或等于项目总数,则新项目被追加
到项目的末尾,若索引为 0 或负数,则新项目被添加到现有项目的前面。 注:插入
的分隔器在视觉上可能不会很明显的看得出来。
⑨、 void setLineEdit(QLineEdit* edit);
设置组合框的文本编辑部件为 edit,设置该项之后,组合框会成为可编辑的。
⑩、 QLineEdit* lineEidt() const;
返回组合框中的行编辑器,若没有,则返回 0。只有可编辑的组合框才会行编辑器。
⑪、 void setEditText(const QString &text); //槽
将组合框的文本设置为 text, 此函数不能把新文本添加到组合框中,仅能使组合框
显示该文本。组合框是可编辑的状态时,该函数才会起作用。该函数与 currentText
属性的设置函数 setCurrentText()类似。
void clearEditText() //槽
此函数用于清除 setEditText()函数设置的文本,也可用于清除正在编辑的文本。
⑫、 virtual void showPopup(); //虚函数
virtual void hidePopup() //虚函数
以上函数用于显示或隐藏项目列表。
⑬、 int findText(const QString &text , Qt::MatchFlags flags = static_cast<Qt::MatchFlags>
( Qt::MatchExactly | Qt::MatchCaseSensitive)) const;
查找text所在项目的索引。其中Qt::MatchFlag枚举是用于描述查找时的匹配方式的,
Qt::MatchFlags 是该枚举的标志,此处默认的区配方式是执行基于 QVariant 的匹配,
且搜索时区分大小写。详细内容请参阅“部件公用枚举”章节。
⑭、
const QValidator* validator() const; void setValidator( const QValidator* validator);
以上函数用于设置和获取 QValidator(验证器)的,验证器用于对输入的文本进行验证,
也就是说可以使用该类来限制用户的输入(比如只能输入数字等)。 QValidator 类会在
后文讲解。 验证器需组合框在可编辑状态下。
QComboBox(组合框)内容的添加、设置、插入、移除、清除、查找 示例:
//1、m.h 文件的内容
#ifndef M_H
#define M_H
#include<QtWidgets>
#include <iostream>
using namespace std;
//注:使用以下方式组织程序可以方便信号和槽的关联
class B :public QWidget {
Q_OBJECT
public: //创建部件
QPushButton *b; QPushButton *b1; QPushButton *b2; QPushButton *b3;
QPushButton *b4; QPushButton *b5; QPushButton *b6; QComboBox *pc1; QLineEdit *pe;
B(QWidget* p = 0) :QWidget(p) { //构造函数开始
//创建和布局部件
b = new QPushButton("add", this); b1 = new QPushButton("set", this);
b2 = new QPushButton("insert", this); b3 = new QPushButton("remove", this);
b4 = new QPushButton("clear", this); b5 = new QPushButton("show", this);
b6 = new QPushButton("find", this);
b->move(22, 22); b1->move(22, 44); b2->move(22, 66); b3->move(22, 88);
b4->move(22, 111); b5->move(22, 133); b6->move(22, 155);
pc1 = new QComboBox(this); pc1->move(111, 77);
pe = new QLineEdit("XXXX", this); pe->move(111, 44);
pc1->setSizeAdjustPolicy(QComboBox::AdjustToContents); //组合框根据内容自动调整大小
//向组合框 pc1 中添加文本
QStringList s;
s.append("AAA"); s.append("BBB"); s.append("CCC"); s.append("DDD");
pc1->addItems(s);
//连接信号与槽
QObject::connect(b, &QPushButton::clicked, this, &B::addf);
QObject::connect(b1, &QPushButton::clicked, this, &B::setf);
QObject::connect(b2, &QPushButton::clicked, this, &B::insertf);
QObject::connect(b3, &QPushButton::clicked, this, &B::removef);
QObject::connect(b4, &QPushButton::clicked, pc1, &QComboBox::clear);
QObject::connect(b5, &QPushButton::clicked, this, &B::showf);
QObject::connect(b6, &QPushButton::clicked, this, &B::findf);
} //构造函数结束
public slots:
void addf() { QString s = pe->text(); pc1->addItem(s); } //在末尾添加文本 s
void setf() {
QString s = pe->text();
int i = pc1->currentIndex();
pc1->setItemText(i, s);
}//把当前索引号处的文本设置为 s
void insertf() {
QString s = pe->text();
int i = pc1->currentIndex();
pc1->insertItem(i, s);
}//在当前索引号处插入文本 s
void removef() { int i = pc1->currentIndex(); pc1->removeItem(i); }//移除当前索引号处的文本
void showf() { pc1->showPopup(); }
void findf() {
QString s = pe->text();
//执行模糊搜索且区分大小写
cout << pc1->findText(s, Qt::MatchContains | Qt::MatchCaseSensitive) << endl;
}
};
#endif // M_H
//2、m.cpp 文件的内容
#include "Header.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
B mb; mb.resize(300, 200); mb.show();
return a.exec();
}
三、QComboBox 类中的信号
①、 void activated(int index); void activated(const QString &text); //信号
当用户在组合框中选中一个项目时,发送以上信号,其中 index 是被选中项目的
索引, text 是被选中项目的文本。
注意:即使选择未改变(即两次都选择相同的项目),也会发送以上信号。
注意:在组合中展开的下接列表中仅仅移动加亮条并不会使项目被选中,选择项
目后需点击鼠标或按下 enter 键才会使项目选中。也可在组合框获得焦点时,下
拉列表处于隐藏状态下,使用键盘上的上/下方向键选中组合框中的项目。
②、 void currentIndexChanged(int index); //currentIndex 属性改变时发送
void currentIndexChanged(const QString &text); //currentIndex 属性改变时发送
void currentTextChanged(const QString &text); //currentText 属性改变时发送
当组合框中的 currentIndex 或 currentText 属性通过用户或编程的方式被改变时,
就会发送以上信号。其中 index 是被改变后的项目的索引, text 是被改变后的项目
的文本。
注意: 以上信号发送的条件是 currentIndex 或 currentText 属性改变, 下面是其改
变的时机
在选中不同的项目后这两个属性都会产生改变,也就是说在组合框展开的下
接列表中仅仅移动加亮条并不会使这两个属性改变,需要使项目被选中(使用
鼠标点击或按下 enter 键)且不能选择与之前相同的项目时, currentIndex 或
currentText 属性才会改变。
当组合框在可编辑状态下时,在组合框中改变文本的内容时, currentText 属
性会改变,但 currentIndex 属性不会改变。
④、 void editTextChanged(const QString &text); //信号
当组合框的行编辑器部件中的文本被更改时,发送此信号。 text 是改变后的新文本。
文本更改的时机,与 currentText 属性改变的时机相同,详见 currentTextChanged 信号。
⑤、 void highlighted(int index); //信号
void highlighted(const QString &text); //信号
当在组合框展开的下接列表中改变加亮条时,发送以上信号。
⑥、以上信号发送时机的测试,读者可自行编写程序验证。