1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 1999 Reginald Stadlbauer <reggie@kde.org>
4 SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
5 SPDX-FileCopyrightText: 2000 Nicolas Hadacek <haadcek@kde.org>
6 SPDX-FileCopyrightText: 2000 Kurt Granroth <granroth@kde.org>
7 SPDX-FileCopyrightText: 2000 Michael Koch <koch@kde.org>
8 SPDX-FileCopyrightText: 2001 Holger Freyther <freyther@kde.org>
9 SPDX-FileCopyrightText: 2002 Ellis Whitehead <ellis@kde.org>
10 SPDX-FileCopyrightText: 2005-2006 Hamish Rodda <rodda@kde.org>
11
12 SPDX-License-Identifier: LGPL-2.0-only
13*/
14
15#ifndef KACTIONCOLLECTION_H
16#define KACTIONCOLLECTION_H
17
18#include <KStandardAction>
19#include <KStandardActions>
20#include <kxmlgui_export.h>
21
22#include <QAction>
23#include <QObject>
24#include <memory>
25
26class KXMLGUIClient;
27class KConfigGroup;
28class QActionGroup;
29class QString;
30
31/*!
32 * \class KActionCollection
33 * \inmodule KXmlGui
34 *
35 * \brief A container for a set of QAction objects.
36 *
37 * KActionCollection manages a set of QAction objects. It
38 * allows them to be grouped for organized presentation of configuration to the user,
39 * saving + loading of configuration, and optionally for automatic plugging into
40 * specified widget(s).
41 *
42 * Additionally, KActionCollection provides several convenience functions for locating
43 * named actions, and actions grouped by QActionGroup.
44 *
45 * \note If you create your own action collection and need to assign shortcuts
46 * to the actions within, you have to call associateWidget() or
47 * addAssociatedWidget() to have them working.
48 */
49class KXMLGUI_EXPORT KActionCollection : public QObject
50{
51 friend class KXMLGUIClient;
52
53 Q_OBJECT
54
55 /*!
56 * \property KActionCollection::configGroup
57 */
58 Q_PROPERTY(QString configGroup READ configGroup WRITE setConfigGroup)
59
60 /*!
61 * \property KActionCollection::configIsGlobal
62 */
63 Q_PROPERTY(bool configIsGlobal READ configIsGlobal WRITE setConfigGlobal)
64
65public:
66 /*!
67 * \brief Constructor.
68 *
69 * Allows specification of a component name other than the default
70 * application name, where needed (remember to call setComponentDisplayName() too).
71 */
72 explicit KActionCollection(QObject *parent, const QString &cName = QString());
73
74 /*!
75 * \brief Destructor.
76 */
77 ~KActionCollection() override;
78
79 /*!
80 * \brief Access the list of all action collections in existence for this app.
81 */
82 static const QList<KActionCollection *> &allCollections();
83
84 /*!
85 * \brief Clears the entire action collection, deleting all actions.
86 */
87 void clear();
88
89 /*!
90 * \brief Associate all actions in this collection to the given \a widget.
91 *
92 * Unlike addAssociatedWidget(), this method only adds all current actions
93 * in the collection to the given widget. Any action added after this call
94 * will not be added to the given widget automatically.
95 *
96 * So this is just a shortcut for a foreach loop and a widget->addAction call.
97 */
98 void associateWidget(QWidget *widget) const;
99
100 /*!
101 * \brief Associate all actions in this collection to the given \a widget,
102 * including any actions added after this association is made.
103 *
104 * This does not change the action's shortcut context, so if you need to have the actions only
105 * trigger when the widget has focus, you'll need to set the shortcut context on each action
106 * to Qt::WidgetShortcut (or better still, Qt::WidgetWithChildrenShortcut with Qt 4.4+)
107 */
108 void addAssociatedWidget(QWidget *widget);
109
110 /*!
111 * \brief Remove an association between all actions in this collection
112 * and the given \a widget, i.e. remove those actions from the widget,
113 * and stop associating newly added actions as well.
114 */
115 void removeAssociatedWidget(QWidget *widget);
116
117 /*!
118 * \brief Return a list of all associated widgets.
119 */
120 QList<QWidget *> associatedWidgets() const;
121
122 /*!
123 * \brief Clear all associated widgets and remove the actions from those widgets.
124 */
125 void clearAssociatedWidgets();
126
127 /*!
128 * \brief Returns the KConfig group with which settings will be loaded and saved.
129 */
130 QString configGroup() const;
131
132 /*!
133 * \brief Returns whether this action collection's configuration
134 * should be global to KDE ( \c true ),
135 * or specific to the application ( \c false ).
136 */
137 bool configIsGlobal() const;
138
139 /*!
140 * \brief Sets \a group as the KConfig group with which
141 * settings will be loaded and saved.
142 */
143 void setConfigGroup(const QString &group);
144
145 /*!
146 * \brief Set whether this action collection's configuration
147 * should be \a global to KDE ( \c true ),
148 * or specific to the application ( \c false ).
149 */
150 void setConfigGlobal(bool global);
151
152 /*!
153 * \brief Read all key associations from \a config.
154 *
155 * If \a config is zero, read all key associations from the
156 * application's configuration file KSharedConfig::openConfig(),
157 * in the group set by setConfigGroup().
158 */
159 void readSettings(KConfigGroup *config = nullptr);
160
161 /*!
162 * \brief Import all configurable global key associations from \a config.
163 *
164 * \since 4.1
165 */
166 void importGlobalShortcuts(KConfigGroup *config);
167
168 /*!
169 * \brief Export the current configurable global key associations to \a config.
170 *
171 * If \a writeDefaults is set to true, default settings will also be written.
172 *
173 * \since 4.1
174 */
175 void exportGlobalShortcuts(KConfigGroup *config, bool writeDefaults = false) const;
176
177 /*!
178 * \brief Write the current configurable key associations to \a config. What the
179 * function does if \a config is zero depends. If this action collection
180 * belongs to a KXMLGUIClient the setting are saved to the kxmlgui
181 * definition file. If not the settings are written to the applications
182 * config file.
183 *
184 * \note \a oneAction and \a writeDefaults have no meaning for the kxmlgui
185 * configuration file.
186 *
187 * \a config Config object to save to, or null.
188 *
189 * \a writeDefaults set to true to write settings which are already at defaults.
190 *
191 * \a oneAction pass an action here if you just want to save the values for one action, eg.
192 * if you know that action is the only one which has changed.
193 */
194 void writeSettings(KConfigGroup *config = nullptr, bool writeDefaults = false, QAction *oneAction = nullptr) const;
195
196 /*!
197 * \brief The number of actions in the collection.
198 *
199 * This is equivalent to actions().count().
200 */
201 int count() const;
202
203 /*!
204 * \brief Returns whether the action collection is empty or not.
205 */
206 bool isEmpty() const;
207
208 /*!
209 * \brief Returns the QAction* at position \a index in the action collection.
210 *
211 * This is equivalent to actions().value(index).
212 */
213 QAction *action(int index) const;
214
215 /*!
216 * \brief Get an action with the given \a name from the action collection.
217 *
218 * This won't return the action for the menus defined using a "<Menu>" tag
219 * in XMLGUI files (e.g. "<Menu name="menuId">" in "applicationNameui.rc").
220 *
221 * To access menu actions defined like this, use for example...
222 *
223 * \code
224 * qobject_cast<QMenu *>(guiFactory()->container("menuId", this));
225 * \endcode
226 *
227 * ...after having called setupGUI() or createGUI().
228 *
229 * Returns a pointer to the QAction in the collection that matches the parameters or
230 * null if nothing matches.
231 */
232 Q_INVOKABLE QAction *action(const QString &name) const;
233
234 /*!
235 * \brief Returns the list of QActions that belong to this action collection.
236 *
237 * The list is guaranteed to be in the same order the action were put into
238 * the collection.
239 */
240 QList<QAction *> actions() const;
241
242 /*!
243 * \brief Returns the list of QActions without an QAction::actionGroup()
244 * that belong to this action collection.
245 */
246 const QList<QAction *> actionsWithoutGroup() const;
247
248 /*!
249 * \brief Returns the list of all QActionGroups associated
250 * with actions in this action collection.
251 */
252 const QList<QActionGroup *> actionGroups() const;
253
254 /*!
255 * \brief Sets the \a componentName associated with this action collection.
256 *
257 * \warning Don't call this method on a KActionCollection that contains
258 * actions. This is not supported.
259 *
260 * \a componentName The name which is to be associated with this action collection,
261 * or QString() to indicate the app name. This is used to load/save settings into XML files.
262 * KXMLGUIClient::setComponentName takes care of calling this.
263 */
264 void setComponentName(const QString &componentName);
265
266 /*! \brief The component name with which this class is associated. */
267 QString componentName() const;
268
269 /*!
270 * \brief Set the component \a displayName associated with this action collection.
271 *
272 * This can be done, for example, for the toolbar editor.
273 *
274 * KXMLGUIClient::setComponentName takes care of calling this.
275 */
276 void setComponentDisplayName(const QString &displayName);
277
278 /*! \brief The display name for the associated component. */
279 QString componentDisplayName() const;
280
281 /*!
282 * \brief The parent KXMLGUIClient, or null if not available.
283 */
284 const KXMLGUIClient *parentGUIClient() const;
285
286Q_SIGNALS:
287 /*!
288 * \brief Indicates that \a action was inserted into this action collection.
289 */
290 void inserted(QAction *action);
291
292 /*!
293 * Emitted when an action has been inserted into, or removed from, this action collection.
294 * \since 5.66
295 */
296 void changed();
297
298 /*!
299 * \brief Indicates that \a action was hovered.
300 */
301 void actionHovered(QAction *action);
302
303 /*!
304 * \brief Indicates that \a action was triggered.
305 */
306 void actionTriggered(QAction *action);
307
308protected:
309 /// Overridden to perform connections when someone wants to know whether an action was highlighted or triggered
310 void connectNotify(const QMetaMethod &signal) override;
311
312protected Q_SLOTS:
313 virtual void slotActionTriggered();
314
315private Q_SLOTS:
316 KXMLGUI_NO_EXPORT void slotActionHovered();
317
318public:
319 /*!
320 * \brief Add an \a action under the given \a name to the collection.
321 *
322 * Inserting an action that was previously inserted under a different name will replace the
323 * old entry, i.e. the action will not be available under the old name anymore but only under
324 * the new one.
325 *
326 * Inserting an action under a name that is already used for another action will replace
327 * the other action in the collection (but will not delete it).
328 *
329 * If KAuthorized::authorizeAction() reports that the action is not
330 * authorized, it will be disabled and hidden.
331 *
332 * The ownership of the action object is not transferred.
333 * If the action is destroyed it will be removed automatically from the KActionCollection.
334 *
335 * \a name The name by which the action be retrieved again from the collection.
336 *
337 * \a action The action to add.
338 *
339 * Returns the same as the action given as parameter. This is just for convenience
340 * (chaining calls) and consistency with the other addAction methods, you can also
341 * simply ignore the return value.
342 */
343 Q_INVOKABLE QAction *addAction(const QString &name, QAction *action);
344
345 /*!
346 * \brief Adds a list of \a actions to the collection.
347 *
348 * The objectName of the actions is used as their internal name in the collection.
349 *
350 * The ownership of the action objects is not transferred.
351 * If the action is destroyed it will be removed automatically from the KActionCollection.
352 *
353 * Uses addAction(const QString&, QAction*).
354 *
355 * \sa addAction()
356 * \since 5.0
357 */
358 void addActions(const QList<QAction *> &actions);
359
360 /*!
361 * \brief Removes an \a action from the collection and deletes it.
362 */
363 void removeAction(QAction *action);
364
365 /*!
366 * \brief Removes an \a action from the collection.
367 *
368 * The ownership of the action object is not changed.
369 */
370 QAction *takeAction(QAction *action);
371
372 /*!
373 * \brief Creates a new standard action, adds it to the collection and connects the
374 * action's triggered(bool) signal to the specified receiver/member. The
375 * newly created action is also returned.
376 *
377 * \note Using KStandardAction::OpenRecent will cause a different signal than
378 * triggered(bool) to be used, see KStandardAction for more information.
379 *
380 * The action can be retrieved later from the collection by its standard name as per
381 * KStandardAction::stdName.
382 *
383 * The KActionCollection takes ownership of the action object.
384 *
385 * \a actionType The standard action type of the action to create.
386 *
387 * \a receiver The QObject to connect the triggered(bool) signal to. Leave nullptr if no
388 * connection is desired.
389 *
390 * \a member The SLOT to connect the triggered(bool) signal to. Leave nullptr if no
391 * connection is desired.
392 *
393 * Returns new action of the given type ActionType.
394 */
395 QAction *addAction(KStandardAction::StandardAction actionType, const QObject *receiver = nullptr, const char *member = nullptr);
396
397 /*!
398 * \brief Creates a new standard action, adds to the collection under the given name
399 * and connects the action's triggered(bool) signal to the specified
400 * receiver/member. The newly created action is also returned.
401 *
402 * \note Using KStandardAction::OpenRecent will cause a different signal than
403 * triggered(bool) to be used, see KStandardAction for more information.
404 *
405 * The action can be retrieved later from the collection by the specified name.
406 *
407 * The KActionCollection takes ownership of the action object.
408 *
409 * \a actionType The standard action type of the action to create.
410 *
411 * \a name The name by which the action be retrieved again from the collection.
412 *
413 * \a receiver The QObject to connect the triggered(bool) signal to. Leave nullptr if no
414 * connection is desired.
415 *
416 * \a member The SLOT to connect the triggered(bool) signal to. Leave nullptr if no
417 * connection is desired.
418 *
419 * Returns new action of the given type ActionType.
420 */
421 QAction *addAction(KStandardAction::StandardAction actionType, const QString &name, const QObject *receiver = nullptr, const char *member = nullptr);
422
423 /*!
424 * \brief This is the same as addAction(KStandardAction::StandardAction actionType, const QString &name, const QObject *receiver, const char *member)
425 * but using new style connect syntax.
426 *
427 * \a actionType The standard action type of the action to create.
428 *
429 * \a name The name by which the action be retrieved again from the collection.
430 *
431 * \a receiver The QObject to connect the triggered(bool) signal to.
432 *
433 * \a slot The slot or lambda to connect the triggered(bool) signal to.
434 *
435 * Returns new action of the given type ActionType.
436 *
437 * \sa addAction(KStandardAction::StandardAction, const QString &, const QObject *, const char *)
438 * \since 5.80
439 */
440#ifdef Q_QDOC
441 template<class Receiver, class Func>
442 inline QAction *addAction(KStandardAction::StandardAction actionType, const QString &name, const Receiver *receiver, Func slot)
443#else
444 template<class Receiver, class Func>
445 inline typename std::enable_if<!std::is_convertible<Func, const char *>::value, QAction>::type *
446 addAction(KStandardAction::StandardAction actionType, const QString &name, const Receiver *receiver, Func slot)
447#endif
448 {
449 QAction *action = KStandardAction::create(actionType, receiver, slot, nullptr);
450 action->setParent(this);
451 action->setObjectName(name);
452 return addAction(name, action);
453 }
454
455 /*!
456 * \brief This is the same as addAction(KStandardAction::StandardAction actionType, const QString &name, const Receiver *receiver, Func slot)
457 * but using KStandardActions from KConfigGui.
458 *
459 * \a actionType The standard action type of the action to create.
460 *
461 * \a name The name by which the action be retrieved again from the collection.
462 *
463 * \a receiver The QObject to connect the triggered(bool) signal to.
464 *
465 * \a slot The slot or lambda to connect the triggered(bool) signal to.
466 *
467 * Returns new action of the given type ActionType.
468 * \since 6.3
469 */
470#ifdef Q_QDOC
471 template<class Receiver, class Func>
472 inline QAction *addAction(KStandardActions::StandardAction actionType, const QString &name, const Receiver *receiver, Func slot)
473#else
474 template<class Receiver, class Func>
475 inline typename std::enable_if<!std::is_convertible<Func, const char *>::value, QAction>::type *
476 addAction(KStandardActions::StandardAction actionType, const QString &name, const Receiver *receiver, Func slot)
477#endif
478 {
479 // Use implementation from KConfigWidgets instead of KConfigGui
480 // as it provides tighter integration with QtWidgets applications.
481 QAction *action = KStandardAction::create(static_cast<KStandardAction::StandardAction>(actionType), receiver, slot, nullptr);
482 action->setParent(this);
483 action->setObjectName(name);
484 return addAction(name, action);
485 }
486
487 /*!
488 * Creates a new standard action and adds it to the collection.
489 *
490 * The newly created action is also returned.
491 *
492 * \a actionType The standard action type of the action to create.
493 *
494 * \a name The name by which the action be retrieved again from the collection.
495 *
496 * \return new action of the given type ActionType.
497 *
498 * \since 6.15
499 */
500 QAction *addAction(KStandardActions::StandardAction actionType, const QString &name);
501
502 /*!
503 * Creates a new standard action, adds it to the collection and connects the
504 * action's triggered(bool) signal to the specified receiver/member. The
505 * newly created action is also returned.
506 *
507 * \note Using KStandardAction::OpenRecent will cause a different signal than
508 * triggered(bool) to be used, see KStandardAction for more information.
509 *
510 * The action can be retrieved later from the collection by its standard name as per
511 * KStandardAction::stdName.
512 *
513 * The KActionCollection takes ownership of the action object.
514 *
515 * \a actionType The standard action type of the action to create.
516 *
517 * \a receiver The QObject to connect the triggered(bool) signal to. Leave nullptr if no
518 * connection is desired.
519 *
520 * \a slot The slot or lambda to connect the triggered(bool) signal to.
521 *
522 * Returns new action of the given type ActionType.
523 *
524 * \since 6.3
525 */
526#ifdef Q_QDOC
527 template<class Receiver, class Func>
528 inline QAction *addAction(KStandardActions::StandardAction actionType, const Receiver *receiver, Func slot)
529#else
530 template<class Receiver, class Func>
531 inline typename std::enable_if<!std::is_convertible<Func, const char *>::value, QAction>::type *
532 addAction(KStandardActions::StandardAction actionType, const Receiver *receiver, Func slot)
533#endif
534 {
535 // Use implementation from KConfigWidgets instead of KConfigGui
536 // as it provides tighter integration with QtWidgets applications.
537 // KStandardAction automatically adds it to the collection.
538 QAction *action = KStandardAction::create(static_cast<KStandardAction::StandardAction>(actionType), receiver, slot, this);
539 return action;
540 }
541
542 /*!
543 * Creates a new standard action and adds it to the collection.
544 * The newly created action is also returned.
545 *
546 * The action can be retrieved later from the collection by its standard name as per
547 * KStandardAction::stdName.
548 *
549 * The KActionCollection takes ownership of the action object.
550 *
551 * \a actionType The standard action type of the action to create.
552 *
553 * Returns new action of the given type ActionType.
554 *
555 * \since 6.9
556 */
557 QAction *addAction(KStandardActions::StandardAction actionType);
558
559 /*!
560 * Creates a new action under the given name to the collection and connects
561 * the action's triggered(bool) signal to the specified receiver/member. The
562 * newly created action is returned.
563 *
564 * \note KDE prior to 4.2 used the triggered() signal instead of the triggered(bool)
565 * signal.
566 *
567 * Inserting an action that was previously inserted under a different name will replace the
568 * old entry, i.e. the action will not be available under the old name anymore but only under
569 * the new one.
570 *
571 * Inserting an action under a name that is already used for another action will replace
572 * the other action in the collection.
573 *
574 * The KActionCollection takes ownership of the action object.
575 *
576 * \a name The name by which the action be retrieved again from the collection.
577 *
578 * \a receiver The QObject to connect the triggered(bool) signal to. Leave nullptr if no
579 * connection is desired.
580 *
581 * \a member The SLOT to connect the triggered(bool) signal to. Leave nullptr if no
582 * connection is desired.
583 *
584 * Returns new action of the given type ActionType.
585 */
586 QAction *addAction(const QString &name, const QObject *receiver = nullptr, const char *member = nullptr);
587
588 /*!
589 * \brief Creates a new action under the given name, adds it to the collection,
590 * and connects the action's triggered(bool) signal to the specified receiver/member.
591 *
592 * The receiver slot may accept either a bool or no
593 * parameters at all (i.e. slotTriggered(bool) or slotTriggered() ).
594 * The type of the action is specified by the template parameter ActionType.
595 *
596 * \note KDE prior to 4.2 connected the triggered() signal instead of the triggered(bool)
597 * signal.
598 *
599 * The KActionCollection takes ownership of the action object.
600 *
601 * \a name The internal name of the action (e.g. "file-open").
602 *
603 * \a receiver The QObject to connect the triggered(bool) signal to. Leave nullptr if no
604 * connection is desired.
605 *
606 * \a member The SLOT to connect the triggered(bool) signal to. Leave nullptr if no
607 * connection is desired.
608 *
609 * Returns new action of the given type ActionType.
610 *
611 * \sa addAction()
612 */
613 template<class ActionType>
614 ActionType *add(const QString &name, const QObject *receiver = nullptr, const char *member = nullptr)
615 {
616 ActionType *a = new ActionType(this);
617 if (receiver && member) {
618 connect(a, SIGNAL(triggered(bool)), receiver, member);
619 }
620 addAction(name, a);
621 return a;
622 }
623
624/*!
625 *
626 *
627 * \brief This is the same as add(const QString &name, const QObject *receiver, const char *member)
628 * but using new style connect syntax.
629 *
630 * \a name The internal name of the action (e.g. "file-open").
631 *
632 * \a receiver The QObject to connect the triggered(bool) signal to.
633 *
634 * \a slot The slot or lambda to connect the triggered(bool) signal to.
635 *
636 * Returns new action of the given type ActionType.
637 *
638 * \sa add(const QString &, const QObject *, const char *)
639 * \since 5.28
640 */
641#ifdef Q_QDOC
642 template<class ActionType, typename Receiver, typename Func>
643 ActionType *add(const QString &name, const Receiver *receiver, Func slot)
644#else
645 template<class ActionType, class Receiver, class Func>
646 inline typename std::enable_if<!std::is_convertible<Func, const char *>::value, ActionType>::type *
647 add(const QString &name, const Receiver *receiver, Func slot)
648#endif
649 {
650 ActionType *a = new ActionType(this);
651 connect(a, &QAction::triggered, receiver, slot);
652 addAction(name, a);
653 return a;
654 }
655
656/*!
657 * \brief This is the same as addAction(const QString &name, const QObject *receiver, const char *member)
658 * but using new style connect syntax.
659 *
660 * \a name The internal name of the action (e.g. "file-open").
661 *
662 * \a receiver The QObject to connect the triggered(bool) signal to.
663 *
664 * \a slot The slot or lambda to connect the triggered(bool) signal to.
665 *
666 * Returns new action of the given type ActionType.
667 *
668 * \sa addAction(const QString &, const QObject *, const char *)
669 * \since 5.28
670 */
671#ifdef Q_QDOC
672 template<class Receiver, class Func>
673 inline QAction *addAction(const QString &name, const Receiver *receiver, Func slot)
674#else
675 template<class Receiver, class Func>
676 inline typename std::enable_if<!std::is_convertible<Func, const char *>::value, QAction>::type *
677 addAction(const QString &name, const Receiver *receiver, Func slot)
678#endif
679 {
680 return add<QAction>(name, receiver, slot);
681 }
682
683 /*!
684 * \brief Returns the default primary shortcut for the given \a action.
685 *
686 * \since 5.0
687 */
688 static QKeySequence defaultShortcut(QAction *action);
689
690 /*!
691 * \brief Returns the default shortcuts for the given \a action.
692 *
693 * \since 5.0
694 */
695 static QList<QKeySequence> defaultShortcuts(QAction *action);
696
697 /*!
698 * \brief Sets the default \a shortcut for the given \a action.
699 *
700 * Since 5.2, this also calls action->setShortcut(shortcut),
701 * i.e. the default shortcut is made active initially.
702 *
703 * \since 5.0
704 */
705 static void setDefaultShortcut(QAction *action, const QKeySequence &shortcut);
706
707 /*!
708 * \brief Sets the default \a shortcuts in their specified shortcutContext()
709 * for the given \a action.
710 *
711 * Since 5.2, this also calls action->setShortcuts(shortcuts),
712 * i.e. the default shortcut is made active initially.
713
714 * \since 5.0
715 */
716 Q_INVOKABLE static void setDefaultShortcuts(QAction *action, const QList<QKeySequence> &shortcuts);
717
718 /*!
719 * \brief Returns true if the given \a action shortcuts may be configured by the user.
720 *
721 * \since 5.0
722 */
723 static bool isShortcutsConfigurable(QAction *action);
724
725 /*!
726 * \brief Sets whether the \a action shortcuts may be \a configurable
727 * by the user.
728 *
729 * \since 5.0
730 */
731 static void setShortcutsConfigurable(QAction *action, bool configurable);
732
733private:
734 KXMLGUI_NO_EXPORT explicit KActionCollection(const KXMLGUIClient *parent); // used by KXMLGUIClient
735
736 friend class KActionCollectionPrivate;
737 std::unique_ptr<class KActionCollectionPrivate> const d;
738};
739
740#endif
741

source code of kxmlgui/src/kactioncollection.h