QT开发2

QComboBox和QPlainTextEdit

QPlaninTextEdit的文字内容以QTextDocument类型储存,函数document返回这个文档对象的指针。

QTextDocument是内存中的文本对象,以文本块的方式存储,每个段落以换行符结束。

QTextDocument提供一些函数实现对文本内容的存取

  • int blockCount() 返回文本块个数
  • QTextBlock finBlockByNumber(int) 读取一个文本块,序号从0开始

QComboBox下拉菜单

添加选项:;添加图标:第一个选中进去添加,第二种方法

1
2
QIcon 图标的使用
QIcon icon(":/icon/icon/换肤.svg"); //:/icon/icon/换肤.svg 为Resources中的路径,该路径下保存了图片路径信息
1
2
3
QComboBox 添加菜单
comboBox->addItem //添加图标和文字,或者添加文字等
comboBox_2->currentData() //获取当前选中行的数据区域

QPlainTextEdit文本编辑框

添加文字:appendPlainText

1
plainTextEdit->setReadOnly //设置只读

获取文本框中内容

1
2
3
4
5
6
#include <QTextDocument>
QTextDocument *doc = ui->plainTextEdit->document();
int num = doc->blockCount();
for (int i = 0;i<num;i++) {
ui->comboBox->addItem(icon,doc->findBlockByNumber(i).text());
}

创建目录,本来就有,修改成中文,右键菜单customContextMenuRequested

1
2
3
#include <QMenu>
QMenu * menu = ui->plainTextEdit->createStandardContextMenu();//创建标准上下文目录
menu->exec(pos);

QListWidget和QToolButton

Item-Based:

Qt中用于项(Item)处理的组件有两类:widget窗口小部件

  • Item Views: 包括QListView 、QTreeView 、QTableView 、 QColumnView
  • Item Widgets:包括QListWidget 、 QTreeWidget 和 QTable Widget

QListWidget 有很多的Item(项目)成员,相当于一个容器的显示

Model-Based:抽象的模型,数据抽象后再显示

右键菜单支持:

1
ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);//上下文目录

使用分裂器布局可以组合不同器件

设置某个器件为中央小部件

1
setCentralWidget(ui->splitter);//设置

QToolButton与action绑定

QToolButton的属性setDefaultAction可以与action绑定

QToolButton 显示图标以及文字设置toolBUttonStyleToolButtonTextBesideIcon

QToolBar添加分隔符

1
ui->toolBar->addSeparator();//添加分隔符

QListWidget

右键菜单默认是不显示的,要设置contextMenuPolicyCustomContextMenu才会有右键菜单 customContextMenuRequested自定义上下目录请求

1
2
3
4
5
6
7
8
Q_UNUSED(pos);//相对位置,这里可以获取到相对位置是多少
QMenu * meunList = new QMenu(this);//创建菜单

//添加ACTIONS创建菜单项
meunList->addAction(ui->actListIni);

meunList->exec(QCursor::pos());//在鼠标光标位置显示右键快捷菜单,获取的绝对位置QCursor::pos()
delete meunList;//手工创建的指针必须手动删除

QTreeWidgetQDockWidget

List:是链表展示;Tree:树的展示 是数据结构的展示

注意:Item-Based: Model-Based:数据抽象出来

QDockWidget:与菜单栏、工具栏、状态栏,中间区域是平级的关系,是容器的展示

1
#include <QPixmap>

该文件是对图片处理的

QTableWidget操作

QTableWidget有几个函数自动调整表格的行高和列宽:

  • resizeColumnsToContents():自动调整所有列的宽度
  • resizeColumnToContents(int column):自动调整列号为column的列的宽度
  • resizeRoWsToContents():自动调整所有行的高度
  • resizeRowToContents(int row):自动调整行号为row的行的高度

这几个函数实际上是QtableWidge的父类QTableView的函数。QTableViewmodel概念,widgetView的简化版本

Model/View结构

  • 数据:如数据库的一个数据表或SQL查询结果,内存中的一个StringList,或磁盘文件结构等。
  • Model:与数据通信,并为视图组件提供数据接口
  • View:是屏幕上的界面组件,视图从数据模型获得每个数据项的模型索引(model index),通过模型索引获取数据。
  • 代理:定制数据的界面显示和编辑方式。在标准的视图组件中,代理功能显示一个数据,当数据被编辑时,提供一个编辑器,一般是QLineEdit

View : 数据可以是 List Table 文件夹目录形式(folder) ,设置一种model类型数据,然后数据放入model中,

模型、视图和代理之间使用信号和槽通信。当数据变化的时候,会发送信号同步所有的数据,如图所示,一种数据类型对应一种model,但是view可以一对多中model.

数据模型

Model类 用途
QStringListModel 用于处理字符串列表数据的模型类
QStandardltemModel 标准的基于项数据的数据模型类,每个项数据可以是任何数据类型。只要是item就可以
QFileSystemModel 计算机上文件系统的数据模型类
QSortFilterProxyModel 与其他数据模型结合,提供排序和过滤功能的数据模型类
QSqlQueryModel 用于数据库SQL查询结果的数据模型类
QSqlTableModel 用于数据库的一个数据表的数据模型类
QSqlRelationalTableModel 用于关系型数据表的数据模型类

图片中红色方框是不可以使用的基础类型,后面橙色的是特化的过程,是专门的数据类型,是派生类

视图组件

视图组件:显示数据时,只需调用视图类的setModel()函数 (Model模型)

图片中,只能使用派生类,基类不能使用。橙色是派生类,越是后面越特别,

  • 视图组件不存储数据
  • 便利类则为组件的每个节点或单元格创建一个项(item),用项存储数据,格式设置等
  • 便利类没有数据模型,将界面与数据绑定了。

代理

  • 代理就是在视图组件上为编辑数据提供编辑器
  • 如在表格组件中编辑一个单元个的数据时,缺省是使用一个QLineEdit编辑框。代理负责从数模型获取相应的数据,然在显示在编辑器里,修改数据后,又将器保存到数据模型中,
  • QAbstractltemDelegate 是所有dialing类的基类

Model/View 结构的一些概念

数据模型中存储数据的基本单元都是项(item),每个项有一个行号、一个列号、还有一个父项

QModelIndex表示模型索引的类,模型索引提供数据存取的一个临时指针

1
2
3
4
//Table Model
//这是最顶级的,最顶级的可以直接用QModelIndex(),父节点是Root item
QModelIndex indexA = model->index(0,0,QModelIndex());

这样我们就找到 0 0位置的数据的一个临时指针indexA

对于Tree Model中如何需要找B节点,那么我们需要先找到A节点,再找B节点

1
2
QModelIndex indexA = model->index(0,0,QModelIndex());
QModelIndex indexB = model->index(1,0,indexA);

项的角色:在为数据模型的一个项设置数据时,可以赋予其不同项的角色的数据,反正根据项的值输出对应的结果,不管存储的是什么数据,类似键值;

模型中的每个项都有一组与其关联的数据元素,每个元素都有自己的角色。视图使用这些角色向模型指示它需要哪种类型的数据。

1
2
void QStandardltem::setData(const QVariant &value, int role= Qt::UserRole + 1) //role都是从这个值Qt::UserRole向后取值
QVariant QStandardltem::datalint role = Qt::UserRole + 1) const

QFileSystemModel

如同 Widnows 的资源管理器一样。使用 QFileSystemModel 提供的接口函数,可以创建目录、删除目录、重命名目录,可以获得文件名称、目录名称、文件大小等参数,还可以获得文件的详细信息。

1
2
QFileSystemModel * model = new QFileSystemModel;//带上一个this指针更好,窗口关闭时候,会遍历子类,回收内存,否则就内存泄漏
model->setRootPath(QDir::currentPath());

示例代码:

1
2
3
4
5
6
7
8
9
this->fileModel = new QFileSystemModel(this);
this->fileModel->setRootPath(QDir::currentPath());
this->ui->treeView->setModel(this->fileModel);
this->ui->listView->setModel(fileModel);
this->ui->tableView->setModel(fileModel);
this->ui->tableView->verticalHeader()->setupViewport(false);

connect(this->ui->treeView,SIGNAL(clicked(const QModelIndex)),this->ui->listView,SLOT(setRootIndex(QModelIndex)));
connect(this->ui->treeView,SIGNAL(clicked(const QModelIndex)),this->ui->tableView,SLOT(setRootIndex(QModelIndex)));

QStringListModel

setStringList()函数可以初始化数据模型的字符串列表内容

提供编辑和修改字符串列表数据的函数,如 insertRows()、removeRows()、setData()

数据是QStringList,通过setStringList,通过model绑定数据

示例插入一行:

1
2
3
4
theModel->insertRow(theModel->rowCount());//在尾部插入一空行
QModelIndx index = theModel->index(theModel->rowCount()-1,0);//最后一行
theModel->setData(index,“new item”,Qt::DisplayRole);//设置显示文字 角色Qt::DisplayRole
ui->listView->setCurrentIndex(index);//设置当前选中的行

QStandardItemModel

以项数据为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。比如将txt文件内容读取展示出来

每个单元都是一个项,也是一个数据

主要用到以下 3个类:

QStandardItemModel:可以处理二维数据。每个项是一个 QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式等
QTableView:一个单元格显示 QStandardltemModel 数据模型中的一个项。

QltemSelectionModel:跟踪视图组件的单元格选择状态的类,通过QltemSelectionModel 可以获得选中的单元格的模型索引。