一、演示预览
二、关键代码
代码如下:
_->_mainWindow = window;
// 设置透明度渐变动画
if (!_->opacityAnimation.targetObject())
{
_->opacityAnimation.setTargetObject(_->_mainWindow);
_->opacityAnimation.setPropertyName("windowOpacity");
_->opacityAnimation.setStartValue(1.0);
_->opacityAnimation.setEndValue(1.0);
}
QMenuBar *menuBar = _->_mainWindow->menuBar();
if (!menuBar)
{
return;
}
connect(ui->pushButtonMinimum, &QPushButton::clicked, _->_mainWindow, &QWidget::showMinimized);
connect(ui->pushButtonClose, &QPushButton::clicked, _->_mainWindow, &QWidget::close);
ui->tabWidgetMenuBar->clear();
auto menus = menuBar->actions();
for (auto i : menus)
{
auto menu = i->menu();
QList<QAction *> actions;
// 当没有菜单时
if (!menu)
actions.push_back(i);
else
actions = menu->actions();
auto widget = new QWidget;
auto layout = new QHBoxLayout(widget);
widget->setLayout(layout);
for (auto a : actions)
{
QWidget *w;
if (a->isSeparator())
{
auto line = new QWidget();
line->setFixedWidth(1);
line->setStyleSheet("background:rgb(177,177,177)");
w = line;
}
else
{
_->_mainWindow->addAction(a);
QToolButton *btn = new QToolButton;
btn->setText(a->text());
btn->setToolTip(a->text());
btn->setStatusTip(a->text());
a->setToolTip(a->text());
a->setStatusTip(a->text());
btn->setIconSize(QSize(32, 32));
btn->setAutoRaise(true);
if (a->menu())
{
btn->setPopupMode(QToolButton::MenuButtonPopup);
}
btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
btn->setCheckable(a->isCheckable());
btn->setChecked(a->isChecked());
// 无图标则自动添加默认图标
if ( a->icon().isNull() )
{
static QIcon defaultIcon(":/image/Bar.net.png");
a->setIcon(defaultIcon);
}
btn->setDefaultAction(a);
w = btn;
}
layout->addWidget(w);
}
layout->setSpacing(6);
layout->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Expanding));
ui->tabWidgetMenuBar->addTab(widget, i->text());
// 从菜单栏移除原有菜单项,否则当鼠标单击菜单位置时。仍会弹出菜单项
menuBar->removeAction(i);
}
window->setWindowFlag(Qt::FramelessWindowHint, true);
QObject::connect(window, &QMainWindow::windowTitleChanged, this, &QRibbon::setWindowTitle);
this->setWindowTitle(window->windowTitle());
window->installEventFilter(this);
window->menuBar()->setParent(0);
window->setMenuBar(this);
_styleMenu->actions()[0]->trigger();
_->_originGeometry = window->normalGeometry();
三、代码链接
https://download.youkuaiyun.com/download/u013083044/52894234