Menubar отображается только после переключения приложения / рабочего стола на MacOS с использованием Qt5

Используя следующий пример кода, родное меню в MacOS 10.9.5 с использованием Qt 5.3.2 не отображается при запуске приложения. Прежнее меню остается видимым, но никакие действия не могут быть выполнены с этой панелью инструментов. Если я переключаюсь на другое приложение или на другой рабочий стол, меню этого приложения становится видимым и пригодным для использования, как и ожидалось.

Мои вопросы в значительной степени совпадают со следующими, но ответ не работает для моего кода:

Qt menubar не отображается

Здесь есть еще один очень похожий вопрос, и я уже изменил свой код в соответствии с предлагаемым ответом, но он также не работает:

Панель меню не отображается для простого кода 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)

4

Решение

Я внес пару изменений в ваш синтаксис. Но я думаю, что большая проблема может заключаться в том, что ваша реализация класса находится в том же файле, что и 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_ );
}
0

Другие решения

У меня была проблема с видимой, но не отвечающей строкой меню при запуске приложения при запуске в QtCreator. При изменении фокуса на другое приложение, а затем обратно, меню будет работать. Кроме того, это было хорошо сразу при запуске из терминала. Моя проблема заключалась в том, что пакет Mac «.app», созданный после компиляции, находился в пользовательском каталоге, поэтому мне пришлось установить его в QtCreator Project-> Run-> Working Dir: /my/custom/path/MyProgram.app/Contents/MacOS. и менубар работал нормально. Это был Qt 5.5.1 и OSX 10.11.

0

По вопросам рекламы [email protected]