1.QComboBox、QPlainTextEdit简介
QComboBox是下拉列表框组件类,它提供了一个下拉表供用户选择。也可以直接当作一个QLineEdit用作输入。QComboBox除了显示可见下拉列表外,每一个项(item,或称列表项)还可以关联一个QVariant类型的变量用于存储一些不可见数据。
QPlainTextEdit是一个多函数文本编辑器,用于显示和编辑多行简单文本。
2.QComboBox的使用
I.设计时属性的设置
QComboBox主要的功能是提供一个下拉列表供选择输入。在界面上放置一个QComboBox组件后,双击此组件,可以出现一个对话框,对QComboBox组件的下拉列表的项进行编辑(如添加,删除,上移,下移,设置项图标等等)。
II.使用代码添加简单项
groupBox = new QGroupBox(Widget);//创建QGroupBox类对象groupBox
groupBox->setObjectName(QStringLiteral("groupBox"));
//创建网格布局管理器
gridLayout = new QGridLayout(groupBox);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
gridLayout->setObjectName(QStringLiteral("gridLayout"));
//创建QPushButton类对象btnIniItems
btnIniItems = new QPushButton(groupBox);
btnIniItems->setObjectName(QStringLiteral("btnIniItems"));
gridLayout->addWidget(btnIniItems, 0, 0, 1, 1);
//创建QPushButton类对象btnClearItems
btnClearItems = new QPushButton(groupBox);
btnClearItems->setObjectName(QStringLiteral("btnClearItems"));
gridLayout->addWidget(btnClearItems, 0, 1, 1, 1);
//创建QCheckBox类对象chkBoxEditable
chkBoxEditable = new QCheckBox(groupBox);
chkBoxEditable->setObjectName(QStringLiteral("chkBoxEditable"));
chkBoxEditable->setMaximumSize(QSize(200, 16777215));
gridLayout->addWidget(chkBoxEditable, 0, 2, 1, 1);
//创建QComboBox类对象comboBox
comboBox = new QComboBox(groupBox);
QIcon icon;//声明一个QIcon类对象icon,用于资源文件中图片资源的使用
icon.addFile(QStringLiteral(":/images/icons/UNIT.ICO"), QSize(), QIcon::Normal, QIcon::Off);
comboBox->clear();//清除comboBox所有表项
comboBox->addItem(icon, QString());//添加带指定图标icon的表项,图标来源于资源文件
comboBox->addItem(icon, QString());
comboBox->setObjectName(QStringLiteral("comboBox"));
comboBox->setEditable(false);//默认不可编辑表项内容
gridLayout->addWidget(comboBox, 1, 0, 1, 3);
addItem()用于添加一个列表项,如果只是添加字符串列表项,而且数据来源于一个QStringList变量,可以使用addItems()函数,如下所示:
ui->comboBox->clear();
QStringList strList;
strList<<"北京"<<"上海"<<"南京";
ui->comboBox<<addItems(strList);
III.添加具有用户数据的项
groupBox_3 = new QGroupBox(Widget);
groupBox_3->setObjectName(QStringLiteral("groupBox_3"));
verticalLayout_2 = new QVBoxLayout(groupBox_3);
verticalLayout_2->setSpacing(6);
verticalLayout_2->setContentsMargins(11, 11, 11, 11);
verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2"));
verticalLayout_2->setContentsMargins(9, 9, 9, 9);
btnIni2 = new QPushButton(groupBox_3);
btnIni2->setObjectName(QStringLiteral("btnIni2"));
verticalLayout_2->addWidget(btnIni2);
comboBox2 = new QComboBox(groupBox_3);
comboBox2->setObjectName(QStringLiteral("comboBox2"));
verticalLayout_2->addWidget(comboBox2);
QComboBox::addItem()函数的两种参数的原型定义:
void addItem(const QString &text,const QVariant &userData=QVariant())
void addItem(const QIcon &icon,const QString &text,const QVariant &userData=QVariant())
不管是哪一个addItem()函数,后面都有一个可选择的QVariant()类型参数userData,可以用这个变量来存储用户自定义数据。
如上图所示的界面上ComboBox组件使用用户的数据,“初始化城市+区号”按钮槽函数如下:
void Widget::on_btnIni2_clicked()
{//初始化具有自定义数据的comboBox
//QMap自动根据 key排序
QMap<QString, int> City_Zone;
City_Zone.insert("北京",10);
City_Zone.insert("上海",21);
City_Zone.insert("天津",22);
City_Zone.insert("大连",411);
City_Zone.insert("锦州",416);
City_Zone.insert("徐州",516);
City_Zone.insert("福州",591);
City_Zone.insert("青岛",532);
ui->comboBox2->clear();
foreach(const QString &str,City_Zone.keys())
ui->comboBox2->addItem(str,City_Zone.value(str));
}
这里定义了一个关联容器类QMap<QString,int>CityZone,用于存储<城市,区号>映射表。为City_Zone填充数据后,给comboBox2添加项,使用foreach关键字遍历City_Zone.keys()。如:addItem(str,City_Zone.value(str));
IV.QComboBox列表项的访问
QComboBox存储的项是一个列表,但是QComboBox不提供整个列表用于访问,可以通过索引访问某个项。访问项的常用函数主要有以下几种:
- int currentIndex(),返回当前项的序号,第一个序号为0
- QString currentText(),返回当前项的文字
- QVariantcurrentData(int role=Qt::UserRole),返回当前项关联数据
- QString itemText(int index),返回指定索引号的文字
- QVariant itemData(int indext,int role=Qt::UserRole),返回指定序号项关联数据
- int count(),返回项数目
QComboBox组件上选择项发生变化的时候,会发送如下两个信号:
void currentIndexChanged(int index)//传达当前项序号
void currentIndexChanged(const QString &text)//传递当前项文字
void Widget::on_comboBox2_currentIndexChanged(const QString &arg1)
{ //条目有用户数据
QString zone=ui->comboBox2->currentData().toString();
ui->plainTextEdit->appendPlainText(arg1+":区号="+zone);
}
3.QPlainTextEdit使用
I.QPlainTextEdit的功能
QPlainTextEdit是用于编辑多行的编辑器,可以编辑普通文本。
使用QPlainEdit::appendPlainText(const QString &text)函数可以为PlainTextEdit组件添加一行字符串。
QPlainTextEdit提供cut()、copy()、paste()、undo()、redo()、clear()、selectAll()等标准编辑功能的槽函数。QPlainTextEdit还提供标准右键快捷菜单。
groupBox_2 = new QGroupBox(Widget);
groupBox_2->setObjectName(QStringLiteral("groupBox_2"));
verticalLayout = new QVBoxLayout(groupBox_2);
verticalLayout->setSpacing(6);
verticalLayout->setContentsMargins(11, 11, 11, 11);
verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
horizontalLayout_2 = new QHBoxLayout();
horizontalLayout_2->setSpacing(6);
horizontalLayout_2->setObjectName(QStringLiteral("horizontalLayout_2"));
btnToComboBox = new QPushButton(groupBox_2);
btnToComboBox->setObjectName(QStringLiteral("btnToComboBox"));
horizontalLayout_2->addWidget(btnToComboBox);
btnClearText = new QPushButton(groupBox_2);
btnClearText->setObjectName(QStringLiteral("btnClearText"));
horizontalLayout_2->addWidget(btnClearText);
chkBoxReadonly = new QCheckBox(groupBox_2);
chkBoxReadonly->setObjectName(QStringLiteral("chkBoxReadonly"));
chkBoxReadonly->setMaximumSize(QSize(200, 16777215));
chkBoxReadonly->setLayoutDirection(Qt::LeftToRight);
horizontalLayout_2->addWidget(chkBoxReadonly);
verticalLayout->addLayout(horizontalLayout_2);
plainTextEdit = new QPlainTextEdit(groupBox_2);
plainTextEdit->setObjectName(QStringLiteral("plainTextEdit"));
verticalLayout->addWidget(plainTextEdit);
II.逐行读取文字内容
如果将QPlainTextEdit组件里显示的所有文字读取出来,低啊用函数toPlainText()可以将全部文字内容输出作为一个字符串,定义如下:
QStringQPlainTextEdit::toPlainText()const
点击"文本框内容添加到ComboBox"按钮的槽函数代码如下:
void Widget::on_btnToComboBox_clicked()
{ //plainTextEdit 的内容逐行添加为 comboBox 的条目
// QTextDocument *doc; //文本对象
// QTextBlock textLine; //文本中的一段
QTextDocument* doc=ui->plainTextEdit->document(); //QPlainTextEdit 的内容保存在一个 QTextDocument 里
int cnt=doc->blockCount();//QTextDocument分块保存内容,文本文件就是硬回车符是一个block,
QIcon icon(":/images/icons/aim.ico");
ui->comboBox->clear(); //清除条目
for (int i=0; i<cnt;i++) //扫描所有 blobk
{
QTextBlock textLine=doc->findBlockByNumber(i);//用blobk编号获取block,就是获取一行
QString str=textLine.text(); //转换为文本
ui->comboBox->addItem(icon,str); //添加一个条目到comboBox
}
}
QPlainTextEdit的文字内容以QTextDocument类型存储,函数document()返回这个文档对象的指针。
QTextDocument是内存中的文本对象,以文本块的形式存储,一个文本块就是一个段落,每个段落以回车符结束。QTextDocument提供一些函数实现对文本内容的存取。
- int blockCount(),获取文本块数(回车符数量)
- QTextBolck findBlockByNumber(int blockNumber),根据序号读取文本块,序号范围是0~BlockCount()-1
一个document有多个TextBlock,从document中读取出一个文本块类型为QTextBlock(),在通过QTextBlock::text()获取其纯文本。
III.使用QPlainTextEdit()自带的快捷菜单
右击QPlainTextEdit组件,弹出快捷菜单,实现常见编辑功能。在UI设计器中,选择QPlainTextEdit组件对象palinTextEdit的customContextMenuRequested()信号生成相应的槽函数,在槽函数中创建并显示QPlainTextEdit的标准快捷菜单:
void Widget::on_plainTextEdit_customContextMenuRequested(const QPoint &pos)
{ //创建并显示标准弹出式菜单
QMenu* menu=ui->plainTextEdit->createStandardContextMenu(); //创建标准右键菜单
// menu->exec(QCursor::pos());//在鼠标光标位置显示右键快捷菜单
menu->exec(pos);//在鼠标光标位置显示右键快捷菜单
}