【问题标题】:Menubar is only shown after app/desktop switch on MacOS using Qt5菜单栏仅在使用 Qt5 在 MacOS 上切换应用程序/桌面后显示
【发布时间】:2014-11-19 13:17:26
【问题描述】:

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

我的问题与以下问题几乎相同,但答案不适用于我的代码:

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

我真的很抱歉我再次提出同样的问题,但我不允许作为新手制作任何 cmet(坦率地说,这很糟糕!)。

编辑: 我正在使用以下 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)

【问题讨论】:

  • 我也有类似的问题,请问您解决了吗?
  • 我也是 Qt 5.6.2 和 OSX 10.11.6。任何信息表示赞赏。

标签: c++ macos qt qmenubar


【解决方案1】:

我对您的语法做了一些更改。但我认为最大的问题可能是你的类实现与 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();
}

主窗口.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_;
};

主窗口.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_ );
}

【讨论】:

  • 感谢您的回答,但不幸的是您的代码也无法正常工作。你用 Qt5 测试过吗?似乎缺少 QMainWindow 的包含。在 Qt5 中,它位于 QtWidgets 中,并且包含到 QtGui 已不再足够。
  • 你是对的。我使用 Qt 4.8.6 构建了它。不过这不重要,您是否复制粘贴并包含 QMainWindow?你能链接你的 .pro 文件吗?
  • 你能重新发布那个 CMake 吗?不用担心代码块。
  • 我将它附加到我的问题末尾的原始代码中。
  • 使用 CMake 我为 Xcode 6.0.1 创建了一个项目并使用 Clang 构建代码。
【解决方案2】:

在 QtCreator 中启动应用程序时,我遇到了一个可见但无响应的菜单栏的问题。将焦点更改为另一个应用程序然后返回时,菜单栏将起作用。此外,从终端运行时立即可以。我的问题是编译后创建的Mac“.app”包位于自定义目录中,所以我必须在QtCreator Project->Run->Working Dir中设置:/my/custom/path/MyProgram.app/Contents/MacOS ,并且菜单栏工作正常。这是 Qt 5.5.1 和 OSX 10.11。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2017-05-15
    相关资源
    最近更新 更多