Используя следующий пример кода, родное меню в MacOS 10.9.5 с использованием Qt 5.3.2 не отображается при запуске приложения. Прежнее меню остается видимым, но никакие действия не могут быть выполнены с этой панелью инструментов. Если я переключаюсь на другое приложение или на другой рабочий стол, меню этого приложения становится видимым и пригодным для использования, как и ожидалось.
Мои вопросы в значительной степени совпадают со следующими, но ответ не работает для моего кода:
Здесь есть еще один очень похожий вопрос, и я уже изменил свой код в соответствии с предлагаемым ответом, но он также не работает:
Панель меню не отображается для простого кода QMainWindow, Qt Creator Mac OS
#include <QtGui>
#include <QtWidgets>
class MainWindow : public QMainWindow
{
public:
MainWindow();
private:
void create_actions_();
void create_menus_();
void about_();
void dummy_();
QMenuBar* menu_bar_;
QMenu* file_menu_;
QMenu* help_menu_;
QAction* action_about_;
QAction* action_dummy_;
};
MainWindow::MainWindow()
{
resize(800, 600);
create_actions_();
create_menus_();
}
void MainWindow::create_actions_()
{
action_about_ = new QAction(tr("About"), this);
action_dummy_ = new QAction(tr("Dummy"), this);
connect(action_about_, &QAction::triggered, this, &MainWindow::about_);
connect(action_dummy_, &QAction::triggered, this, &MainWindow::dummy_);
}
void MainWindow::create_menus_()
{
menu_bar_ = new QMenuBar(this);
file_menu_ = new QMenu(tr("&File"));
file_menu_->addAction(action_dummy_);
menu_bar_->addAction(file_menu_->menuAction());
help_menu_ = new QMenu(tr("&Help"));
help_menu_->addAction(action_about_);
menu_bar_->addAction(help_menu_->menuAction());
menu_bar_->setNativeMenuBar(true);
}
void MainWindow::about_()
{
QMessageBox::about(this, tr("About"), tr("FooBar"));
}
void MainWindow::dummy_()
{
QMessageBox::about(this, tr("Dummy"), tr("Dummy"));
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow main_window;
main_window.show();
return app.exec();
}
Мне очень жаль, что я снова поднимаю тот же вопрос, но я не могу комментировать как новичок (что откровенно отстой!).
Редактировать:
Я использую следующий файл CMake для сборки тестового проекта:
cmake_minimum_required(VERSION 2.8.12)
project(testproject)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5Widgets)
add_executable(testapp main.cpp mainwindow.h mainwindow.cpp)
target_link_libraries(testapp Qt5::Widgets)
Я внес пару изменений в ваш синтаксис. Но я думаю, что большая проблема может заключаться в том, что ваша реализация класса находится в том же файле, что и main (). Я считаю, что это вызывает проблемы для метакода, созданного для механизмов сигналов / слотов.
Это работает для меня:
main.cpp
#include <mainwindow.h>int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow main_window;
main_window.show();
return app.exec();
}
mainwindow.h
#include <QApplication>
#include <QtGui>
#include <QObject>class MainWindow : public QMainWindow
{
// NOTICE THIS MACRO
Q_OBJECT
//
public:
MainWindow();
public slots:
void dummy();
void about();
private:
void create_actions_();
void create_menus_();
QMenuBar* menu_bar_;
QMenu* file_menu_;
QMenu* help_menu_;
QAction* action_about_;
QAction* action_dummy_;
};
mainwindow.cpp
#include <mainwindow.h>
MainWindow::MainWindow()
{
resize( 800, 600 );
create_actions_();
create_menus_();
}
void MainWindow::about()
{
QMessageBox::about(this, tr("About"), tr("FooBar"));
}
void MainWindow::dummy()
{
QMessageBox::about( this, "Dummy", "Dummy");
}
void MainWindow::create_actions_()
{
action_about_ = new QAction( "About", this );
action_dummy_ = new QAction( "Dummy", this );
connect( action_about_, SIGNAL( triggered() ),
this, SLOT( about() ) );
connect( action_dummy_, SIGNAL( triggered() ),
this, SLOT( dummy() ) );
}
void MainWindow::create_menus_()
{
menu_bar_ = new QMenuBar( this );
file_menu_ = new QMenu( "&File" );
file_menu_->addAction( action_dummy_ );
menu_bar_->addMenu( file_menu_ );
help_menu_ = new QMenu( "&Help" );
help_menu_->addAction( action_about_ );
menu_bar_->addMenu( help_menu_ );
}
У меня была проблема с видимой, но не отвечающей строкой меню при запуске приложения при запуске в QtCreator. При изменении фокуса на другое приложение, а затем обратно, меню будет работать. Кроме того, это было хорошо сразу при запуске из терминала. Моя проблема заключалась в том, что пакет Mac «.app», созданный после компиляции, находился в пользовательском каталоге, поэтому мне пришлось установить его в QtCreator Project-> Run-> Working Dir: /my/custom/path/MyProgram.app/Contents/MacOS. и менубар работал нормально. Это был Qt 5.5.1 и OSX 10.11.