Qt入门学习之常用界面设计组件(五)

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);//在鼠标光标位置显示右键快捷菜单
}

猜你喜欢

转载自blog.csdn.net/cainiaoxiakexing/article/details/89087771