Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371916
  • 博文数量: 50
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 641
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-09 22:35
个人简介

不怕你失败,就怕你爬不起来。

文章分类

全部博文(50)

文章存档

2014年(50)

我的朋友

分类: 嵌入式

2014-09-21 01:44:46

    由于项目需要,这段时间需要实现类似QQ好友分组的功能,其中包括了新建分组、删除分组、重命名分组、移动好友到分组、删除好友、发送消息等,暂时列出这么一些需求吧。

    好友列表可以用QTreeWidget实现,根据父节点和子节点来建立不同的右键菜单;我们知道,建立菜单需要用到QMenu和QAction,其中QMenu建立菜单,QAction建立菜单子项,同时相应子项的相应操作(增加、删除等);现在的问题是,如果是固定的菜单,那就好办多了,但是我们事先是不知道有多少个分组的,因此需要根据当前好友列表中的分组数和分组名来建立菜单,这就需要建立动态多级菜单。

    建立动态多级菜单是简单的,但是响应动态new出来的QAction需要怎么做呢?如果是固定的菜单,连接QAction的triggered信号到对应的槽函数即可。但是动态建立的菜单子项如何连接信号到对应的槽函数呢?

    查了下QAction的API,发现动态建立出来的菜单子项无法获得具体的QAction,于是灵机一动,去查了下QMenu的API,终于让我发现了QMenu的triggerred(QAction*)信号,来看官方的API文档的解释:

void QMenu::triggered( * action) [signal]

This signal is emitted when an action in this menu is triggered.【当菜单中的动作被触发时发射该信号】

... ...

Note: This signal is emitted for the main parent menu in a hierarchy. Hence, only the parent menu needs to be connected to a slot; sub-menus need not be connected.

【该信号在action的上级菜单中触发,因此,只需要将上级菜单连接到槽函数即可,子菜单不需要连接】


    也就是说,sender是menu,而不是action。那么就可以通过发送triggerred(QAction*)信号来处理子菜单中的QAction了。部分实现代码如下:

  1. void MainWindow::contextMenuEvent(QContextMenuEvent *event)
  2. {
  3.     QMenu *menu = new QMenu(ui->treeWidget);
  4.     QAction *action = new QAction(tr("移动好友到分组"),this);
  5.     QMenu *menuChild = new QMenu(this);
  6.     QStringList listName;
  7.   
  8.  // const int COUNT = ui->treeWidget->topLevelItemCount();
  9.  // for(int i=0; i
  10.  // {
  11.  //     QString strText = ui->treeWidget->topLevelItem(i).text();
  12.  //     listName.append(strText);
  13.  // }

  14.     const int COUNT = listName.count();
  15.     for(int i=0; i<COUNT; ++i)
  16.     {
  17.         QAction *actionGroup = new QAction(listName.at(i), this);
  18.         menuChild->addAction(actionGroup);
  19.     }
  20.     connect(menuChild, SIGNAL(triggered(QAction*)),
  21.             this, SLOT(slot_show_groupname(QAction*)));    //连接menu的triggered信号到槽函数
  22.     action->setMenu(menuChild);
  23.     menu->addAction(action);
  24.     menu->exec(QCursor::pos());
  25. }


  26. void MainWindow::slot_show_groupname(QAction* action)
  27. {
  28.     QString strText = action->text();    //根据text来判断具体的action操作
  29.     if(strText == "我的好友")
  30.     {
  31.         qDebug() << "我的好友";   //这里只是一个示例 
  32.     }

  33.     if(strText == "我的家人")
  34.     {
  35.         qDebug() << "我的家人";
  36.     }

  37.     if(strText == "陌生人")
  38.     {
  39.         qDebug() << "陌生人";
  40.     }
  41. }

参考链接:
阅读(9927) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~