使用Qt将相同的菜单添加到多个窗口

时间:2017-01-22 12:42:20

标签: c++ qt

我正在用Qt写一个程序。 我有一个QMainWindow和一个名为createMenus()的函数,它返回一个QMenuBar *。

在MainWindow类:QMainWindow中,我调用:this-> setMenuBar(createMenus());

所以我有一个漂亮的MainWindow,顶部有一个菜单。

现在,在" File"中,我想放一个创建一个新窗口的按钮(大概是一个QWidget?)。 我想在新窗口的顶部显示相同的MenuBar。

void MainWindow::createWindow()
{
    QWidget* window = new QWidget;

    QVBoxLayout* center_box = new QVBoxLayout;
    center_box->setContentsMargins(0, 0, 0, 0);
    center_box->setSpacing(0);

#ifndef Q_OS_MAC
    QMenuBar* newMenu = createMenus();
    center_box->setMenuBar(newMenu);
#endif

    window->setLayout(center_box);
}

这适用于(在Linux中),因为QMenuBar显示在新窗口中。 后果是MainWindow的QMenuBar已经消失。

有人可以指导我使用相同的QMenuBar创建多个窗口的最佳实现吗?

1 个答案:

答案 0 :(得分:-1)

我已查找您的问题并注意到相同的行为,但您不能简单地复制QMenuBar的现有QMainWindow

然而,你可以使用像你一样的工厂方法,但你必须确保不返回 QMenuBar,否则菜单将不会显示。<登记/>

可能的实施:

QMenuBar* MainWindow::createMenu()
{
    QMenuBar *menu = new QMenuBar();


    menu->addMenu("Test0");
    menu->addMenu("Test1");
    menu->addMenu("Test2");
    menu->addMenu("Test3");

    return menu;
}

然后在你的方法中你可以做到:

void MainWindow::createWindow()
{
    QWidget* window = new QWidget;

    QVBoxLayout* center_box = new QVBoxLayout;

#ifndef Q_OS_MAC
    center_box->setMenuBar(createMenu());
#endif

    window->setLayout(center_box);
    window->show();
}

另一种方法是子类QMenuBar,但如果您想要创建特定类型的实现或添加到现有类的功能,则更为合适。

custommenubar.h

#ifndef CUSTOMMENUBAR_H
#define CUSTOMMENUBAR_H

#include <QObject>
#include <QMenuBar>

class CustomMenuBar : public QMenuBar
{
    Q_OBJECT

    public:
        explicit CustomMenuBar();
};

#endif // CUSTOMMENUBAR_H

custommenubar.cpp

#include "custommenubar.h"

CustomMenuBar::CustomMenuBar()
{
    addMenu("Test");
    addMenu("1");
    addMenu("2");
    addMenu("3");
}

然后在你的方法中:

void MainWindow::createWindow()
{
    QWidget* window = new QWidget;

    QVBoxLayout* center_box = new QVBoxLayout;

#ifndef Q_OS_MAC
    QMenuBar* newMenu = new CustomMenuBar();
    center_box->setMenuBar(newMenu);
#endif

    window->setLayout(center_box);
    window->show();
}

确保你负责清理所有事情:)