Menus & toolbars
CommandBarFlyout
A contextual command surface with primary and secondary actions.
Example

Usage
Contextual actions for a photo
Click for a focus-preserving Transient toolbar; right-click or use the keyboard for an expanded, keyboard-focused Standard context menu.
#include <FluentQt/MenusToolbars.h>
using namespace fluent::menus_toolbars;
auto* flyout = new CommandBarFlyout(this);
auto* shareAction = new QAction(
QIcon(":/icons/share.svg"), "Share", this);
auto* saveAction = new QAction(
QIcon(":/icons/save.svg"), "Save", this);
auto* deleteAction = new QAction(
QIcon(":/icons/delete.svg"), "Delete", this);
auto* resizeAction = new QAction(
QIcon(":/icons/resize.svg"), "Resize", this);
auto* moveAction = new QAction(
QIcon(":/icons/move.svg"), "Move", this);
flyout->addPrimaryAction(shareAction);
flyout->addPrimaryAction(saveAction);
flyout->addPrimaryAction(deleteAction);
flyout->addSecondaryAction(resizeAction);
flyout->addSecondaryAction(moveAction);
// Proactive click: keep focus on the invoking content.
connect(photo, &QAbstractButton::clicked, flyout, [=] {
flyout->showAt(
photo, CommandBarFlyout::ShowMode::Transient);
});
// Reactive context invocation: expand and enter the menu.
photo->setContextMenuPolicy(Qt::CustomContextMenu);
connect(photo, &QWidget::customContextMenuRequested,
flyout, [=](const QPoint& localPosition) {
flyout->showAtPoint(
photo, localPosition,
CommandBarFlyout::ShowMode::Standard);
});
using fluent::status_info::Toast;
for (QAction* action : flyout->primaryActions() + flyout->secondaryActions()) {
if (action->isSeparator()) continue;
connect(action, &QAction::triggered, this, [this, action] {
QString text = action->text().section('\t', 0, 0).remove('&');
Toast::showOrUpdateToast(this, "gallery.action-feedback", text + " selected",
Toast::Informational, 2200, Toast::Top, QMargins(16, 50, 16, 16));
});
}import fluentqt
from PySide6.QtCore import QMargins
from PySide6.QtCore import Qt
from PySide6.QtGui import QAction
flyout = fluentqt.CommandBarFlyout()
share_action = QAction("Share")
save_action = QAction("Save")
delete_action = QAction("Delete")
resize_action = QAction("Resize")
move_action = QAction("Move")
flyout.addPrimaryAction(share_action)
flyout.addPrimaryAction(save_action)
flyout.addPrimaryAction(delete_action)
flyout.addSecondaryAction(resize_action)
flyout.addSecondaryAction(move_action)
photo.clicked.connect(
lambda: flyout.showAt(photo, fluentqt.CommandBarFlyout.ShowMode.Transient)
)
photo.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
photo.customContextMenuRequested.connect(
lambda point: flyout.showAtPoint(
photo,
point,
fluentqt.CommandBarFlyout.ShowMode.Standard
)
)
for action in flyout.primaryActions() + flyout.secondaryActions():
if action.isSeparator():
continue
action.triggered.connect(
lambda checked=False, item=action: fluentqt.Toast.showOrUpdateToast(
photo,
"gallery.action-feedback",
item.text().split(chr(9), 1)[0].replace("&", "") + " selected",
fluentqt.Toast.Informational,
2200,
fluentqt.Toast.Top,
QMargins(16, 50, 16, 16)
)
)API
DeclarationNo matching API members.