Multi window app with same QMenuBar
-
I would like to make 5 QMenu into QMenuBar. Each window have the same menu bar. What would be the best approach?
first.h
#pragma once #include <QMainWindow> #include <QMenuBar> #include "second.h" QT_BEGIN_NAMESPACE namespace Ui { class first; } QT_END_NAMESPACE class first : public QMainWindow { Q_OBJECT public: first(QWidget *parent = nullptr); ~first(); private slots: void changeWindow(); private: Ui::first *ui; second *sec; };
first.cpp
#include "first.h" #include "ui_first.h" #include <QDebug> first::first(QWidget *parent) : QMainWindow(parent), ui(new Ui::first) { ui->setupUi(this); QWidget* firstWindow = new QWidget; QMenuBar* menu = new QMenuBar(firstWindow); QMenu* menuFirst = new QMenu(menu); menuFirst->setObjectName("first"); menuFirst->setTitle("first"); QMenu* menuSecond = new QMenu(menu); menuSecond->setObjectName("second"); menuSecond->setTitle("second"); menu->addMenu(menuFirst); menu->addMenu(menuSecond); sec = new second(); connect(menuFirst, &QMenu::aboutToShow, this, &first::changeWindow); setCentralWidget(firstWindow); } first::~first() { delete ui; } void first::changeWindow() { if(sec->isVisible()) { sec->hide(); this->show(); } else { this->hide(); sec->show(); } }
With 2 window this is a good, but with 5 or 6 window this is a second-rate solution.
One thing came to mind, create an own menuBar which inherit from QMenuBar and make a function
create
and that create the menuBar to each window. But maybe there is better solution.What would be the best to the
changeWindow
function? -
When I click on a menuBar element, it change the widget.
The issue is that, if I click on a menuBar element, then I click on anywhere on the window, then I could not click on the the menuBar element. ( the menu lost the hoover )
QStackedWidget* mainWidget = new QStackedWidget; QWidget* widgetFirst = new QWidget(mainWidget); QWidget* widgetSecond = new QWidget(mainWidget); mainWidget->addWidget(widgetFirst); mainWidget->addWidget(widgetSecond); QMenuBar* menuBar = new QMenuBar(mainWidget); menuBar->setGeometry(0,0,400,25); QMenu* menuFirst = new QMenu(menuBar); menuFirst->setObjectName("first"); menuFirst->setTitle("first"); QMenu* menuSecond = new QMenu(menuBar); menuSecond->setObjectName("second"); menuSecond->setTitle("second"); menuBar->addMenu(menuFirst); menuBar->addMenu(menuSecond); QPushButton* pushButton_1 = new QPushButton(widgetFirst); pushButton_1->setText("widgetFirst"); pushButton_1->setGeometry(300,300,100,100); QPushButton* pushButton_2 = new QPushButton(widgetSecond); pushButton_2->setText("widgetSecond"); pushButton_2->setGeometry(200,200,100,100); connect(menuFirst, &QMenu::aboutToShow, this, [=]{first::changeWindow(mainWidget,widgetFirst);}); connect(menuSecond, &QMenu::aboutToShow, this, [=]{first::changeWindow(mainWidget,widgetSecond);}); setCentralWidget(mainWidget);
void first::changeWindow(QStackedWidget *w, QWidget* activate) { w->setCurrentWidget(activate); }
@kocka said in Multi window app with same QMenuBar:
QMenuBar* menuBar = new QMenuBar(mainWidget);
Why do you create a QMenuBar manually and why do you put it into QStackedWidget?
Use https://doc.qt.io/qt-5/qmainwindow.html#menuBar to access the menu bar instead. -
Hi,
Looks like you should take a look at QStackedWidget.
-
Hi,
Looks like you should take a look at QStackedWidget.
When I click on a menuBar element, it change the widget.
The issue is that, if I click on a menuBar element, then I click on anywhere on the window, then I could not click on the the menuBar element. ( the menu lost the hoover )
QStackedWidget* mainWidget = new QStackedWidget; QWidget* widgetFirst = new QWidget(mainWidget); QWidget* widgetSecond = new QWidget(mainWidget); mainWidget->addWidget(widgetFirst); mainWidget->addWidget(widgetSecond); QMenuBar* menuBar = new QMenuBar(mainWidget); menuBar->setGeometry(0,0,400,25); QMenu* menuFirst = new QMenu(menuBar); menuFirst->setObjectName("first"); menuFirst->setTitle("first"); QMenu* menuSecond = new QMenu(menuBar); menuSecond->setObjectName("second"); menuSecond->setTitle("second"); menuBar->addMenu(menuFirst); menuBar->addMenu(menuSecond); QPushButton* pushButton_1 = new QPushButton(widgetFirst); pushButton_1->setText("widgetFirst"); pushButton_1->setGeometry(300,300,100,100); QPushButton* pushButton_2 = new QPushButton(widgetSecond); pushButton_2->setText("widgetSecond"); pushButton_2->setGeometry(200,200,100,100); connect(menuFirst, &QMenu::aboutToShow, this, [=]{first::changeWindow(mainWidget,widgetFirst);}); connect(menuSecond, &QMenu::aboutToShow, this, [=]{first::changeWindow(mainWidget,widgetSecond);}); setCentralWidget(mainWidget);
void first::changeWindow(QStackedWidget *w, QWidget* activate) { w->setCurrentWidget(activate); }
-
When I click on a menuBar element, it change the widget.
The issue is that, if I click on a menuBar element, then I click on anywhere on the window, then I could not click on the the menuBar element. ( the menu lost the hoover )
QStackedWidget* mainWidget = new QStackedWidget; QWidget* widgetFirst = new QWidget(mainWidget); QWidget* widgetSecond = new QWidget(mainWidget); mainWidget->addWidget(widgetFirst); mainWidget->addWidget(widgetSecond); QMenuBar* menuBar = new QMenuBar(mainWidget); menuBar->setGeometry(0,0,400,25); QMenu* menuFirst = new QMenu(menuBar); menuFirst->setObjectName("first"); menuFirst->setTitle("first"); QMenu* menuSecond = new QMenu(menuBar); menuSecond->setObjectName("second"); menuSecond->setTitle("second"); menuBar->addMenu(menuFirst); menuBar->addMenu(menuSecond); QPushButton* pushButton_1 = new QPushButton(widgetFirst); pushButton_1->setText("widgetFirst"); pushButton_1->setGeometry(300,300,100,100); QPushButton* pushButton_2 = new QPushButton(widgetSecond); pushButton_2->setText("widgetSecond"); pushButton_2->setGeometry(200,200,100,100); connect(menuFirst, &QMenu::aboutToShow, this, [=]{first::changeWindow(mainWidget,widgetFirst);}); connect(menuSecond, &QMenu::aboutToShow, this, [=]{first::changeWindow(mainWidget,widgetSecond);}); setCentralWidget(mainWidget);
void first::changeWindow(QStackedWidget *w, QWidget* activate) { w->setCurrentWidget(activate); }
@kocka said in Multi window app with same QMenuBar:
QMenuBar* menuBar = new QMenuBar(mainWidget);
Why do you create a QMenuBar manually and why do you put it into QStackedWidget?
Use https://doc.qt.io/qt-5/qmainwindow.html#menuBar to access the menu bar instead. -
@kocka said in Multi window app with same QMenuBar:
QMenuBar* menuBar = new QMenuBar(mainWidget);
Why do you create a QMenuBar manually and why do you put it into QStackedWidget?
Use https://doc.qt.io/qt-5/qmainwindow.html#menuBar to access the menu bar instead.