目录
1.概述
2.QTreeWidget控件功能接口
2.1 构造函数
2.2 添加和访问顶级条目
2.3 条目访问函数
2.4 当前条目的操作
2.5 条目查找和排序
2.6 条目显示和运行时条目编辑
2.7 信号
2.8 槽函数
2.9 基类 QTreeView 的函数
2.10 树头条目
2.11选中行为和选中模式
3.QTreeWidget控件功能实例介绍
3.1 本实例的目录树节点操作规则
3.2目录树初始化添加顶层节点
3.3添加目录节点
3.4 添加图片文件节点
3.5 当前节点变化后的响应
3.6 删除节点
3.7 节点的遍历
QTreeWidget(QWidget * parent = 0)
void setColumnCount(int columns) //设置列数int columnCount() const //获取列数
void QTreeWidget::addTopLevelItem(QTreeWidgetItem * item) //添加一个顶级条目到末尾void QTreeWidget::addTopLevelItems(const QList& items) //添加多个顶级条目到末尾
void QTreeWidget::insertTopLevelItem(int index, QTreeWidgetItem * item)void QTreeWidget::insertTopLevelItems(int index, const QList& items)
int QTreeWidget::topLevelItemCount() const
QTreeWidgetItem * QTreeWidget::topLevelItem(int index) const
int QTreeWidget::indexOfTopLevelItem(QTreeWidgetItem * item) const
QTreeWidgetItem * QTreeWidget::itemAbove(const QTreeWidgetItem * item) const //上面相邻条目QTreeWidgetItem * QTreeWidget::itemBelow(const QTreeWidgetItem * item) const //下面相邻条目
QTreeWidgetItem * QTreeWidget::itemAt(const QPoint & p) const//用 QPoint 对象表示相对坐标QTreeWidgetItem * QTreeWidget::itemAt(int x, int y) const//直接用 x 和 y 数值表示坐标//如果对应坐标没有条目,会返回 NULL,注意判断 返回值。
QRect QTreeWidget::visualItemRect(const QTreeWidgetItem * item) const
QTreeWidgetItem * QTreeWidget::currentItem() const
int QTreeWidget::currentColumn() const
void QTreeWidget::setCurrentItem(QTreeWidgetItem * item)//设置该条目整行高亮选中void QTreeWidget::setCurrentItem(QTreeWidgetItem * item, int column)//设置该条目行的 column 列高亮选中void QTreeWidget::setCurrentItem(QTreeWidgetItem * item, int column, QItemSelectionModel::SelectionFlags command)//单次选中命令
//注意指针可能是 NULL,使用指针前一定要判断指针非空。void QTreeWidget::currentItemChanged(QTreeWidgetItem * current, QTreeWidgetItem * previous)//参数里分别是当前高亮选中的条目,和之前高亮选中的条目
//该函数只查找一列的文本,其他列的文本是不查找的。如果需要查找所有列数据,那么要根据不同列号逐列查询。QListQTreeWidget::findItems(const QString & text, Qt::MatchFlags flags, int column = 0) const //参数里text是模板子串,flags是匹配标志,第三个参数是指定查找的列。
bool isSortingEnabled() const //设置是否自动排序void setSortingEnabled(bool enable) //查看是否开启自动排序
//在没有开启自动排序的情况下,也可以调用该函数进行一次性的条目排序。void QTreeView::sortByColumn(int column, Qt::SortOrder order)
void QTreeWidget::setItemWidget(QTreeWidgetItem * item, int column, QWidget * widget) //设置条目列控件QWidget * QTreeWidget::itemWidget(QTreeWidgetItem * item, int column) const //获取条目列控件,不设置就是NULL
void QTreeWidget::removeItemWidget(QTreeWidgetItem * item, int column)//这个函数没有返回值,会自动地彻底删除条目列控件。
void QTreeWidget::editItem(QTreeWidgetItem * item, int column = 0)//参数 item 是指定的条目,column 是条目的列(类似“单元格”)。
注意这对函数一开一关,要成对调用,否则编辑完了不会自动关闭持续编辑器。void QTreeWidget::openPersistentEditor(QTreeWidgetItem * item, int column = 0)void QTreeWidget::closePersistentEditor(QTreeWidgetItem * item, int column = 0)
void itemActivated(QTreeWidgetItem * item, int column) //条目列被激活void itemChanged(QTreeWidgetItem * item, int column) //条目列的数据发生变化,比如文本或图标修改了void itemClicked(QTreeWidgetItem * item, int column) //条目列被单击void itemDoubleClicked(QTreeWidgetItem * item, int column) //条目列被双击void itemEntered(QTreeWidgetItem * item, int column) //进入条目列void itemPressed(QTreeWidgetItem * item, int column) //条目列被点 击按下
如果调用槽函数 expandAll() 展开所有子孙条目,那么不会触发 itemExpanded() 信号,因为触发太多会非常影响性能。 类似地,如果用槽函数 collapseAll() 折叠所有子孙条目,也不会触发 itemCollapsed() 信号,以免影响性能。void QTreeWidget::itemExpanded(QTreeWidgetItem * item) //条目展开时发送信号void QTreeWidget::itemCollapsed(QTreeWidgetItem * item) //条目折叠时发送信号
void clear() //清空整个树形控件void collapseItem(const QTreeWidgetItem * item) //折叠指定的条目void expandItem(const QTreeWidgetItem * item) //展开指定 条目void scrollToItem(const QTreeWidgetItem * item, QAbstractItemView::ScrollHint hint = EnsureVisible) //滚动到指定条目,第二个参数是滚到到该条目的显示方式
void QTreeView::setColumnHidden(int column, bool hide) //设置列隐藏或显示bool QTreeView::isColumnHidden(int column) const //判断列是否隐藏void QTreeView::hideColumn(int column) //槽函数,隐藏指定列void QTreeView::showColumn(int column) //槽函数,显示指定列void QTreeView::setColumnWidth(int column, int width) //设置列宽int QTreeView::columnWidth(int column) const //获取指定列的宽度void QTreeView::resizeColumnToContents(int column) //槽函数,自动调整 指定列的宽度
int indentation() const //获取父子节点的缩进宽度void setIndentation(int i) //设置缩进宽度void resetIndentation() //重置缩进宽度为默认值
void collapseAll() //折叠所有子孙节点,这样只能看到顶级节点void expandAll() //展开所有子孙节点,完全展开的树/**expandToDepth() 函数是指一直展开,直到将第 depth 层级的子节点都展开为止。以顶级条目为第 0 层级,顶级条目的直接子节点为第 1 层级,孙子节点为第 2 层级,依次类推。*如果把 expandToDepth() 参数设置成负数,那么相当于展开无穷大级别,就是展开所有的子孙节点。*/void expandToDepth(int depth) //展开 depth 层级的子节点
//无论是 QTableWidget 还是 QTreeWidget 的表头,都是 QHeaderView 子控件显示。void QTreeWidget::setHeaderItem(QTreeWidgetItem * item) //设置树头条目,树头条目可以有多列数据,相当于多列的表头一次性设置了。void QTreeWidget::setHeaderLabel(const QString & label) //只设置第 0 列的表头void QTreeWidget::setHeaderLabels(const QStringList & labels) //设置多列的表头QTreeWidgetItem * QTreeWidget::headerItem() const //获取树头条目树头条目本质其实也是由 QHeaderView 子控件来显示的,可以在基类找到相关函数:QHeaderView * QTreeView::header() const //获取表头视图控件void QTreeView::setHeader(QHeaderView * header) //设置表头视图, 一般树形控件不需要用这个函数void QTreeView::setHeaderHidden(bool hide) //设置表头是否隐藏bool QTreeView::isHeaderHidden() const //判断是否隐藏了表头
QAbstractItemView::SelectionBehavior selectionBehavior() const //获取选中行为,按条目选中、整行或整列选中void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior) //设置选中行为QAbstractItemView::SelectionMode selectionMode() const //获取选中模式,比如单选、多选、扩展选择void setSelectionMode(QAbstractItemView::SelectionMode mode) //设置选中模式
void QTreeWidget::itemSelectionChanged()
QListQTreeWidget::selectedItems() const
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
//枚举类型treeItemType, 用于创建 QTreeWidgetItem 时作为节点的type, 自定义类型必须大于1000
//itTopItem 顶层节点; itGroupItem 组节点; itImageItem 图片
enum treeItemType{itTopItem=1001,itGroupItem,itImageItem};
//枚举类型,表示列号
enum treeColNum{colItem=0, colItemType=1}; //目录树列的编号定义
QLabel *LabFileName;
QPixmap curPixmap; //当前的图片
float pixRatio;//当前图片缩放比例
void iniTree();//目录树初始化
void addFolderItem(QTreeWidgetItem *parItem, QString dirName);//添加一个目录节点
QString getFinalFolderName(const QString &fullPathName);//从目录全名称中获取最后的文件夹名称
void addImageItem(QTreeWidgetItem *parItem,QString aFilename);//添加一个图片节点
void displayImage(QTreeWidgetItem *item); //显示一个图片节点的图片
void changeItemCaption(QTreeWidgetItem *item); //遍历改变节点标题
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
LabFileName=new QLabel("");
ui->statusBar->addWidget(LabFileName);
this->setCentralWidget(ui->scrollArea); //设置中心布局组件
iniTree();//初始化目录树
}
void MainWindow::iniTree()
{ //初始化Tree
QString dataStr=""; // Item的Data 存储的string
ui->treeFiles->clear();//清除目录树所有节点
QIcon icon;
icon.addFile(":/images/icons/15.ico"); //设置ICON的图标
QTreeWidgetItem* item=new QTreeWidgetItem(MainWindow::itTopItem); //新建节点时设定类型为 itTopItem
item->setIcon(MainWindow::colItem,icon); //设置第1列的图标
item->setText(MainWindow::colItem,"图片文件"); //设置第1列的文字
item->setText(MainWindow::colItemType,"type=itTopItem"); //设置第2列的文字
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
item->setCheckState(colItem,Qt::Checked);//设置为选中
item->setData(MainWindow::colItem,Qt::UserRole,QVariant(dataStr)); //设置节点第1列的Qt::UserRole的Data
ui->treeFiles->addTopLevelItem(item);//添加顶层节点
}
void MainWindow::on_actAddFolder_triggered()
{// 选择一个文件夹,作为当前节点的子节点加入
QString dir=QFileDialog::getExistingDirectory();//选择目录
if (!dir.isEmpty()) //选择目录名称不为空
{
QTreeWidgetItem* parItem=ui->treeFiles->currentItem(); //当前节点
addFolderItem(parItem,dir);//在父节点下面添加一个组节点
}
}
void MainWindow::addFolderItem(QTreeWidgetItem *parItem, QString dirName)
{//添加一个目录节点
QIcon icon(":/images/icons/open3.bmp");
QString NodeText=getFinalFolderName(dirName); //从一个完整目录名称里,获得最后的文件夹名称
QTreeWidgetItem *item; //节点
item=new QTreeWidgetItem(MainWindow::itGroupItem); //新建节点, 设定type为 itGroupItem
item->setIcon(colItem,icon); //设置图标
item->setText(colItem,NodeText); //最后的文件夹名称,第1列
item->setText(colItemType,"type=itGroupItem"); //完整目录名称,第2列
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate); //设置节点选项
item->setCheckState(colItem,Qt::Checked); //节点选中
item->setData(colItem,Qt::UserRole,QVariant(dirName)); //设置角色为Qt::UserRole的Data,存储完整目录名称
parItem->addChild(item); //在父节点下面添加子节点
}
QString MainWindow::getFinalFolderName(const QString &fullPathName)
{//从一个完整目录名称里,获得最后的文件夹名称
int cnt=fullPathName.length(); //字符串长度
int i=fullPathName.lastIndexOf("/");// 最后一次出现的位置
QString str=fullPathName.right(cnt-i-1); //获得最后的文件夹的名称
return str;
}
void MainWindow::on_actAddFiles_triggered()
{//添加图片文件节点
QStringList files=QFileDialog::getOpenFileNames(this,"选择一个或多个文件","","Images(*.jpg)");//多选文件
if (files.isEmpty()) //如果一个文件都没选
return;
QTreeWidgetItem *parItem,*item; //节点
item=ui->treeFiles->currentItem(); //当前节点
if (item->type()==itImageItem) //若当前节点是图片节点,取其父节点作为父节点
parItem=item->parent();
else //否则取当前节点为父节点
parItem=item;
for (int i = 0; i < files.size(); ++i)
{
QString aFilename=files.at(i); //得到StringList里的一行,也就是一个文件名
addImageItem(parItem,aFilename); //添加一个图片节点
}
}
void MainWindow::addImageItem(QTreeWidgetItem *parItem, QString aFilename)
{//添加一个图片文件节点
QIcon icon(":/images/icons/31.ico");//ICON的图标
QString NodeText=getFinalFolderName(aFilename); //获得最后的文件名称
QTreeWidgetItem *item; //节点
item=new QTreeWidgetItem(MainWindow::itImageItem); //新建节点时设定类型为 itImageItem
item->setIcon(colItem,icon); //设置图标
item->setText(colItem,NodeText); //最后的文件夹名称
item->setText(colItemType,"type=itImageItem"); //完整目录名称
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsAutoTristate); //设置节点选项
item->setCheckState(colItem,Qt::Checked); //节点选中
item->setData(colItem,Qt::UserRole,QVariant(aFilename)); //设置节点Qt::UserRole的Data,存储完整文件名称
parItem->addChild(item); //在父节点下面添加子节点
}
void MainWindow::on_treeFiles_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{ //当前节点选择变化时触发
Q_UNUSED(previous);
if (current==NULL)
return;
int var=current->type();//节点的类型
switch(var)
{
case itTopItem: //顶层节点
ui->actAddFolder->setEnabled(true);
ui->actAddFiles->setEnabled(true);
ui->actDeleteItem->setEnabled(false); //顶层节点不能删除
break;
case itGroupItem: //文件组节点
ui->actAddFolder->setEnabled(true);
ui->actAddFiles->setEnabled(true);
ui->actDeleteItem->setEnabled(true);
break;
case itImageItem: //图片文件节点
ui->actAddFolder->setEnabled(false); //图片节点下不能添加目录节点
ui->actAddFiles->setEnabled(true);
ui->actDeleteItem->setEnabled(true);
displayImage(current); //显示图片
break;
}
}
void MainWindow::on_actDeleteItem_triggered()
{//删除节点
// QTreeWidgetItem *item,*parItem;
QTreeWidgetItem* item =ui->treeFiles->currentItem(); //当前节点
QTreeWidgetItem* parItem=item->parent(); //父节点
parItem->removeChild(item);//The removed item will not be deleted
delete item;
}
void MainWindow::on_actScanItems_triggered()
{//遍历节点
for (int i=0;itreeFiles->topLevelItemCount();i++)
{
QTreeWidgetItem *item=ui->treeFiles->topLevelItem(i); //顶层节点
changeItemCaption(item); //更改节点标题
}
}
void MainWindow::changeItemCaption(QTreeWidgetItem *item)
{ //改变节点的标题文字
QString str="*"+item->text(colItem); //节点标题前加“*”
item->setText(colItem,str); //设置节点标题
if (item->childCount()>0) //如果有子节点
for (int i=0;ichildCount();i++) //遍历子节点
changeItemCaption(item->child(i)); //调用自己,可重入的函数
}