Menubar仅在使用Qt5的MacOS上的应用程序/桌面切换后显示

问题描述:

使用以下示例代码,启动应用程序时,不会显示使用Qt 5.3.2的MacOS 10.9.5上的本机菜单。前一个菜单仍然可见,但不能使用此工具栏执行任何操作。如果我切换到另一个应用程序或另一个桌面,此应用程序的菜单将按预期显示并可用。Menubar仅在使用Qt5的MacOS上的应用程序/桌面切换后显示

我的问题是几乎一样的下列之一,但答案不适合我的代码工作:

Qt menubar not showing

还有另外一个非常类似的问题在这里,我已经根据修改我的代码建议的答案,但它不工作之一:

MenuBar Not Showing for Simple QMainWindow Code, 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) 
+1

我有类似的问题,你解决了这个问题吗? – fghj 2016-05-06 12:44:08

+0

我也使用Qt 5.6.2和OSX 10.11.6。任何信息赞赏。 – tsh 2016-11-19 22:45:26

我做了几个修改你的语法。但我认为最大的问题可能是您的类实现与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_); 
} 
+1

谢谢您的回答,但不幸的是您的代码无法正常工作。你用Qt5测试过吗?似乎包含到QMainWindow的内容已丢失。在Qt5中,这个位于QtWidgets中,并且包含QtGui已经不够了。 – kingofthehill3 2014-09-25 20:46:20

+0

你说得对。我使用Qt 4.8.6构建这个。这应该不重要,但是,您是否复制粘贴并包含QMainWindow?你能链接你的.pro文件吗? – DaveyLaser 2014-09-25 21:47:18

+0

你可以重新发布CMake吗?不用担心代码块。 – DaveyLaser 2014-09-25 22:52:57

我有一个明显的问题,但没有反应的菜单栏upo在QtCreator中启动时启动应用程序。当将焦点转移到另一个应用程序,然后返回时,菜单栏将会起作用。另外,当从终端运行时立即可以。我的问题是编译后创建的Mac“.app”包在自定义目录中,所以我必须在QtCreator Project-> Run-> Working Dir中设置:/my/custom/path/MyProgram.app/Contents/MacOS ,菜单栏运行良好。这是Qt 5.5.1和OSX 10.11。