第一种方法:
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());
}
}
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的处理过滤