在窗口构造函数之外动态地将QAction添加到QMenuBar中(可以从另一个文件访问Designer中生成的ui)

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

本文关键字:文件 访问 另一个 Designer ui 动态 构造函数 QAction QMenuBar 添加 窗口      更新时间:2023-10-16

如何在窗口构造函数之外的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);
}

如果你在menuBar中使用QtDesigner创建了菜单" view ",那么你不需要这一行:

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

这段代码为我工作:

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

帮助别人理解什么是ui。它是在menu.h中声明的Class:

#include "ui_menu.h"
class Menu: public QMainWindow
{
    Q_OBJECT
public:
....
private:
    Ui::MainWindow ui;