目录
QTreeWidget(QWidget * parent = 0)
void setColumnCount(int columns) //设置列数int columnCount() const //获取列数
void QTreeWidget::addTopLevelItem(QTreeWidgetItem * item) //添加一个顶级条目到末尾void QTreeWidget::addTopLevelItems(const QList<QTreeWidgetItem *> & items) //添加多个顶级条目到末尾
void QTreeWidget::insertTopLevelItem(int index, QTreeWidgetItem * item)void QTreeWidget::insertTopLevelItems(int index, const QList<QTreeWidgetItem *> & 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)//参数里分别是当前高亮选中的条目,和之前高亮选中的条目
//该函数只查找一列的文本,其他列的文本是不查找的。如果需要查找所有列数据,那么要根据不同列号逐列查询。QList<QTreeWidgetItem *> QTreeWidget::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()
QList<QTreeWidgetItem *> QTreeWidget::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;i<ui->treeFiles->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;i<item->childCount();i++) //遍历子节点
???????changeItemCaption(item->child(i));??//调用自己,可重入的函数
}