一个QMenu菜单对象,如果我们需要把它显示在特定的位置,显然首先要获取它的坐标相关属性,比如宽带、高度等等,然后在调用其popup或者exec方法(popup和exec的区别在于前者是非阻塞的而后者不是,另外注意官方文档不推荐使用show方法),另一方面,要获取菜单的这些属性确需要首先将其显示出来,因为Qt会动态地去调整菜单的大小,所以在显示菜单之前我们不能从size方法获取到正确的值,这就形成了先有鸡还是先有蛋这种蛋疼的问题,幸运的是,我们还有sizeHint方法,在显示菜单之前获取其尺寸,举例
connect(menu, &QMenu::aboutToShow, & {
menu_width = menu->[i]sizeHint/i.width();
menu_height = menu->[i]sizeHint/i.height();
menu_pos_y = …; menu_pos_x = …;
});
menu->popup(QPoint(menu_pos_x, menu_pos_y));
menu->move(QPoint(menu_pos_x, menu_pos_y));
虽然菜单的aboutToShow信号在其显示出来之前(也就是popup之前)会被调用,但是使用sizeHint我们依然能得到正确的菜单宽度和高度。PS:上面这个connect用法是Qt5针对C++11的lambda函数新搞出来的,用起来还挺方便的