给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的处理过滤
 
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值