16class RibbonActionsManagerPrivate
20 RibbonActionsManagerPrivate();
23 QMap<int, QList<QAction *>> m_tagToActions;
24 QMap<int, QString> m_tagToName;
25 QHash<QString, QAction *> m_keyToAction;
26 QMap<QAction *, QString> m_actionToKey;
27 QMap<int, RibbonPage *> m_tagToPage;
32RibbonActionsManagerPrivate::RibbonActionsManagerPrivate()
37void RibbonActionsManagerPrivate::clear()
39 m_tagToActions.clear();
41 m_keyToAction.clear();
42 m_actionToKey.clear();
47RibbonActionsManager::RibbonActionsManager(
RibbonBar *bar)
68 d->m_tagToName[tag] =
name;
79 return d->m_tagToName.value(tag,
"");
90 QList<QAction *> willRemoveActs =
actions(tag);
93 d->m_tagToActions.remove(tag);
94 d->m_tagToName.remove(tag);
97 QList<QAction *> needRemoveActs;
98 QList<QAction *> remainingActs;
100 for (
auto i = d->m_tagToActions.begin(); i != d->m_tagToActions.end(); ++i) {
101 remainingActs += i.value();
103 for (QAction *a : willRemoveActs) {
104 if (!remainingActs.contains(a)) {
105 needRemoveActs.append(a);
109 for (QAction *a : needRemoveActs) {
110 auto i = d->m_actionToKey.find(a);
111 if (i != d->m_actionToKey.end()) {
112 d->m_keyToAction.remove(i.value());
113 d->m_actionToKey.erase(i);
139 k = QString(
"id_%1_%2").arg(d->m_salt++).arg(act->objectName());
141 if (d->m_keyToAction.contains(k)) {
144 <<
" have been exist,you can set key in an unique value when use RibbonActionsManager::registerAction";
147 d->m_keyToAction[k] = act;
148 d->m_actionToKey[act] = k;
150 bool isneedemit = !(d->m_tagToActions.contains(tag));
152 d->m_tagToActions[tag].append(act);
155 if (isneedemit && enableEmit) {
178 removeAction(act, enableEmit);
188void RibbonActionsManager::removeAction(QAction *act,
bool enableEmit)
191 QList<int> deletedTags;
192 QMap<int, QList<QAction *>> tagToActions;
194 if (!d->m_actionToKey.contains(act)) {
198 for (
auto i = d->m_tagToActions.begin(); i != d->m_tagToActions.end(); ++i) {
200 auto tmpi = tagToActions.insert(i.key(), QList<QAction *>());
202 for (
int j = 0; j < i.value().size(); ++j) {
203 QAction *tmpAct = i.value()[j];
205 tmpi.value().append(tmpAct);
211 tagToActions.erase(tmpi);
212 deletedTags.append(i.key());
216 QString
key = d->m_actionToKey.value(act);
217 d->m_actionToKey.remove(act);
218 d->m_keyToAction.remove(
key);
221 d->m_tagToActions.swap(tagToActions);
224 for (
int delTag : deletedTags) {
238 return d->m_tagToActions.value(tag);
248 return d->m_tagToActions.keys();
270 return d->m_actionToKey.value(act, QString());
280 return d->m_keyToAction.size();
290 return d->m_keyToAction.values();
310 QMap<int, RibbonPage *> res;
315 QSet<QAction *> ribbonBarActions;
317 for (QObject *o : bar->children()) {
318 if (QAction *a = qobject_cast<QAction *>(o)) {
319 if (!a->objectName().isEmpty()) {
320 ribbonBarActions.insert(a);
325 QSet<QAction *> pageActions;
326 QList<RibbonPage *> pages = bar->
pages();
330 QList<RibbonGroup *> groups = page->groupList();
339 QSet<QAction *> notInPageActions = ribbonBarActions - pageActions;
341 for (QAction *a : notInPageActions) {
342 if (!a->objectName().isEmpty()) {
346 if (notInPageActions.size() > 0) {
349 for (
auto i = res.begin(); i != res.end(); ++i) {
352 d->m_tagToPage = res;
366 QList<QAction *> was = w->actions();
368 for (QAction *a : was) {
369 if (res.contains(a) || a->objectName().isEmpty()) {
388 QList<QAction *> res;
390 if (
text.isEmpty()) {
393 QStringList kws =
text.split(
" ");
399 for (
const QString &k : kws) {
400 for (
auto i = d->m_actionToKey.begin(); i != d->m_actionToKey.end(); ++i) {
401 if (i.key()->text().contains(k, Qt::CaseInsensitive)) {
417 return qobject_cast<RibbonBar *>(parent());
427 for (
auto i = d->m_actionToKey.begin(); i != d->m_actionToKey.end(); ++i) {
439 QAction *act =
static_cast<QAction *
>(o);
441 removeAction(act,
false);
451 RibbonPage *page = qobject_cast<RibbonPage *>(sender());
456 int tag = d->m_tagToPage.key(page, -1);
467class RibbonActionsManagerModelPrivate
471 RibbonActionsManagerModelPrivate();
475 QAction *at(
int index)
const;
480 QString m_seatchText;
481 QList<QAction *> m_actions;
484RibbonActionsManagerModelPrivate::RibbonActionsManagerModelPrivate()
486 , m_tag(RibbonActionsManager::CommonlyUsedActionTag)
487 , m_seatchText(QString())
491void RibbonActionsManagerModelPrivate::updateRef()
496 if (!m_seatchText.isEmpty()) {
497 m_actions = m_mgr->search(m_seatchText);
499 m_actions = m_mgr->actions(m_tag);
503int RibbonActionsManagerModelPrivate::count()
const
508 return m_actions.size();
511QAction *RibbonActionsManagerModelPrivate::at(
int index)
const
516 if (index >= count()) {
519 return m_actions.at(index);
522bool RibbonActionsManagerModelPrivate::isNull()
const
544 if (parent.isValid()) {
554 if (role != Qt::DisplayRole) {
557 if (Qt::Horizontal == orientation) {
558 return tr(
"action name");
565 if (!index.isValid()) {
566 return Qt::NoItemFlags;
568 return (Qt::ItemIsSelectable | Qt::ItemIsEnabled);
580 case Qt::DisplayRole:
583 case Qt::DecorationRole:
612 d->m_actions = m->
actions(d->m_tag);
632 if (!index.isValid()) {
635 if (index.row() >= d->count()) {
638 return d->at(index.row());
648 d->m_seatchText =
text;
655 if (isdelete && (tag == d->m_tag)) {
659 if (tag == d->m_tag) {
QAction * indexToAction(QModelIndex index) const
void uninstallActionsManager()
void search(const QString &text)
查找
virtual int rowCount(const QModelIndex &parent) const override
RibbonActionsManagerModel(QObject *p=Q_NULLPTR)
virtual QVariant data(const QModelIndex &index, int role) const override
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
void onActionTagChanged(int tag, bool isdelete)
~RibbonActionsManagerModel()
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
void setupActionsManager(RibbonActionsManager *m)
void setAllActionCanCustomize(bool on=true)
此函数用于设置所有管理的action都可以自定义编辑
QSet< QAction * > autoRegisterWidgetActions(QWidget *w, int tag, bool enableEmit=false)
自动加载action
void unregisterAction(QAction *act, bool enableEmit=true)
取消action的注册
void actionTagChanged(int tag, bool isDeleted)
标签变化触发的信号,变化包括新增和删除
QString tagName(int tag) const
获取tag对应的中文名字
RibbonBar * ribbonBar() const
QList< QAction * > search(const QString &text)
根据标题查找action
QList< int > actionTags() const
获取所有的标签
QString key(QAction *act) const
通过action找到key
void removeTag(int tag)
移除tag
void onPageTitleChanged(const QString &title)
autoRegisteActions函数会关联此槽,在标签内容改变时改变tag 对应 文本
bool registerAction(QAction *act, int tag, const QString &key=QString(), bool enableEmit=true)
把action注册到管理器中,实现action的管理
QList< QAction * > actions(int tag) const
根据tag得到actions
@ NotInRibbonPageTag
不在功能区的标签autoRegisterActions 函数会遍历所有page的action以及RibbonBar下的action,如果两个
@ AutoPageDistinguishBeginTag
自动按Page划分的标签起始,在 autoRegisterActions 函数会用到
@ CommonlyUsedActionTag
预设tag-常用命令
int count() const
返回所有管理的action数
QAction * action(const QString &key) const
通过key获取action
void onActionDestroyed(QObject *o)
action 被delete时,将触发此槽把管理的action删除
QMap< int, RibbonPage * > autoRegisterActions(RibbonBar *bar)
自动加载RibbonBar的action 此函数会遍历RibbonBar 下的所有子object,找到action注册, 并会遍历所有RibbonPage,把RibbonPage下的action按Rib...
void setTagName(int tag, const QString &name)
设置tag对应的名字,通过这个可以得到tag和文本的映射
QList< QAction * > allActions() const
返回所有管理的actions
RibbonBar 继承 QMenuBar, 在 RibbonWindow 中直接替换了原来的 QMenuBar
QList< RibbonPage * > pages(bool getAll=true) const
获取当前显示的所有的RibbonPage,包含未显示的RibbonPageContext的RibbonPage也一并返回
static void setCanCustomize(QObject *obj, bool canbe=true)
group 用于对 ribbon 页窗口中的控件进行分组
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_FINI_PRIVATE()
#define QX_RIBBON_END_NAMESPACE
#define QX_RIBBON_BEGIN_NAMESPACE