2015-08-13 2 views
1

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

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

Идея показывает пользователю, где он (а) может найти вариант, и с помощью 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(); 
} 
+0

* Чтобы найти свое реальное положение * - Что вы подразумеваете под ** реальной позицией **? Поскольку состояние Qt docs для [pos] (http://doc.qt.io/qt-5/qwidget.html#pos-prop): * «Это свойство занимает позицию виджета в своем родительском виджетах». * Поэтому он возвращается правильно, так как его позиция (0,0) относительно MainWindow. – TheDarkKnight

+0

Как вы можете видеть на этом изображении: https://lut.im/FRDsH1pu/xNdjjPg5, первый 'pos()' возвращает 'QPoint (0,0)', но после зависания действия в меню 'pos () 'возвращает позицию меню на экране. Я хотел бы получить эту позицию напрямую. – Astalaseven

+0

Извините, но я не совсем уверен, о чем вы спрашиваете * * прямо забирайте эту позицию *. Похоже, вы получаете позиции, о которых вы просите. – TheDarkKnight

ответ

0

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

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