Bringer-of-Light/Qt-Nice-Frameless-Window

menuBar 使用疑问

hereis00 opened this issue · 1 comments

你好,请问一下,我使用了 menuBar,然后把这个 menuBar 设置为窗口的“titleBar”,拖动 menuBar 可以控制窗口移动,但是怎么让 menuBar 里面的菜单可以响应?我试了事件过滤器也毫无反应。

// exampleforwindows/mainwindow.cpp 文件的开头部分

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QRect>

MainWindow::MainWindow(QWidget *parent) :
    CFramelessWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
#ifdef Q_OS_WIN
    //feel free to change this number to see how it works
    setResizeableAreaWidth(8);

    //set titlebar widget, wo we can drag MainWindow by it
// 删除titleBar,并在ui中把horizontalLayout拿出来放到一个dockWidget,
// 是为了下面可以把这一堆按钮放到menuBar中。
//    setTitleBar(ui->widgetTitlebar);
    setTitleBar(menuWidget()); // 让menuBar作为“标题栏”
    menuWidget()->setLayout(ui->horizontalLayout); // 把一堆按钮放上去
// ......其他代码......

我有方法解决我的问题了,做一个新的 menuWidget,把 ui 生成的控件作为新控件的子控件,这样菜单区域可以响应,而其他区域可以响应窗口操作。

    //set titlebar widget, wo we can drag MainWindow by it
//    setTitleBar(ui->widgetTitlebar);
    QWidget* oldMenuWidget = menuWidget();
    QWidget* newMenuWidget = new QWidget;
    QHBoxLayout* lyt = new QHBoxLayout(newMenuWidget);
    lyt->addWidget(new QPushButton("aaaaaaa"));
    lyt->addWidget(oldMenuWidget);
    lyt->addStretch();
    lyt->addWidget(new QPushButton("bbbbbbb"));
    setMenuWidget(newMenuWidget);
    setTitleBar(menuWidget());