QT基础教程3--视图控件

文章目录

  • 列表视图QListView
  • 树形视图QTreeView
  • 表格视图QTableView
  • 列视图QColumnView

部分内容摘自: https://blog.51cto.com/9291927/1868167
QT中有四种单元视图组件,分别为列表视图QListView、树形视图QTreeView、表格视图QTableView、列视图QColumnView。

列表视图QListView

1、QListView组件简介

QListView列表视图,继承自QAbstractItemView。QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式。

2、QListView组件属性

(1)flow: 在列表控件中的每个item,其实都是存在于布局之中的,flow字面意思是流动的意思,既然流动就会有一个方向。
LeftToRight 代表从左到右排列item,如果isWrapping为true,在item到达可见区域的最右边时会自动换行。
TopToBottom 代表从上到下排列item,如果isWrapping为true,在item到达可见区域的最下边时会自动换行。

(2)gridSize
对于每个item其大小不一定完全一样,如果把每个item排列起来,对于多行item,那么他们很可能不会对齐,这对有强迫症的人来说是很不舒服的,为此,为了使item可以彼此对齐,可以设置每个item的网格大小。默认情况下是不存在网格的。
注意,这里并不是指item的大小,而是网格的大小,item被放置在网格内。

(3)isWrapping 当item到达可见区域边缘时是否自动换行。

(4) layoutMode和batchSize
当设置view中的item自动换行,或者当view大小改变后item需自动调整位置时,可以设置layoutMode属性,从而决定让全部item一次性调整位置还是item成批次调整位置。
SinglePass 全部item一次性重新布局 Batched item按批次重新布局,每批次为batchSize个item。

(5) modelColumn
我们知道,在一个model模型中可以存放多列数据,但是QListView只能显示一列数据,在默认情况下,QListView显示第一列数据,如果指定modelColumn设为n,view将显示model的第n列数据。

(6) movement
前面我们讲了,QListView是可以有网格的,如果我想移动item(可类比电脑桌面上的图标),则可以选择移动方式,自由移动,或按网格移动,或根本不能移动。
Static 不能移动item 此为默认 Free 可自由移动item Snap 只能在网格间移动

(7) resizeMode 当为true时,表示如果view窗口大小改变,item会重新布局。

(8) selectionRectVisible
当我们在多选item时,往往希望能有一个矩形框来帮助我们选择多个item,如果设置该属性为true,则可按住鼠标框选多个item

(9) spacing 很简单,就是item之间的间距

(10) uniformItemSizes
当视图中的每个item具有相同大小时,可以设置该属性为true,这会让视图进行一些性能优化。对于显示大量大小相同的item时,这是一个提升性能的很好的办法。

(11) viewMode 视图模式,该属性可以让item以列表或图标模式显示,可以类比于windows窗口的列表模式和缩略图模式。
ListMode item以列表方式显示 IconMode item以图标方式显示

(12) wordWrap item是否换行

3、QListView组件常用成员函数

功能 函数原型
把current定位当前项目,previous是以前的项目。 void QListView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
更改模型中项目topLeft到bottomRight。 void QListView::dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight)[virtual protected]
返回坐标点p处项目的模型索引。 QModelIndex QListView::indexAt(const QPoint &p)const [virtual]
插入新行,新行的父母是parent,从start到end的所有项目。 void QListView::rowsInserted(const QModelIndex &parent,int start,int end)[virtual protected
返回所有选中的非隐藏的项目的模型索引。 QModelIndexList QListView::selectedIndexes()const[virtual protected]
设置显示模式,分为QListView::ListMode,QListView::IconMode,默认ListMode void setViewMode ( ViewMode mode )
设置布局模式,QListView::SinglePass,QListView::Batched void setLayoutMode ( LayoutMode mode )
设置view所关联的model virtual void QAbstractItemView:: setModel(QAbstractItemModel * model)

示例代码:

QListView *view=new QListView(&w);
view->setSelectionRectVisible(true);//设置框选矩形框可见
//设置选择模式,该模式为最常用模式
//按住ctrl可多选,按住shift可连续多选
//当点击另一个item,其他被选中的item会取消选中状态
view->setSelectionMode(QAbstractItemView::ExtendedSelection);
  QStringList strlist;
  strlist<<"apple"<<"banana"<<"grape"<<"watermelon"<<"pear";
 //创建一个字符串列表模型
  QStringListModel strlistModel;
  //用strlist初始化字符串列表模型
  strlistModel.setStringList(strlist);
   //将模型设置给QListView
  view->setModel(&strlistModel);
//向字符串列表模型中插入条目  strlistModel.insertRow(0);  strlistModel.setData(strlistModel.index(0),"插入一个条目");  
//更新QListView显示 
 view->update();

演示效果:
QT基础教程3--视图控件_第1张图片

树形视图QTreeView

1、QTreeView组件简介

QTreeView树形视图,继承自QAbstractItemView,是基于模型的列表/图标视图,也是Qt模型/视图框架的一部分。

2、QTreeView组件属性

A、name:组件对应源代码中的名称。
B、font:设置组件内所有文本的字体。
C、sortingEnable:项目是否排序。

3、QTreeView组件常用成员函数

功能 函数原型
构造一个父对象为parent的TreeView。 QTreeView::QTreeView(QWidget *parent = 0)
折叠模型索引为index的项目 void QTreeView::collapse(const QModena &index)[slot]
折叠所有项目 void QTreeView::collapseAll()[slot]
返回x坐标处的列。 int QTreeView::columnAt(int x)const
通知树形视图中的列数,从oldCount改变到newCount。 void QTreeView::columnCountChanged(int oldCount,int newCount)[protected slot]
把current定为当前项目,previous是以前的当前项目 void QTreeView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
更改模型中项目topLeft到bottomRight。 void QTreeView::dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight)[virtual]
在项目index的同一行,用painter绘制指定的rect矩形分支。 void QTreeView::drawBranches(QPainter *painter,const QRect &rect,const QModelIndex &index)const [virtual protected[
用painter绘制新行,新行包含模型索引 为index的项目,option是如何显示项目。 void QTreeView::drawRow(QPainter *painter,const QStyleOptionViewItem &option,const QModelIndex &index)const [virtual protected]
用painter在区域region绘制树 void QTreeView::drawTree(QPainter *painter,const QRegion ion)const [protected]
展开模型索引为index的项目。 void QTreeView::expand(const QModelIndex &index)[slot]
展开树形视图中的项目,深度为depth void QTreeView::expandToDepth(int depth) [slot]
返回该树形视图的header QHeaderView *QTreeView::header()const
展开所有的项目 void QTreeView::expandAll()[slot]
返回模型索引index的上一个索引 QModelIndex QTreeView::indexAbove(const QModelIndex &index)const
返回点point处项目的模型索引 QModelIndex QTreeView::indexAt(const QPoint &point)const [virtual]
返回模型索引index的下一个索引 QModelIndex QTreeView::indexBelow(const QModelIndex &index)const
如果模型索引index处的项目是展开着的,返回true,否则返回false bool QTreeView::isExpanded(const QModelIndex &index)const
插入新行,新行的父母是parent,包括从start到end的所有项目。 void QTreeV::rowsInserted(const QModelIndex &parent,int start,int end)[virtual protected]
删除行,行的父母是parent,包括从start到end的所有项目 void QTreeView::rowsRemoved(const QModelIndex &parent,int start,int end)[protected slot]
设置所有的项目都是选择状态 void QTreeView::selectAll()[virtual]
设置所有的项目都是选择状态 void QTreeView::selectAll()[virtual]
返回所有选中和非隐藏的项目的模型索引 QModelIndexList QTreeView::selectedIndexes()const [virtual protected]
设置该TreeView的标题为header void QTreeView::setHeader(QHeaderView *header)
对列column按order进行排序 void QTreeView::sortByColumn(int column,QT::SortOrder order)

示例代码:

QApplication a(argc, argv);
QWidget w;
w.resize(400,400);
w.move(150,150);
QFileSystemModel *model = new QFileSystemModel;
//用当前项目所在目录初始化文件系统模型
model->setRootPath(QDir::currentPath());
//创建树形视图对象
QTreeView *tree = new QTreeView(&w);
//用model初始化树形视图
tree->setModel(model);
//创建一个垂直布局使得树形视图能随窗口一同收缩放大
QVBoxLayout lay;
lay.addWidget(tree);
w.setLayout(&lay);
w.show();
return a.exec();

演示效果:

QT基础教程3--视图控件_第2张图片

表格视图QTableView

1、QTableView组件简介
QColumnView列视图提供了一个模型/视图的列视图实现,是模型/视图框架的一部分,提供了多级的视图(每点开一个选项都会在它旁边出现一个菜单,显示它所有的子项目)。

2、QTableView组件属性

A、name:组件对应源代码中的名字
B、font:设置表格内部的字体

3、QTableView组件常用成员函数:

功能 函数原型
构造一个父对象为parent的ColumnView QColumnView::QColumnView(QWidget *parent = 0)
index是视图的根模型索引,返回新的视图 QAbstractItemView * QColumnView::createColumn(const QModelIndex *index)[virtual protected]
把current指定为当前项目,previous是以前的当前项目 void QColumnView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
返回点pos处项目的索引模型 QModelIndex QColumnView::indexAt(cosnt QPoint &point)const [virtual]
返回预览组件,如果没有则返回0 QWidget *QColumnView::previewWidget()const
插入新行,新行的父母是parent包括从start到end的所有项目 void QColumnView::rowsInserted(const QModelIndex &parent,int start,int end)[virtual protected]
设置该ColumnView中的所有项目为选中状态 void QColumnView::selectAll()[virtual]
设置widget为该columnView的预览组件。 void QColumnView::setPreviewWidget(QWidget *widget)

示例代码:

#include "ViewTest.h"
#include 
#include
#include
#include
#include
int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	ViewTest w;
	QStandardItemModel *model = new QStandardItemModel();
	//设置列数
	model->setColumnCount(5);
	//设置表头    三个参数分别为:对应的索引序号,排列方式Horizontal是水平 Vertical是竖直
	model->setHeaderData(0, Qt::Horizontal, QString::fromLocal8Bit("学号"));
	model->setHeaderData(1, Qt::Horizontal, QString::fromLocal8Bit("语文成绩"));
	model->setHeaderData(2, Qt::Horizontal, QString::fromLocal8Bit("数学成绩"));
	model->setHeaderData(3, Qt::Horizontal, QString::fromLocal8Bit("英语成绩"));
	model->setHeaderData(4, Qt::Horizontal, QString::fromLocal8Bit("总成绩"));
	//创建表格视图
	QTableView *tableview = new QTableView();
	//设置模型
	tableview->setModel(model);
	//设设置标头向左对齐
	tableview->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
	//设置 QTableView 表格控件的水平滚动条顶部的表头中的第i列的列宽度的调整方式为固定大小。
	tableview->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
	tableview->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
	tableview->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
	tableview->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed);
	tableview->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Fixed);

	tableview->setColumnWidth(0, 100);
	tableview->setColumnWidth(1, 100);
	//设置随机数种子
	qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
	
	for (int i = 0; i < 40; i++)
	{
		//产生四个随机数分别表示学号,语数英成绩以及总成绩
		int id = qrand() % 100 + 8209300;
		int chineseScore = qrand() % 50 + 50;
		int mathScore = qrand() % 50 + 50;
		int englishScore = qrand() % 50 + 50;
		int totalScore = chineseScore + mathScore + englishScore;
		//插入数据   插入的数据只能是字符串
		model->setItem(i, 0, new QStandardItem(QString::number(id)));
		model->setItem(i, 1, new QStandardItem(QString::number(chineseScore)));
		model->setItem(i, 2, new QStandardItem(QString::number(mathScore)));
		model->setItem(i, 3, new QStandardItem(QString::number(englishScore)));    
		model->setItem(i, 4, new QStandardItem(QString::number(totalScore)));
		//下面这两个设置要在响应的条目插入了对象之后才能进行否则程序会被中断 因为item()获取不到对应对象
		//设置字符颜色 将总分标红  
		model->item(i, 4)->setForeground(QBrush(QColor(255, 0, 0)));
		//设置字符位置  设置为居中
		model->item(i, 4)->setTextAlignment(Qt::AlignCenter);
	}
	tableview->show();

	//w.show();
	return a.exec();
}

演示效果:

QT基础教程3--视图控件_第3张图片

列视图QColumnView

1、QColumnView组件简介

 QColumnView列视图提供了一个模型/视图的列视图实现,是模型/视图框架的一部分,提供了多级的视图(每点开一个选项都会在它旁边出现一个菜单,显示它所有的子项目)。

2、QColumnView组件属性

A、name:组件对应源代码中的名字
B、font:设置表格内部的字体

3、QColumnView组件常用成员函数

功能 函数原型
构造一个父对象为parent的ColumnView QColumnView::QColumnView(QWidget *parent = 0)
index是视图的根模型索引,返回新的视图 QAbstractItemView * QColumnView::createColumn(const QModelIndex *index)[virtual protected]
把current指定为当前项目,previous是以前的当前项目 void QColumnView::currentChanged(const QModelIndex ¤t,const QModelIndex &previous)[virtual protected]
返回点pos处项目的索引模型 QModelIndex QColumnView::indexAt(cosnt QPoint &point)const [virtual]
返回预览组件,如果没有则返回0 QWidget *QColumnView::previewWidget()const
插入新行,新行的父母是parent包括从start到end的所有项目 void QColumnView::rowsInserted(const QModelIndex &parent,int start,int end)[virtual protected]
设置该ColumnView中的所有项目为选中状态 void QColumnView::selectAll()[virtual]
设置widget为该columnView的预览组件。 void QColumnView::setPreviewWidget(QWidget *widget)

示例代码:

   QMainWindow win;
       QColumnView *cview = new QColumnView(&win);
       win.setCentralWidget(cview);
//创建标准条目模型
       QStandardItemModel model;
       for (int groupnum = 0; groupnum < 3 ; ++groupnum)
       {
           QStandardItem *group = new QStandardItem(QString("Group %1").arg(groupnum));
           for (int personnum = 0; personnum < 5 ; ++personnum)
           {
            //向子视图中插入条目
               QStandardItem *child = new QStandardItem(QString("Person %1 (group %2)").arg(personnum).arg(groupnum));
//在这项的子项中添加一行
               group->appendRow(child);
           }
//将group作为一行添加进模型
           model.appendRow(group);
       }
       cview->setModel(&model);
       win.show();

演示效果:

QT基础教程3--视图控件_第4张图片

你可能感兴趣的:(QT基础教程,qt,c++)