Search code examples
c++qtqaction

Add QAction to the QMenuBar dynamically outside of window constructor (get access to ui generated in Designer from another file)


How can I add some action to the QMenuBar outside of window constructor?

I have got some ui_menu.h file created in QtDesigner with QMenuBar:

#ifndef UI_MENU_H
#define UI_MENU_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QAction *actionTtt;
    QWidget *centralwidget;
    QMenuBar *menubar;
    QMenu *menuViev;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QStringLiteral("MainWindow"));
        MainWindow->resize(800, 600);
        actionTtt = new QAction(MainWindow);
        actionTtt->setObjectName(QStringLiteral("actionTtt"));
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QStringLiteral("centralwidget"));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName(QStringLiteral("menubar"));
        menubar->setGeometry(QRect(0, 0, 800, 21));
        menuViev = new QMenu(menubar);
        menuViev->setObjectName(QStringLiteral("menuFile"));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName(QStringLiteral("statusbar"));
        MainWindow->setStatusBar(statusbar);

        menubar->addAction(menuFile->menuAction());
        menuViev->addAction(actionTtt);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi


};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MENU_H

and in menu.cpp create class of that window:

Menu::Menu(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

In this class I need a function that will add QAction to the QMenuBar

void Menu::AddSubMenu()
{
    actionFirst = new QAction(this);
    actionFirst->setObjectName("actionFirst");
    menuBar->addAction(menuViev->menuAction());
    menuViev->addAction(actionFirst);
}

But it shows exeption about: Access violation reading at...


Solution

  • If you created menu "Viev" in menuBar usnig QtDesigner then you do not need this line:

    ui->menuBar->addAction(ui->menuView->menuAction());

    This code works for me:

    void Menu::AddSubMenu()
    {
        QAction *actionFirst = new QAction(this);
        actionFirst->setObjectName("actionFirst");
        actionFirst->setText("Test");
        ui->menuView->addAction(actionFirst);
    }