QT 如何动态的创建右键菜单

西江残月 2011-11-11 04:41:23
我这里的需求是根据鼠标在不同的QGraphicsItem上,弹出不同的右键菜单,菜单里的菜单项数目不定,
我要完成点不同的菜单项给QGraphicsItem设不同的值,请问下该怎么实现?

QMenu *menu = new QMenu(this);
for (int i=0; i<MAX_META_STATUS_NUM; i++)
{
if (g_shmMetaPtr->metaStatus[i].iMetaType == itemMeta->meta.metaInfo.iTypeID)
{
menu->addAction(QObject::tr(g_shmMetaPtr->metaStatus[i].szName), this, SLOT(setMetaState()));
}
}
menu->exec(cur.pos());
delete menu;

主要是slot函数,不能传参数进去啊?
...全文
1181 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
开水泡馍 2013-08-09
  • 打赏
  • 举报
回复
楼主,你的问题最终怎么解决的?你的问题应该是不定数量的信号的统一响应吧?
西江残月 2011-11-22
  • 打赏
  • 举报
回复
又一天过去了,继续等待。。。
dbzhang800 2011-11-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 goldensea 的回复:]

看来这个问题没有理想的答案了!!!!
[/Quote]
多看看manual:

void QGraphicsItem::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event )
西江残月 2011-11-21
  • 打赏
  • 举报
回复
看来这个问题没有理想的答案了!!!!
西江残月 2011-11-21
  • 打赏
  • 举报
回复
楼上的,你的方法真的解决不了我的问题的,还是感谢你一直以来的关注吧!

关键是你貌似没有理解我的问题:

我要弹出的菜单不是要在程序里写死,菜单项名是g_shmMetaPtr->metaStatus[i].szName,要置的数也在
g_shmMetaPtr->metaStatus[i].val里,所以是靠循环加菜单的。。。

zhangweiguo828 2011-11-21
  • 打赏
  • 举报
回复
补充一点,在粘我说的那些代码之前,你可能需要把你的mouseReleaseEvent方法屏蔽掉。
zhangweiguo828 2011-11-21
  • 打赏
  • 举报
回复
void GraphView::contextMenuEvent ( QContextMenuEvent * event )
{
QMenu* popMenu = new QMenu(this);
popMenu->addAction(new QAction("添加", this));
popMenu->addAction(new QAction("删除", this));

//下面的mapFromGlobal你可能需要手动增加或者减少,我发现Qt映射的位置和实际的好像有差别
//this->itemAt(mapFromGlobal(QCursor::pos()))返回的是你的MetaItem指针(如果你是在那个item上点右键的话),然后你再根据你那个item里面的成员变量MetaType,来决定你想弹什么菜单。
if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加"修改"菜单 [1]*
{
popMenu->addAction(new QAction("修改", this));
}

popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
}
这个已经相当清楚了吧,你把这段代码粘到你的类里面,头文件都不用修改,运行一下就能看到了,我最近就在搞这个,刚弄完。
[Quote=引用 7 楼 goldensea 的回复:]

上面2位的回答,还是没有解决我的问题啊,也不知道是不是我的问题没有描述清楚。。。汗……

我有一个派生自QGraphicsItem的MetaItem,它里面有一个MetaType的成员变量,我现在的需求是在右键弹菜单时根据MetaType,弹不同的菜单,MetaItem还有一个变量是MetaState,我的目的就是根据弹出的菜单给MetaState给它设值。。。

比如:
有1个Met……
[/Quote]
西江残月 2011-11-21
  • 打赏
  • 举报
回复
完整的代码如下,请高人帮忙指点下:
void GraphView::mouseReleaseEvent(QMouseEvent *event)
{
if (Qt::RightButton == event->button())
{
QCursor cur = this->cursor();

MetaItem *itemMeta = qgraphicsitem_cast<MetaItem*>(item);
if (NULL != itemMeta)
{
QMenu *menu = new QMenu(this);
/*
for (int i=0; i<MAX_META_STATUS_NUM; i++)
{
if (g_shmMetaPtr->metaStatus[i].iMetaType == itemMeta->meta.metaInfo.iTypeID)
{
menu->addAction(QObject::tr(g_shmMetaPtr->metaStatus[i].szName), this, SLOT(setMetaOnState()));
}
}

menu->exec(cur.pos()); /* 同步菜单 , popup表示异步菜单 */
delete menu;
}
}

return QGraphicsView::mouseReleaseEvent(event);
}
西江残月 2011-11-21
  • 打赏
  • 举报
回复
上面2位的回答,还是没有解决我的问题啊,也不知道是不是我的问题没有描述清楚。。。汗……

我有一个派生自QGraphicsItem的MetaItem,它里面有一个MetaType的成员变量,我现在的需求是在右键弹菜单时根据MetaType,弹不同的菜单,MetaItem还有一个变量是MetaState,我的目的就是根据弹出的菜单给MetaState给它设值。。。

比如:
有1个MetaItem,需要弹“置0”,“置1”,2个菜单,那么就会根据我选择的菜单给MetaState设0或1
另有1个MetaItem,需要弹“置10”,“置20”,“置30”3个菜单,那么就会根据我选择的菜单给MetaState设10或20或30

大概需求就是这个样子,不知道有没有解?
zhangweiguo828 2011-11-21
  • 打赏
  • 举报
回复
void ListWidget::contextMenuEvent ( QContextMenuEvent * event )
{
QMenu* popMenu = new QMenu(this);
popMenu->addAction(new QAction("添加", this));
popMenu->addAction(new QAction("删除", this));

//下面的mapFromGlobal你可能需要手动增加或者减少,我发现Qt映射的位置和实际的好像有差别
if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加"修改"菜单 [1]*
{
popMenu->addAction(new QAction("修改", this));
}

popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
}

OK, 功能实现。记得在自己的代码总要把QAction连接到处理的slot上。上面的代码菜单是没有功能的。[Quote=引用 2 楼 goldensea 的回复:]

楼上的能具体的举例说下怎么用吗?
[/Quote]
西江残月 2011-11-14
  • 打赏
  • 举报
回复
楼上的能具体的举例说下怎么用吗?
在水一方 2011-11-14
  • 打赏
  • 举报
回复
首先把action创建好,之后再QGraphicsItem的右击函数中添加不久可以吗?你需要传递什么参数呀?如果确实没办法传递参数,你可以设置成员变量来传递。浅见。
j_qinshou 2011-11-12
  • 打赏
  • 举报
回复
使用Qt::CustomContextMenu。
它是发出QWidget::customContextMenuRequested信号,注意仅仅只是发信号,意味着要自己写显示右键菜单的slot。
这个信号是QWidget唯一与右键菜单有关的信号(也是自有的唯一信号)

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧