Qt树形控件QTreeView使用2

这种三态叫Tristate。

要设置条目有复选框只需要使用QStandardItem的函数setCheckable,无论是两态还是三态都需要先setCheckable,setCheckable默认是两态,如果希望是三态的话,需要再setTristate

示例代码如下:(树形视图节点的具体添加方法见上篇文章)

QStandardItemModel* model = new QStandardItemModel(ui->treeView);model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("项目名")<<QStringLiteral("信息"));QStandardItem* itemProject = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_Project")],QStringLiteral("项目"));model->appendRow(itemProject);model->setItem(model->indexFromItem(itemProject).row(),1,new QStandardItem(QStringLiteral("项目信息说明")));QStandardItem* itemFolder = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("文件夹1"));itemProject->appendRow(itemFolder);itemProject->setChild(itemFolder->index().row(),1,new QStandardItem(QStringLiteral("信息说明")));itemFolder = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("文件夹2"));itemProject->appendRow(itemFolder);for(int i=0;i<5;++i){QStandardItem* itemgroup = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_group")],QStringLiteral("组%1").arg(i+1));itemFolder->appendRow(itemgroup);for(int j=0;j<(i+1);++j){QStandardItem* itemchannel = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_channel")],QStringLiteral("频道%1").arg(j+1));itemgroup->appendRow(itemchannel);itemgroup->setChild(itemchannel->index().row(),1,new QStandardItem(QStringLiteral("频道%1信息说明").arg(j+1)));}}itemProject->setChild(itemFolder->index().row(),1,new QStandardItem(QStringLiteral("文件夹2信息说明")));itemProject = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_Project")],QStringLiteral("项目2"));model->appendRow(itemProject);for(int i =0;i<3;++i){itemFolder = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("项目2文件夹%1").arg(i+1));itemFolder->setCheckable(true);itemFolder->setTristate(true);QStandardItem* itemFolderDes = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_group")],QStringLiteral("文件夹%1组").arg(i+1));itemProject->appendRow(itemFolder);itemProject->setChild(itemFolder->index().row(),1,itemFolderDes);for(int j=0;j<i+1;++j){QStandardItem* item = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_dataItem")],QStringLiteral("项目%1").arg(j+1));item->setCheckable(true);itemFolder->appendRow(item);}}//关联项目属性改变的信号和槽connect(model,&QStandardItemModel::itemChanged,this,&Widget::treeItemChanged);//connect(model,SIGNAL(itemChanged(QStandardItem*)),this,SLOT(treeItemChanged(QStandardItem*)));ui->treeView->setModel(model);

m_publicIconMap[QStringLiteral("treeItem_Project")] = QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/Project.png"));m_publicIconMap[QStringLiteral("treeItem_folder")] = QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/folder.png"));m_publicIconMap[QStringLiteral("treeItem_folder-ansys")] = QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/folder-ansys.png"));m_publicIconMap[QStringLiteral("treeItem_group")] = QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/group.png"));m_publicIconMap[QStringLiteral("treeItem_channel")] = QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/channel.png"));

效果图:

2.三态复选框的智能关联

三态复选框的主要体现就在树形控件里,如果子项目全选,父级需要全选,如果子项目部分选,父级就是不完全选

下图是三态的正确表现方法

但QTreeView在QStandardItem设置复选框后,并不是按照规则的,这时需要进行代码设置2.1 捕获复选框改变的信号

要对复选框进行操作,首先需要捕获树形视图的复选框改变发出的信号

通过QStandardItemModel设置的项目,任何改变都会触发void QStandardItemModel::itemChanged(QStandardItem * item)信号

因此需要定义一个槽函数和这个信号关联

private slots :void treeItem_CheckChildChanged ( QStandardItem * item );

关联代码写在model创建之后的地方:

天下无难事,只怕有心人。

Qt树形控件QTreeView使用2

相关文章:

你感兴趣的文章:

标签云: