Панель меню не отображается для простого кода 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
являются классами, которые обрабатывают свои соответствующие окна, и код не включен.
Вам нужно будет удалить строку меню в форме пользовательского интерфейса главного окна, которая создается автоматически.