参考:http://www.cppblog.com/izualzhy/archive/2011/03/21/142408.html

原文粘贴:

新建一个窗口程序,然后创建一个QMenu对象。在构造函数里初始化
menu = new QMenu("menu", this); //menu在头文件声明
QAction *action = new QAction(tr("1111"), this); //为使目录较大,能看见,我们添加一个action
menu->addAction(action);

然后在mousePressEvent里看到效果
void Dialog::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::RightButton) //鼠标右键。避免无法关掉窗口
    {
        QPoint p(0, 0);
        //menu->exec(p); //测试用,坐标相对于桌面
        menu->exec(e->globalPos()); //坐标相对于窗口
        //menu->exec(e->pos()); //坐标相对于桌面
    }
}

可以看到,pos不管窗口怎样移动,menu总是出现在相同的地方。globalPos相对于窗口,跟着窗口移动.

pos不管窗口怎样移动,menu总是出现在相同的地方。
假设我们一直点击的是窗口右上角,menu总是出现在同样的地方。也就是类似于执行menu->exec(QPoint(1000,0))
所以p的值没变,但相对于桌面我们点的地方已经变了,只是相对窗口的坐标p一直是(1000,0),所以pos是相对窗口的。。。
globalPos相对于窗口,跟着窗口移动。不论我点哪菜单就在哪show,所以是相对桌面的,要不叫global呢~~

//------------------------------------------------------------------------------------------------------------------------------------------------------------

上面的解释拘谨于表面现象,得出的结论有点误导人。本人在程序中通过添加QLabel实例显示坐标信息,得知

globalPos(),给出的坐标信息是相对于桌面的,即以桌面左上角为原点。

pos(),是相对于窗口的,以窗口左上角为原点(去除边框)。即pos()给出的是一个相对位置坐标。而globalPos(),给出的是一个绝对坐标。

上例中巧用了一个上下文菜单来说明问题,因为上下文菜单出现的位置就是此时要设定的位置。

在qt4编程第2版中提到关于创建上下文菜单的方法:

1.重新实现QWidget::contextMenuEvent()函数,创建一个QMenu窗口部件,在其中添加所期望的那些动作,并用再对该窗口调用exec()函数。

2.设定窗口部件的contextmeunupolicy为Qt::ActionsContextMenu然后往窗口部件里面添加QAction实例。

http://blog.csdn.net/u013394556/article/details/38797295

最新文章

  1. Python-08-Socket
  2. 《zw版·Halcon-delphi系列原创教程》 酸奶自动分类脚本(机器学习、人工智能)
  3. td元素
  4. GEMR: Get the parent window for view
  5. vc 实现打印功能
  6. Java中Comparable和Comparator实现对象比较
  7. Nodejs v4.x.0API文档学习(2)Assert断言测试模块
  8. Qt5-控件-QMenu,QMenuBar-菜单栏详解-菜单热键-菜单校验功能
  9. javascript 变量转义
  10. HDU 3639 Hawk-and-Chicken(Tarjan缩点+反向DFS)
  11. hdu 4463 Outlets(最小生成树)
  12. 使用VS Code开发调试.NET Core 2.0
  13. 201521123060 《Java程序设计》第10周学习总结
  14. java程序的加载过程
  15. 【Unity Shaders】Diffuse Shading——使用2D ramp texture来创建一个假的BRDF(双向反射分布函数)
  16. [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP)
  17. 教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)
  18. luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
  19. 常用的cpl 命令 运行直接打开控制台的简单方法
  20. ios实例开发精品文章推荐(8.19)

热门文章

  1. UVA 11374 Airport Express SPFA||dijkstra
  2. 使用前端后台管理模板库admin-lte(转)
  3. NSArray NSDictionary一些用法
  4. 任哲<<μC/OS>>
  5. STATUS CODE: 91, occurs when trying to move media from one volume pool to another.
  6. 【Codeforces Round #185 (Div. 2) B】Archer
  7. [Angular2 Form] Angular 2 Template Driven Form Custom Validator
  8. windows cmd 查看文件目录树
  9. <Linux> xm 命令
  10. [Angular] Adding keyboard events to our control value accessor component