在 window 构造函数之外动态地将 QAction 添加到 QMenuBar(从另一个文件访问在 Designer 中生成的 ui)
Add QAction to the QMenuBar dynamically outside of window constructor (get access to ui generated in Designer from another file)
如何在 window 构造函数之外向 QMenuBar 添加一些操作?
我在 QtDesigner 中使用 QMenuBar 创建了一些 ui_menu.h
文件:
#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
中创建 class window:
Menu::Menu(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
在这个 class 中,我需要一个将 QAction 添加到 QMenuBar 的函数
void Menu::AddSubMenu()
{
actionFirst = new QAction(this);
actionFirst->setObjectName("actionFirst");
menuBar->addAction(menuViev->menuAction());
menuViev->addAction(actionFirst);
}
但它显示异常:访问冲突读取...
如果您使用 Qt Designer 在 menuBar
中创建了菜单 "Viev",则不需要此行:
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。它是 Class 在 menu.h:
中声明的
#include "ui_menu.h"
class Menu: public QMainWindow
{
Q_OBJECT
public:
....
private:
Ui::MainWindow ui;
如何在 window 构造函数之外向 QMenuBar 添加一些操作?
我在 QtDesigner 中使用 QMenuBar 创建了一些 ui_menu.h
文件:
#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
中创建 class window:
Menu::Menu(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
在这个 class 中,我需要一个将 QAction 添加到 QMenuBar 的函数
void Menu::AddSubMenu()
{
actionFirst = new QAction(this);
actionFirst->setObjectName("actionFirst");
menuBar->addAction(menuViev->menuAction());
menuViev->addAction(actionFirst);
}
但它显示异常:访问冲突读取...
如果您使用 Qt Designer 在 menuBar
中创建了菜单 "Viev",则不需要此行:
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。它是 Class 在 menu.h:
中声明的#include "ui_menu.h"
class Menu: public QMainWindow
{
Q_OBJECT
public:
....
private:
Ui::MainWindow ui;