Добавить QAction в QMenuBar динамически вне конструктора окна (получить доступ к пользовательскому интерфейсу, созданному в Designer из другого файла)

Как я могу добавить некоторые действия в QMenuBar вне конструктора окна?

У меня есть немного ui_menu.h файл, созданный в QtDesigner с помощью 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

И в menu.cpp создать класс этого окна:

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

В этом классе мне нужна функция, которая добавит QAction в QMenuBar

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

Но это показывает исключение о нарушении прав доступа на …

0

Решение

Если вы создали меню «Viev» в menuBar usnig QtDesigner тогда вам не нужна эта строка:

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

Этот код работает для меня:

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

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

Чтобы помочь другим людям понять, что такое пользовательский интерфейс. Это класс, объявленный в menu.h:

#include "ui_menu.h"class Menu: public QMainWindow
{
Q_OBJECT

public:
....

private:
Ui::MainWindow ui;
0

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