在我的Windows应用程序中,我的QMenu从QWidget的某个角落弹出。为了计算弹出QMenu的确切位置,我使用以下语句
QPoint p = btn->mapToGlobal(QPoint(0,0));
//Now get the size of the menu
int widthmnu =mnu->geometry().width();
//Create new Qpoint
int new_x = p.x() - (widthmnu+5);
p.setX(new_x);
mnu->exec(p);
现在问题是这个方法第一次运行时mnu->geometry().width()
的结果是680(这是错误的,菜单弹出错误的地方)。现在,如果再次调用此方法,则mnu-> geometry()。width()的结果为140,这是正确的。我的问题是为什么我第一次菜单启动时总是得到错误的值。我有办法解决这个问题吗?我甚至无法想到一个适用于第一种情况的黑客行为。
更新 我注意到,如果生成.exec()方法,宽度值才是正确的。 所以第一次宽度错误然后执行exec()调用。之后,正确的宽度值就在那里。我还在寻找修复
答案 0 :(得分:4)
以下是documentation for QMenu::exec()的相关评论:
使用exec()或popup()定位菜单时,请记住您 不能依赖菜单的当前大小()。出于性能原因, 菜单仅在必要时调整其大小。所以在很多情况下,大小 演出前后不同。相反,使用sizeHint() 根据菜单的当前内容计算合适的大小。