寻找QMenu真实位置

时间:2015-08-13 07:55:31

标签: c++ qt c++11 position qmenu

我在运行时找到我的QMenu有些问题。 menu->pos()应该发回他的位置,但它会发送QPoint(0,0)。为了找到它的真实位置,我必须打开该菜单并悬停QAction。

有没有办法初始化正确的菜单位置而无需手动打开该菜单?

这个想法向用户展示了他可以找到一个选项的位置,并且在没有正确位置的情况下使用execpopup没有帮助......

mainwindow.cppQMAKE_CXXFLAGS += -std=c++11

#include "mainwindow.h"

#include <QMenu>
#include <QMenuBar>

#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QMenuBar * menuBar = new QMenuBar(this);
    QMenu    * menu    = new QMenu("File", this);

    menu->addAction("Action0");

    menuBar->addMenu(menu);

    qDebug() << menu->pos();

    connect(menu, &QMenu::hovered, this, [menu] {
        qDebug() << menu->pos();
    });

    setMenuBar(menuBar);
}

MainWindow::~MainWindow()
{

}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 };

 #endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:0)

嗯......我知道这是晚了,但有两件事:

  1. 由于菜单栏是在构造函数中创建的,它还没有分配任何位置,您以后必须查询该位置(moveEvent可能是一个好地方而你如果窗口移动,则更新该位置。
  2. 如果此位置仍然相对于父窗口,您可以使用QMenuBar::mapToGlobal将本地位置映射到屏幕坐标。