0

ウィンドウコンストラクタの外でQMenuBarにアクションを追加するにはどうすればよいですか?

ui_menu.hQMenuBarを使用してQtDesignerで作成されたファイルがあります:

#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);
}

しかし、それは次の例外を示しています:アクセス違反の読み取りで...

4

2 に答える 2

0

QtDesigner を使用してメニュー「Viev」を作成した場合、次menuBarの行は必要ありません。

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

このコードは私のために働きます:

void Menu::AddSubMenu()
{
    QAction *actionFirst = new QAction(this);
    actionFirst->setObjectName("actionFirst");
    actionFirst->setText("Test");
    ui->menuView->addAction(actionFirst);
}
于 2015-09-13T07:04:12.083 に答える