Qt中实现树形结构可以使用QTreeWidget类,也可以使用QTreeView类,QTreeWidget继承自QTreeView类。树形效果如下图所示
ui->treeWidget->clear();
ui->treeWidget->setFrameStyle(QFrame::NoFrame);
ui->treeWidget->setHeaderLabel("tree widget");
ui->treeWidget->setHeaderHidden(true);
ui->treeWidget->setColumnCount(1);
Global_item->setIcon(0, QIcon(":/new/prefix1/image/begintesting.png"));
ui->treeWidget->setHeaderLabels(QStringList()<<"部门");
QTreeWidgetItem * item =new QTreeWidgetItem(QStringList()<<"研发部");
QTreeWidgetItem * item1 =new QTreeWidgetItem(QStringList()<<"行政部");
QTreeWidgetItem * item2 =new QTreeWidgetItem(QStringList()<<"财务部");
QTreeWidgetItem * item3 =new QTreeWidgetItem(QStringList()<<"研发部");
ui->treeWidget->addTopLevelItem(item);
ui->treeWidget->addTopLevelItem(item1);
ui->treeWidget->addTopLevelItem(item2);
QStringList herol1;
herol1<<"前端";
QTreeWidgetItem * xy=new QTreeWidgetItem(herol1);
item->addChild(xy);
QStringList herolx;
herol1<<"ui";
QTreeWidgetItem * xyx=new QTreeWidgetItem(herol1);
xy->addChild(xyx);
QStringList herol2;
herol2<<"xxx";
QTreeWidgetItem * xy1=new QTreeWidgetItem(herol2);
item->addChild(xy1);
QStringList herol3;
herol3<<"xxx ";
QTreeWidgetItem * xy2=new QTreeWidgetItem(herol3);
item1->addChild(xy2);
QStringList herol4;
herol4<<"xxx ";
QTreeWidgetItem * xy3=new QTreeWidgetItem(herol4);
item1->addChild(xy3);
QStringList herol5;
herol5<<"xxx ";
QTreeWidgetItem * xy4=new QTreeWidgetItem(herol5);
item2->addChild(xy4);
QStringList herol6;
herol6<<"xxx";
QTreeWidgetItem * xy5=new QTreeWidgetItem(herol6);
item2->addChild(xy5);
QTreeWidgetItem *topItem2 = new QTreeWidgetItem(ui->treeWidget);
topItem2->setText(0,"腾讯");
topItem2->setCheckState(0,Qt::Checked);
ui->treeWidget->addTopLevelItem(topItem2);
connect(ui->treeWidget,&QTreeWidget::itemClicked,this,&myMainWindow::treeWidgetClicked);
void myMainWindow::treeWidgetClicked(QTreeWidgetItem *item)
{
for (int i=0; i<item->childCount(); i++)
{
QTreeWidgetItem *pChildItem = item->child(i);
pChildItem->setCheckState(0,item->checkState(0));
}
}
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
m_menu= new QMenu(ui->treeWidget);
m_menu->addAction("添加");
m_menu->addAction("删除");
connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,
this,&serviceForm::slotMenuPopup);
void serviceForm::slotMenuPopup(const QPoint &pos)
{
m_menu->exec(ui->treeWidget->mapToGlobal(pos));
}
QTreeWidgetItem* item = new QTreeWidgetItem(ui.treeWidget);
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested,
this, &serviceForm::SlotCustomContextMenuRequested);
void serviceForm::SlotCustomContextMenuRequested(const QPoint& pos)
{
QAction*m_pact = new QAction(QStringLiteral("删除"), this);
QMenu *popMenu = new QMenu(this);
popMenu->addAction(m_pact);
connect(m_pact,&QAction::triggered,this,&serviceForm::DeleteItemFunction);
popMenu->exec(QCursor::pos());
}
void serviceForm::DeleteItemFunction()
{
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
if (currentItem == NULL)
{
return;
}
else
delete currentItem;
}
ui->treeWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->treeWidget->setMouseTracking(true);
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
ui->treeWidget->setHeaderHidden(true);
m_menu = new QMenu;
connect(ui->treeWidget, &QWidget::customContextMenuRequested, this, &serviceForm::SlotMenuListWidgetRightClicked);
connect(m_menu, &QMenu::triggered, this, &serviceForm::SlotGroupMenuClicked);
void serviceForm::SlotMenuListWidgetRightClicked(const QPoint &pos)
{
m_menu->clear();
QModelIndex index = ui->treeWidget->indexAt(pos);
int row = index.row();
QString groupName;
QAction* newAction = new QAction(m_menu);
newAction->setText("新增分组");
m_menu->addAction(newAction);
if (groupName != "") {
QAction* deleteAction = new QAction(m_menu);
deleteAction->setText("删除分组");
m_menu->addAction(deleteAction);
}
m_menu->exec(cursor().pos());
}
void serviceForm::SlotGroupMenuClicked(QAction* action)
{
if (action->text() == "新增分组") {
int rowCount = ui->treeWidget->topLevelItemCount();
QTreeWidgetItem* itemxx = new QTreeWidgetItem(QStringList("请设置分组名称"));
itemxx->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable);
ui->treeWidget->insertTopLevelItem(rowCount, itemxx);
}
else if (action->text() == QStringLiteral("删除分组")) {
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
delete currentItem;
}
}