我正在用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创建多个窗口的最佳实现吗?
答案 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();
}
确保你负责清理所有事情:)