1. 实例功能概述
QComboBox 是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个QLineEdit 用作输入。OComboBox 除了显示可见下拉列表外,每个项 (item,或称列表项)还可以关联一个 QVariant 类型的变量,用于存储一些不可见数据。
QPlainTextEdit 是一个多行文本编辑器,用于显示和编辑多行简单文本。实例 samp4_6 演示QComboBox和QPlainTextEdit 的使用,其运行时界面如图4-6 所示。
关于"QComboBox 的使用"和“QPlainTextEdit 的使用”请参考下面源码和《Qt5.9 c++开发指南》
2. 源码
2.1 可视化UI设计
2.2 widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_btnIniItems_clicked();
void on_btnClearItems_clicked();
void on_chkBoxEditable_clicked(bool checked);
void on_comboBox_currentIndexChanged(const QString &arg1);
void on_btnClearText_clicked();
void on_chkBoxReadonly_clicked(bool checked);
void on_btnToComboBox_clicked();
void on_plainTextEdit_customContextMenuRequested(const QPoint &pos);
void on_btnIni2_clicked();
void on_comboBox2_currentIndexChanged(const QString &arg1);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
2.3 widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTextDocument>
#include <QTextBlock>
#include <QMenu>
#include <QMap>
#include <QVariant>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnIniItems_clicked()
{ //"初始化列表"按键
QIcon icon;
icon.addFile(":/images/icons/aim.ico");
ui->comboBox->clear(); //清除列表
for (int i=0;i<20;i++)
ui->comboBox->addItem(icon,QString::asprintf("Item %d",i)); //添加一个字符串
// ui->comboBox->addItem(QString::asprintf("Item %d",i)); //添加一个字符串
// QStringList strList;
// strList<<"北京"<<"上海"<<"天津"<<"河北省"<<"山东省"<<"山西省";
// ui->comboBox->addItems(strList);
}
void Widget::on_btnClearItems_clicked()
{
ui->comboBox->clear(); //清除条目
}
void Widget::on_chkBoxEditable_clicked(bool checked)
{ //设置comboBox是否可编辑
ui->comboBox->setEditable(checked);
}
void Widget::on_comboBox_currentIndexChanged(const QString &arg1)
{ //comboBox选择一个条目时,文本添加到 plainTextEdit
ui->plainTextEdit->appendPlainText(arg1);
}
void Widget::on_btnClearText_clicked()
{ //清除文本框
ui->plainTextEdit->clear();
}
void Widget::on_chkBoxReadonly_clicked(bool checked)
{//设置 plainTextEdit 的 ReadOnly 属性
ui->plainTextEdit->setReadOnly(checked);
}
void Widget::on_btnToComboBox_clicked()
{ //plainTextEdit 的内容逐行添加为 comboBox 的条目
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
}
}
void Widget::on_plainTextEdit_customContextMenuRequested(const QPoint &pos)
{ //创建并显示标准弹出式菜单
QMenu* menu=ui->plainTextEdit->createStandardContextMenu(); //创建标准右键菜单
// menu->exec(QCursor::pos());//在鼠标光标位置显示右键快捷菜单
menu->exec(pos);//在鼠标光标位置显示右键快捷菜单
}
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));
}
void Widget::on_comboBox2_currentIndexChanged(const QString &arg1)
{ //条目有用户数据
QString zone=ui->comboBox2->currentData().toString();
ui->plainTextEdit->appendPlainText(arg1+":区号="+zone);
}