Панель меню не отображается для простого кода QMainWindow, Qt Creator Mac OS

У меня были проблемы с добавлением пункта меню во встроенную строку меню в приложении Qt для настольных ПК. Я скопировал код, предоставленный в справочной документации класса QMainWindow, для создания меню в очень простое приложение. К сожалению, он не обнаружился при запуске кода. Я просто пытаюсь добавить меню "Файл" в строку меню. Я использую Mac OSX 10.9.3 и Qt Creator 5.3.1.

Скриншоты моего кода ниже. Я попробовал и незакомментированный и закомментированный код в источнике mainwindow.cpp.

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

Любая помощь могла бы быть полезна! Спасибо!

Примечание: я знаю, что использование setNativeMenuBar(false) работает, но мне бы хотелось, чтобы работала встроенная строка меню Mac OS: та, которая отображается в самом верхнем левом углу.

5 ответов

Я же выдал в убунту с питоном

Я использовал метод setNativeMenubar меню menubar. Вы можете найти это в документации по C++ Pyqt.

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

Я знаю, что уже поздно, к 4 годам, но я столкнулся с той же проблемой и заметил это на форуме Qt для Ubuntu / Mac OS.

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

Добавьте следующее в ваш main.cpp, прежде чем объявить свое Mainwindow w:

QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar);

В моем случае мой файл main.cpp теперь выглядит так:

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

}

Это довольно старая ошибка Qt в OS X. Вы можете работать с QMenu и QMenuBar, вызывая QMenuBar:: addAction, QMenuBar::removeAction и QMenuBar:: insertAction. Хитрость заключается в вызове метода QMenu:: menuAction.

Проверьте код ниже:

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

Также вы можете проверить мой другой ответ здесь с фрагментом кода, готовым к компиляции и запуску.

Ответ с наибольшим количеством голосов работает для Python, но вопрос для C++. Однако метод тот же.

Вы можете добавить эту строку поверх вашего конструктора в mainwindow.cpp:

menuBar()->setNativeMenuBar(false);

Чтобы OS X могла управлять строкой меню, вам необходимо создать строку меню без родительского виджета. Это означает, что вmainwindow.cpp файл обычно вам придется создать строку меню в коде.

Это мой код, который также добавляет пункты меню "О программе" и "Настройки" в раскрывающемся меню "ПРОГРАММА", как это обычно бывает на 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 а также About являются классами, которые обрабатывают свои соответствующие окна, и код не включен.

Вам нужно будет удалить строку меню в форме пользовательского интерфейса главного окна, которая создается автоматически.

menu = self.menuBar()

menu.setNativeMenuBar(False)

Другие вопросы по тегам