Ищем реальную позицию QMenu

У меня есть проблема с поиском моего QMenu во время выполнения. menu->pos() должен отправить свою позицию обратно, но он отправляет QPoint(0,0). Чтобы найти его реальное положение, мне нужно открыть это меню и навести курсор на QAction.

Есть ли способ инициализировать правильное положение меню, не открывая это меню вручную?

Идея состоит в том, чтобы показать пользователю, где он может найти вариант, и использование exec или popup без правильной позиции не помогает…

mainwindow.cpp (QMAKE_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();
}

person Astalaseven    schedule 13.08.2015    source источник
comment
Чтобы найти его реальное положение. Что вы подразумеваете под реальным положением? Как указано в документации Qt для pos: Это Свойство содержит позицию виджета внутри его родительского виджета. Таким образом, оно возвращается правильно, так как его позиция равна (0,0) относительно MainWindow.   -  person TheDarkKnight    schedule 13.08.2015
comment
Как видно на этом изображении: lut.im/FRDsH1pu/xNdjjPg5 первый pos() возвращает QPoint(0,0), но после наведения действие в меню pos() возвращает положение меню на экране. Я хотел бы получить эту должность напрямую.   -  person Astalaseven    schedule 13.08.2015
comment
Извините, но я не совсем понимаю, что вы хотите сказать, говоря "получить эту позицию напрямую". Похоже, вы получаете должности, о которых просите.   -  person TheDarkKnight    schedule 14.08.2015


Ответы (1)


Ммм... Я знаю, что уже немного поздно, но есть две вещи:

  1. Поскольку строка меню создается в конструкторе, ей еще не назначена позиция, вам придется запрашивать позицию позже (может быть хорошим местом moveEvent, и вы обновили эту позицию, если окно перемещается).
  2. Если такая позиция все еще относительно родительского окна, вы можете использовать QMenuBar::mapToGlobal чтобы сопоставить локальное положение с экранными координатами.
person cbuchart    schedule 24.02.2017