QTreeView类继承于QAbstractItemView类,提供了一个树结构视图的模型。
视图基类 QAbstractItemView
QTreeView默认为Model/View实现,下面是一个使用QFileSystemModel和QTreeView的结合,显示系统文件结构的实例。
QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::currentPath());
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
正常场景下,我们需要根据数据动态去生成树结构,这时候使用QStandardItemModel实现树结构的数据。
QStandardItemModel *model = new QStandardItemModel;
ui->treeView->setModel(model);
QStandardItem *item = new QStandardItem;
item->setText("000");
model->appendRow(item);
insterTreeNode("aaa",item);
insterTreeNode("bbb",item);
insterTreeNode("ccc",item);
insterTreeNode("ddd",item);
ui->treeView->expandAll();
void MainWindow::insterTreeNode(QString str,QStandardItem *parent)
{
QStandardItem *item = new QStandardItem;
item->setText(str);
parent->appendRow(item);
}
QTreeView树视图提供了一些公共属性和类方便程序员结构进行设计。使用expandAll()和collapseAll()展开和折叠全部的节点,当发现折叠或者展开的时候,发出collapsed() 和expanded()信号。QTreeView带有标题头封装在QHeaderView中。
QTreeView默认与一些按键绑定,使用户能够在视图中导航并与项的内容交互。
按键 作用描述 上键Up 将光标移动到前一行同一列中的项。如果当前项的父项没有更多的行可导航,则光标移动到父项前面的兄弟项的最后一行中的相关项。 下键Down 将光标移动到下一行同一列中的项。如果当前项的父项没有更多的行可导航,则光标移动到其父项后面的兄弟项的第一行中的相关项。 左键Left 通过折叠分支隐藏当前项的子项。 减号键Minus 和Left一样 右键Right 通过展开分支显示当前项的子项 加号键Plus 和Right一样 星号键Asterisk 展开当前项及其所有子项 上翻页PageUp 将光标向上移动一页。 下翻页PageDown 将光标向下移动一页。 主页Home 将光标移动到模型中第一个顶级项的第一行同一列中的项。 尾页End 将光标移动到模型中最后一个顶级项的最后一行同一列中的项。 F2 在可编辑模型中,这将打开当前项进行编辑。Escape键可用于取消编辑过程并恢复对所显示数据的任何更改。
该属性表示项是否应该使用所有列显示键盘焦点,默认值为false。
如果此属性为真,则所有列将显示焦点,否则只有一列显示焦点。
bool allColumnsShowFocus() const
void setAllColumnsShowFocus(bool enable)
该属性表示是否启用动画,默认为False。
如果此属性为true,树视图将动画展开和折叠分支。
如果此属性为false,树视图将立即展开或折叠分支而不显示动画。
bool isAnimated() const
void setAnimated(bool enable)
该属性表示是否双击展开节点,默认为true。
bool expandsOnDoubleClick() const
void setExpandsOnDoubleClick(bool enable)
该属性表示是否隐藏头标题,默认为false。
bool isHeaderHidden() const
void setHeaderHidden(bool hide)
该属性表示在拖放操作期间打开或关闭树中的项之前的延迟时间(以毫秒为单位)。如果时间被设置为小于0,那么它将不会被激活。默认情况下,此属性的值为-1,意味着禁用自动扩展。
int autoExpandDelay() const
void setAutoExpandDelay(int delay)
该属性表示树视图中每个级别的项目以像素为单位测量的缩进。对于顶级项目,缩进指定从视口边缘到第一列项目的水平距离,对于子项,它指定它们与父项之间的缩进。
默认情况下,此属性的值与样式相关。因此,当样式更改时,此属性将从它更新。调用setIndentation()停止更新,调用resetIndentation()将恢复默认行为。
int indentation() const
void setIndentation(int i)
void resetIndentation()
该属性表示项用户是否可以交互展开和折叠项,默认为true。
bool itemsExpandable() const
void setItemsExpandable(bool enable)
该属性表示是否显示展开和折叠顶级项的控件,默认为true。
带有子项目的项目通常显示为展开和折叠它们的控件,从而允许显示或隐藏它们的子项目。如果此属性为false,则不会为顶级项显示这些控件。这可以使单个级别的树结构看起来像一个简单的项目列表。
bool rootIsDecorated() const
void setRootIsDecorated(bool show)
该属性表示是否启用排序,默认为false。
bool isSortingEnabled() const
void setSortingEnabled(bool enable)
在实例二代码中我们修改代码添加排序,展示的结果子项实现倒序排序。
QStandardItemModel *model = new QStandardItemModel;
ui->treeView->setModel(model);
QStandardItem *item = new QStandardItem;
item->setText("000");
model->appendRow(item);
insterTreeNode("aaa",item);
insterTreeNode("bbb",item);
insterTreeNode("ccc",item);
insterTreeNode("ddd",item);
ui->treeView->expandAll();
ui->treeView->setSortingEnabled(true);
ui->treeView->sortByColumn(0);
该属性表示是否让视图中的所有项目具有相同的高度,默认为false。只有在保证视图中的所有项具有相同高度时,才应该将此属性设置为true,这使视图能够进行一些优化。
bool uniformRowHeights() const
void setUniformRowHeights(bool uniform)
该属性表示是否启用换行,默认为false。启用该属性,则文本将在需要的位置进行换行,如果不换行则需要设置textElideMode,它能够把超出范围的值显示为省略号。
bool wordWrap() const
void setWordWrap(bool on)
返回给定x坐标所在的行序号。
int columnAt(int x) const
返回给定行号所在的视窗中的水平位置。
int columnViewportPosition(int column) const
返回给定行号的宽度。
int columnWidth(int column) const
设置给定行号的宽度。
void setColumnWidth(int column, int width)
返回头标题信息,封装在QHeaderView中。
QHeaderView *header() const
返回在给定模型上面的模型。
QModelIndex indexAbove(const QModelIndex &index) const
返回在给定模型下面的模型。
QModelIndex indexBelow(const QModelIndex &index) const
返回给定的列是否隐藏。
bool isColumnHidden(int column) const
返回给定的行是否隐藏。
bool isRowHidden(int row, const QModelIndex &parent) const
如果父元素给定行的第一列中的项跨越所有列,则返回true;否则返回false。
bool isFirstColumnSpanned(int row, const QModelIndex &parent) const
如果span为true,则具有给定父元素的行中第一列中的项被设置为跨所有列,否则显示该行上的所有项。
void setFirstColumnSpanned(int row, const QModelIndex &parent, bool span)
指定树结构应该放在逻辑索引索引处。如果设置为-1,则树将始终跟随视觉索引0。
void setTreePosition(int index)
返回设置树的逻辑索引。如果返回值为-1,则树被放置在可视索引0上。
int treePosition() const
折叠给定的节点。
void collapse(const QModelIndex &index)
折叠全部的节点。
void collapseAll()
展开给定的节点。
void expand(const QModelIndex &index)
展开全部的节点。
void expandAll()
展开节点带深度,如果是-1则展开全部节点,如果是0则展开给定的索引。
void expandRecursively(const QModelIndex &index, int depth = -1)
展开节点带深度,如果是-1则展开全部节点,如果是0则展开给定的索引。
void expandToDepth(int depth)
隐藏给定的列。
void hideColumn(int column)
恢复列的宽度设置。
void resizeColumnToContents(int column)
显示给定的列。
void showColumn(int column)
升序或者降序进行排序。
void sortByColumn(int column, Qt::SortOrder order)
有节点折叠的时候信号产生。
void collapsed(const QModelIndex &index)
有节点展开的时候信号产生。
void expanded(const QModelIndex &index)