4

次のコード例を使用すると、アプリケーションの起動時に、Qt 5.3.2 を使用する MacOS 10.9.5 のネイティブ メニューが表示されません。以前のメニューは引き続き表示されますが、このツールバーでアクションを実行することはできません。別のアプリケーションまたは別のデスクトップに切り替えると、このアプリケーションのメニューが表示され、期待どおりに使用できるようになります。

私の質問は次の質問とほぼ同じですが、私のコードでは答えが機能しません。

Qt メニューバーが表示されない

ここに別の非常によく似た質問があり、提案された回答に従ってコードを既に変更しましたが、どちらも機能しません。

シンプルな QMainWindow コード、Qt Creator Mac OS で MenuBar が表示されない

#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

2 に答える 2

0

構文にいくつかの変更を加えました。しかし、大きな問題は、クラスの実装が 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_ );
}
于 2014-09-25T00:34:15.070 に答える