跳转到内容

NFlyout 浮出菜单

介绍

浮出菜单是一个浮动的弹出窗口,用于显示临时内容、菜单或提示信息。NFlyout 支持多种动画效果、自定义内容、自动定位和外部点击关闭等功能。

基本用法

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 创建内容
QWidget* content = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(content);
layout->addWidget(new QLabel("这是浮出菜单内容"));
layout->addWidget(new NPushButton("确定"));

// 设置内容
flyout->setContent(content);

// 在按钮处显示
NPushButton* button = new NPushButton("显示菜单");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

带菜单的浮出

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 创建菜单内容
NMenu* menu = new NMenu();
menu->addItem("编辑");
menu->addItem("删除");
menu->addItem("分享");

// 设置菜单为内容
flyout->setContent(menu);

// 在指定位置显示
NPushButton* moreButton = new NPushButton("更多");
connect(moreButton, &NPushButton::clicked, [=]() {
    flyout->showAt(moreButton);
});

自定义内容

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 创建自定义内容
QWidget* customContent = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(customContent);

// 添加标题
QLabel* title = new QLabel("选择操作");
title->setStyleSheet("font-weight: bold; font-size: 14px;");
layout->addWidget(title);

// 添加选项
QStringList options = {"选项1", "选项2", "选项3"};
for (const QString& option : options) {
    NPushButton* btn = new NPushButton(option);
    connect(btn, &NPushButton::clicked, [=]() {
        qDebug() << "选择了:" << option;
        flyout->hide();
    });
    layout->addWidget(btn);
}

flyout->setContent(customContent);

// 显示浮出菜单
NPushButton* showBtn = new NPushButton("显示");
connect(showBtn, &NPushButton::clicked, [=]() {
    flyout->showAt(showBtn);
});

动画效果

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 设置动画类型
flyout->setAnimationType(NFlyoutAnimationType::PULL_UP);  // 向上弹出
// 或其他动画类型:
// NFlyoutAnimationType::DROP_DOWN    // 向下弹出
// NFlyoutAnimationType::SLIDE_LEFT   // 从右向左滑入
// NFlyoutAnimationType::SLIDE_RIGHT  // 从左向右滑入
// NFlyoutAnimationType::FADE_IN      // 淡入
// NFlyoutAnimationType::NONE         // 无动画

// 创建内容
QLabel* content = new QLabel("带动画的浮出菜单");
flyout->setContent(content);

// 显示
NPushButton* button = new NPushButton("显示");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

定位控制

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 设置放置位置
flyout->setPlacement(Qt::TopEdge);  // 在目标上方
// 或其他位置:
// Qt::BottomEdge  // 在目标下方
// Qt::LeftEdge    // 在目标左方
// Qt::RightEdge   // 在目标右方

// 创建内容
QLabel* content = new QLabel("定位的浮出菜单");
flyout->setContent(content);

// 在指定控件处显示
NPushButton* button = new NPushButton("显示");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

外部点击关闭

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 设置外部点击关闭模式
flyout->setLightDismissMode(NFlyout::On);  // 启用外部点击关闭
// 或:
// NFlyout::Off   // 禁用外部点击关闭
// NFlyout::Auto  // 按平台决定

// 创建内容
QLabel* content = new QLabel("点击外部关闭");
flyout->setContent(content);

// 显示
NPushButton* button = new NPushButton("显示");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

// 监听关闭事件
connect(flyout, &NFlyout::closed, [=]() {
    qDebug() << "浮出菜单已关闭";
});

阴影效果

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 设置阴影效果
flyout->setShadowEffect(35, QPoint(0, 8));  // 模糊半径35,偏移(0, 8)

// 创建内容
QLabel* content = new QLabel("带阴影的浮出菜单");
flyout->setContent(content);

// 显示
NPushButton* button = new NPushButton("显示");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

内容边距

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 设置内容边距
flyout->setContentsMargins(16, 12, 16, 12);

// 创建内容
QWidget* content = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(content);
layout->addWidget(new QLabel("内容1"));
layout->addWidget(new QLabel("内容2"));

flyout->setContent(content);

// 显示
NPushButton* button = new NPushButton("显示");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

快速创建

cpp
// 使用静态方法快速创建和显示浮出菜单
QWidget* content = new QWidget();
QVBoxLayout* layout = new QVBoxLayout(content);
layout->addWidget(new QLabel("快速创建的浮出菜单"));

NPushButton* button = new NPushButton("显示");

NFlyout* flyout = NFlyout::createWithContent(
    content,
    button,
    nullptr,
    NFlyoutAnimationType::PULL_UP,
    true  // 关闭时自动删除
);

connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

自定义样式

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 设置圆角
flyout->setBorderRadius(8);

// 设置边框
flyout->setBorderWidth(1);

// 自定义颜色
flyout->setLightBackgroundColor(QColor(255, 255, 255));
flyout->setLightBorderColor(QColor(200, 200, 200));
flyout->setDarkBackgroundColor(QColor(45, 45, 45));
flyout->setDarkBorderColor(QColor(80, 80, 80));

// 创建内容
QLabel* content = new QLabel("自定义样式的浮出菜单");
flyout->setContent(content);

// 显示
NPushButton* button = new NPushButton("显示");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

淡出关闭

cpp
// 创建浮出菜单
NFlyout* flyout = new NFlyout();

// 创建内容
QLabel* content = new QLabel("浮出菜单");
flyout->setContent(content);

// 显示
NPushButton* button = new NPushButton("显示");
connect(button, &NPushButton::clicked, [=]() {
    flyout->showAt(button);
});

// 淡出关闭
NPushButton* closeBtn = new NPushButton("淡出关闭");
connect(closeBtn, &NPushButton::clicked, [=]() {
    flyout->fadeOut();
});

API

构造函数

构造函数说明
NFlyout(QWidget* parent = nullptr)创建浮出菜单

内容管理

方法说明参数/返回值
setContent(QWidget* content)设置浮出菜单内容内容控件
content()获取浮出菜单内容返回 QWidget*

目标和定位

方法说明参数/返回值
setTarget(QWidget* target)设置目标控件目标控件
target()获取目标控件返回 QWidget*
setPlacement(Qt::Edge placement)设置放置位置Qt::TopEdgeQt::BottomEdge
placement()获取放置位置返回 Qt::Edge

动画

方法说明参数/返回值
setAnimationType(NFlyoutAnimationType type)设置动画类型PULL_UPDROP_DOWNSLIDE_LEFTSLIDE_RIGHTFADE_INNONE
animationType()获取动画类型返回 NFlyoutAnimationType

外观控制

方法说明参数/返回值
setBorderRadius(int radius)设置圆角半径半径像素值
borderRadius()获取圆角半径返回 int
setBorderWidth(int width)设置边框宽度宽度像素值
borderWidth()获取边框宽度返回 int
setContentsMargins(const QMargins& margins)设置内容边距边距对象
contentsMargins()获取内容边距返回 QMargins

关闭模式

方法说明参数/返回值
setLightDismissMode(LightDismissMode mode)设置外部点击关闭模式AutoOnOff
lightDismissMode()获取外部点击关闭模式返回 LightDismissMode

效果

方法说明参数/返回值
setShadowEffect(int blurRadius, const QPoint& offset)设置阴影效果模糊半径、偏移量

显示/隐藏

方法说明参数/返回值
showAt(QWidget* target)在指定控件处显示目标控件
exec(const QPoint& pos)在指定坐标显示全局坐标
hide()隐藏浮出菜单-
fadeOut()淡出并关闭-
isOpen()判断是否已打开返回 bool

颜色属性

属性说明类型
lightBackgroundColor明亮主题背景色QColor
darkBackgroundColor暗黑主题背景色QColor
lightBorderColor明亮主题边框色QColor
darkBorderColor暗黑主题边框色QColor

信号

信号说明参数
opened()浮出菜单已打开-
opening()浮出菜单正在打开-
closed()浮出菜单已关闭-
closing()浮出菜单正在关闭-

静态方法

方法说明参数/返回值
createWithContent(QWidget* content, QWidget* target, QWidget* parent, NFlyoutAnimationType animType, bool isDeleteOnClose)快速创建浮出菜单返回 NFlyout*

主题定制

浮出菜单会自动响应应用主题变化,支持明亮和暗黑主题的自动切换。

基于 LGPL-3.0 许可发布