输入部件 QComboBox --组合框/下拉列表

 QComboBox 类是 QWidget 类的直接子类,该类实现了一个组合框
一、QComboBox 类中的 属性

常用属性

void setItemIcon(int index, const QIcon &icon);  // 设置item的图标
void setIconSize(const QSize &size);             // 设置item的图标尺寸
// 设置item的用户数据
void setItemData(int index, const QVariant &value, int role = Qt::UserRole);
void setMaxCount(int max);                       // 设置item的允许最大数量
QString itemText(int index) const;               // 获取item的文本
QIcon itemIcon(int index) const;                 // 获取item的图标
QSize iconSize() const;                          // 获取item的图标尺寸
QVariant itemData(int index, int role = Qt::UserRole) const; // 获取item的用户数据
int count() const;                               // 获取item的数量
int maxCount() const;                            // 获取item的允许最大数量
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::AdjustToContents0根据内容调整(见下图)
QComboBox::AdjustToContentsOnFirstShow(默认值)1第一次显示时,根据内容调整
QComboBox::AdjustToMinimumContentsLength2使 用 AdjustToContents 或
AdjustToContentsOnFirstShow 代替
QComboBox::AdjustToMinimumContentsLengthWithIcon3调整为 minimumContentsLength 属
性的大小加上图标的空间。

                 

⑥、 insertPolicy: InsertPolicy
访问函数: InsertPolicy insertPolicy() const; void setInsertPolicy(InsertPolicy);
此属性描述插入新项目时应该出现在组合框中的位置,默认是 InsertAtBottom(新项目
插入到底部),其中 InsertPolicy 是 QComboBox 类中的枚举,该枚举用于描述插入项
目的位置,其成员见下表。

QComboBox::InsertPolicy 枚举(无标志)
成员说明
QComboBox::NoInsert0字符串不会插入到组合框中
QComboBox::InsertAtTop1字符串插入组合框中的第一项
QComboBox::InsertAtCurrent2使用字符串替换掉当前项目
QComboBox::InsertAtBottom3字符串插入到组合框的最后一项之后(默认值)
QComboBox::InsertAfterCurrent4字符串插入到组合框的当前项目之后
QComboBox::InsertBeforeCurrent5字符串插入到组合框的当前项目之前
QComboBox::InsertAlphabetically6字符串按字母顺序插入到组合框中。

⑦、 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 类中的成员函数

常用函数

comboBox->addItem("cxq");    //添加下拉选项
combobox->clear();           //清空下拉项
 
comboBox->setCurrentIndex(0);//设置当前的索引
int currentlndex():        //返回当前项的序号,第一个项的序号为0。
combobox->currentText();     //获取当前项的内容
QVariant currentData(int role = Qt::UserRole):返回"当前项"的关联数据
QVariant itemData(int index, int role = Qt%:UserRole) 返回"指定索引号的项"的关联数据。
 
comboBox->itemText(2);       //获取第二项的内容
combobox->count();           //获取项的个数
 
void removeItem(int index); //通过指定索引 删除item

①、 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 currentindexChanged(int index);//选择项发生变化时 发射该信号

void currentindexChanged(const QString &text);//选择项发生变化时 发射该信号

①、 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); //信号

当在组合框展开的下接列表中改变加亮条时,发送以上信号。
⑥、以上信号发送时机的测试,读者可自行编写程序验证。

四、设置QComboBox下拉框的样式,可以是 列表、树、表格 等格式

void setView(QAbstractItemView *itemView)
model/view 使用

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值