Qt之QTreeWidget
QTreeWidget类是创建和管理目录树结构的类,对应资源控件Item Widgets(Item-based)中的Tree Widget。在使用过程中直接拖拽控件到窗口中即可使用。
1.本文主要展示树控件的一些功能,具体功能如下:
(1)QTreeWidget的常规使用,如添加根节点、子节点,设置节点文本、图标、属性标记、角色数据等;
(2)动态添加子节点,本文上限设置成了7级;
(3)右键点击节点添加、删除节点功能;
示例效果如下:
1.常规功能
1.1添加节点
参数原型:explicit QTreeWidgetItem(int type = Type);
type表示节点的类型,在构造函数里传递一个类型值后,可以用QTreeWidgetItem::type()返回这个节点的类型值,自定义的节点值必须大于1000。
1.2设置文本
函数原型:void QTreeWidgetItem::setText(int column, const QString &atext);
setText函数需要传递一个列号,作为参数,指定哪个列进行设置。
1.3添加图标
函数原型:void QTreeWidgetItem::setIcon(int column, const QIcon &aicon);
setIcon函数需要传递一个列号,作为参数,指定哪个列进行设置。
1.4属性标记
函数原型:void setFlags(Qt::ItemFlags flags);
setFlags函数设置节点的一些属性标记,是Qt::ItemFlag枚举类型常量的组合。具体如下:
enum ItemFlag
{
NoItemFlags = 0, //不设置任何属性
ItemIsSelectable = 1, //可以选择
ItemIsEditable = 2, //可以编辑
ItemIsDragEnabled = 4, //可以拖动
ItemIsDropEnabled = 8, //它可以用作放置目标
ItemIsUserCheckable = 16, //它可以由用户选中或取消选中
ItemIsEnabled = 32, //用户可以与项目交互
ItemIsAutoTristate = 64, //用户可以循环通过三个不同的状态
}
1.5角色数据
函数原型:void setData(int column, int role, const QVariant &value);
setData函数为节点的某一列设置一个角色数据。其中,column是列号,role是角色的值,value是一个QVariant类型的数。role一般取值为Qt::UserRole,也可以自定义,使用QVariant data(int column, int role) const获取数据时role采用一样的角色值即可。
2.示例功能实现
2.1定义节点类型
本文设置了7级节点类型:
enum TreeItemType
{
TopItem = 1001,
SecondItem,
ThirdItem,
FourItem,
FiveItem,
SixItem,
SevenItem,
};
2.2头文件成员变量及函数定义
public:
//添加顶层节点
void AddTopItem(QTreeWidget *widget,TreeItemType type,QString text="text",QString iconPath="");
//添加子节点
void AddChildItem(QTreeWidgetItem *item,TreeItemType type,QString text="text",QString iconPath="");
private slots:
void showTreeRightMenu(QPoint point);
private:
Ui::TreeWidgetDlg *ui;
QMenu *m_menu;
2.3初始化树控件
2.3.1添加3个根节点
AddTopItem(ui->treeWidget,TopItem,QString::fromLocal8Bit("根节点1"),"../SRC/ico/software/emule.png");
AddTopItem(ui->treeWidget,TopItem,QString::fromLocal8Bit("根节点2"),"../SRC/ico/software/emule.png");
AddTopItem(ui->treeWidget,TopItem,QString::fromLocal8Bit("根节点3"),"../SRC/ico/software/emule.png");
2.3.2定义右键菜单
//为treeWidget选择右键用户自定义菜单
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
ui->treeWidget->setStyle(QStyleFactory::create("Windows"));
//连接树窗口右键信号与用户自定义菜单槽函数,这里的QPoint是树窗口
//任意坐标位置
this->connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showTreeRightMenu(QPoint)));
m_menu = new QMenu();
m_menu->addAction(QIcon("../SRC/ico/software/Search_02.png"),QString::fromLocal8Bit("增加子节点"));
m_menu->addAction(QIcon("../SRC/ico/software/Search_01.png"),QString::fromLocal8Bit("删除子节点"));
ui->treeWidget->expandAll();
2.4成员函数实现
2.4.1增加根节点
void TreeWidgetDlg::AddTopItem(QTreeWidget *widget, TreeWidgetDlg::TreeItemType type,QString text,QString iconPath)
{
QTreeWidgetItem *top = new QTreeWidgetItem(type);
top->setIcon(0,QIcon(iconPath));
top->setText(0,text);
top->setText(1,QString::number(type));
top->setFlags(Qt::ItemIsSelectable |
Qt::ItemIsUserCheckable |
Qt::ItemIsEnabled |
Qt::ItemIsAutoTristate);
top->setCheckState(0,Qt::Checked);
top->setData(0,Qt::UserRole,"11");
widget->addTopLevelItem(top);
}
2.4.2增加子节点
void TreeWidgetDlg::AddChildItem(QTreeWidgetItem *item, TreeWidgetDlg::TreeItemType type,QString text,QString iconPath)
{
QTreeWidgetItem *child = new QTreeWidgetItem(type);
child->setIcon(0,QIcon(iconPath));
child->setText(0,text);
child->setText(1,QString::number(type));
child->setFlags(Qt::ItemIsSelectable |
Qt::ItemIsUserCheckable |
Qt::ItemIsEnabled |
Qt::ItemIsAutoTristate);
child->setCheckState(0,Qt::Checked);
child->setData(0,Qt::UserRole,"11");
item->addChild(child);
}
2.4.3右键菜单
void TreeWidgetDlg::showTreeRightMenu(QPoint point)
{
//根据pos判断鼠标右击位置是树的根节点root,还是孩子节点child,或者都不是
//鼠标右击的位置是树的节点,则item是对应的节点信息,否则为NULL
QTreeWidgetItem* item = ui->treeWidget->itemAt(point);//关键
if(item == nullptr)
return;
QAction * action = m_menu->exec(cursor().pos());
if(action == nullptr)
return;
if(action->text() == QString::fromLocal8Bit("增加子节点"))
{
//暂设定添加子节点限值
int type = item->type();
if(type == SevenItem)
return;
type = type + 1;
QString info="";
QString ico="";
switch(type)
{
case SecondItem:
info = "Second";
ico = "../SRC/ico/software/Toolkit_03.png";
break;
case ThirdItem:
info = "Third";
ico = "../SRC/ico/software/Toolkit_02.png";
break;
case FourItem:
info = "Four";
ico = "../SRC/ico/software/winamp_3.ico";
break;
case FiveItem:
info = "Five";
ico = "../SRC/ico/software/Write_02.png";
break;
case SixItem:
info = "Six";
ico = "../SRC/ico/software/Write_03.png";
break;
case SevenItem:
info = "Seven";
ico = "../SRC/ico/software/winamp thunder.ico";
break;
default:
break;
}
int count = item->childCount();
AddChildItem(item,TreeItemType(type),QString::fromLocal8Bit("%1_%2").arg(info).arg(count),ico);
item->setExpanded(true);
}
else if(action->text() == QString::fromLocal8Bit("删除子节点"))
{
ui->treeWidget->removeItemWidget(item,0);
delete item;
}
}