joshf
joshf

Reputation: 251

MenuBar Not Showing for Simple QMainWindow Code, Qt Creator Mac OS

I have been having problems adding a menu item to the built in menu bar in a Qt desktop application. I copied the code provided in the QMainWindow class reference documentation for creating a menu to a very simple application. Unfortunately, it did not show up when the code was run. I am simply trying to add a “File” menu to the menu bar. I am running Mac OSX 10.9.3 and Qt Creator 5.3.1.

The screenshots of my code are below. I tried both the uncommented and commented code in the mainwindow.cpp source.

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //myMenuBar = menuBar();
    //fileMenu = myMenuBar -> addMenu(tr("&File"));

    fileMenu = menuBar() -> addMenu(tr("&File"));

    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QMenuBar* myMenuBar;
    QMenu* fileMenu;
};

#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();
}

ComeOnMenuBar.pro

#-------------------------------------------------
#
# Project created by QtCreator 2014-08-12T02:28:33
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ComeOnMenuBar
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

Any help would be really appreciated! Thank you!

Note: I know using setNativeMenuBar(false) works, but I would like the mac os native menu bar to work: the one that is displayed in the top-most left corner.

Upvotes: 10

Views: 15518

Answers (6)

NuclearPeon
NuclearPeon

Reputation: 6039

In order for OS X to gain control over the menu bar, you need to create the menu bar without a parent widget. This means in the mainwindow.cpp file typically, you'd have to create your menu bar in code.

This is my code that also puts in the About and Preferences menu items in the PROGRAM menu drop down as is standard on a mac:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    this->aboutAction = new QAction(0);
    this->aboutAction->setMenuRole(QAction::AboutRole);
    this->aboutWindow = new About();
    this->preferencesAction = new QAction(0);
    this->preferencesAction->setMenuRole(QAction::PreferencesRole);
    this->preferencesWindow = new Preferences();
    this->mainMenuBar = new QMenuBar(0);  // 0 explicitly states to create it with no parent
    this->mainMenu = new QMenu(0);        // Same here
    this->mainMenuBar->addMenu(this->mainMenu);
    this->mainMenu->addAction(this->aboutAction);
    this->mainMenu->addAction(this->preferencesAction);
    this->setMenuBar(this->mainMenuBar);
    // ...
}

Preferences and About are classes that handle their respective windows and code isn't included.

You will need to remove the menu bar in the mainwindow ui form that gets automatically generated.

Upvotes: 1

bhaskar.gaur
bhaskar.gaur

Reputation: 111

I know its late by 4 yrs, but i ran into same issue & spotted this on the Qt forum for ubuntu/Mac OS.

https://forum.qt.io/topic/7276/menu-not-showing-up-in-menubar/15

Add the following to your main.cpp before you declare your Mainwindow w:

QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar);

In my case my main.cpp file now looks like:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
AddressBook addressBook;
AddressBookController controller (&addressBook);
QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar); //fix for menubar notshowing in ubuntu

MainWindow w(&controller);
w.show();
return a.exec();

}

Upvotes: 9

Benjamin Lucidarme
Benjamin Lucidarme

Reputation: 1732

The answer that has the most upvote works for Python, but question is for C++. However, the method is the same.

You can add this line on top of your constructor in mainwindow.cpp:

menuBar()->setNativeMenuBar(false);

Upvotes: 2

Thinh Tồ
Thinh Tồ

Reputation: 11

menu = self.menuBar()

menu.setNativeMenuBar(False)

Upvotes: -1

jatinkumar patel
jatinkumar patel

Reputation: 2990

I had same issued in ubuntu with python

I used menubar's setNativeMenubar method. You can find this in c++ pyqt docs.

    menu = self.menuBar()
    menu.setNativeMenuBar(False)

Upvotes: 14

Max Go
Max Go

Reputation: 2102

It's pretty old Qt bug on OS X. You can work with QMenu and QMenuBar by calling QMenuBar::addAction, QMenuBar::removeAction and QMenuBar::insertAction. The trick is done by calling of QMenu::menuAction method.

Check the code below:

QMenu *menu = new QMenu("First menu");
menu->addAction("item 1");
menu->addAction("item 2");
m_menuBar->addAction(menu->menuAction());

Also you can check my another answer here with code snippet ready to compile and run.

Upvotes: 3

Related Questions