给QTreeWidget添加右键菜单功能

第一种方法:

1、在包含有QTreeWidget的窗体中添加customContextMenuRequested的信号处理,同时要添加setContextMenuPolicy(Qt::CustomContextMenu)

2、为QTreeWidget添加节点,用SetData()函数来为每个节点赋予不同的键值。

如:

QTreeWidgetItem *root;

root = new QTreeWidgetItem(ui->treeWidget, QStringList(QString("treeItem1")));

QVariant var0(0);

root->setData(0, Qt::UserRole, var0);

3、在槽函数中h使用itemAt()函数获取当前被点击的QTreeWidget的节点,然后为不同的节点添加不两只的菜单

void MainWindow::on_customContextMenuRequested(const QPoint &pos)

{

      QTreeWidgtItem  *curItem =  ui->treeWidget->itemAt(pos);

      if (curItem == NULL) return;

     QVariant var = curItem->data(0, Qt::UserRole);

     if (var == 0) {

         QMenu menu;

         menu.addAction(ui->actionA); 

         menu.addAction(ui->actionB);

        menu.exec(QCursor::pos());

    }

}


 通过这种方式加右键菜单,只有当节点展开时,才能显示右键菜单,也就是说,最后一层的节点是不会弹出右键菜单的。
 
第二种方法:
用QTreeWidget的信号itemPressed(QTreeWidgetItem*, int),在对应的slot函数中添加判断是不是右键操作,菜单中添加actions,显示,代码如下:
if (!(QGuiApplication::mouseButtons() & Qt::RightButton)) return;

 if (item->type() == 1) ui.action_reportAdd->setEnabled(false);
 else {
  ui.action_reportAdd->setEnabled(true);
  ui.action_reportDel->setEnabled(true);
 }

 QMenu menu;
 menu.addAction(ui.action_reportAdd);
 menu.addAction(ui.action_reportDel);
 menu.exec(QCursor::pos());

但是会出现这种情况,如果装载QTreeWidget的窗口的父窗口重写了右键菜单操作(即信号customContextMenuRequested(const QPoint & pos)),当鼠标在QTreeWidgetItem上右键操作时,会先弹出itemPressed对应的槽的菜单,接着会弹出窗口的父窗口的右键菜单,需要在QTreeWidget的窗口中重写信号customContextMenuRequested的槽函数,不作任何操作,将窗口的父窗口的customContextMenuRequested的处理过滤
 

你可能感兴趣的:(给QTreeWidget添加右键菜单功能)