Here is an example to replicate the positioning problem of the menus when rotating from portrait to landscape.
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsProxyWidget>
#include <QTransform>
#include <QScreen>
#include <QOpenGLWidget>
#include <QMenu>
#include <QMenuBar>
#include <QAction>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView view;
QTransform transform;
QGraphicsScene scene;
QScreen *ps = QApplication::primaryScreen();
QGraphicsProxyWidget *proxy;
Qt::ScreenOrientation pso;
QSize dSize(ps->size());
if((pso = ps->orientation()) != Qt::LandscapeOrientation )
{
//Swap dimensions if height is larger than width
if(ps->isPortrait(pso))
{
dSize.transpose();
}
}
scene.setSceneRect(QRect(0,0,dSize.width(),dSize.height()));
transform=ps->transformBetween(Qt::InvertedLandscapeOrientation,pso,QRect(0,0,dSize.width(),dSize.height()));
view.setViewport(new QOpenGLWidget);
view.resize(ps->size());
view.setTransform(transform);
view.setScene(&scene);
view.ensureVisible(QRectF(0,0,dSize.width(),dSize.height()),0,0);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
QMainWindow *test = new QMainWindow;
test->setGeometry(QRect(0,0,dSize.width(),dSize.height()));
proxy = scene.addWidget(test);
QString tmpString = QObject::tr("File");
//Providing menu bar is really necessary (otherwise even the fileMenu is not positioned correctly)
QMenu *fileMenu = new QMenu(tmpString,test->menuBar());
tmpString = QObject::tr("Recently");
QMenu *fileSubMenu = new QMenu(tmpString,fileMenu);
test->menuBar()->addMenu(fileMenu);
tmpString = QObject::tr("blubb");
fileMenu->addAction(new QAction(tmpString,test));
fileMenu->addMenu(fileSubMenu);
tmpString = QObject::tr("blubb2");
fileSubMenu->addAction(new QAction(tmpString,test));
tmpString = QObject::tr("blubb3");
fileSubMenu->addAction(new QAction(tmpString,test));
view.show();
return a.exec();
}