KXmlGui

kxmlguiwindow.cpp
1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2000 Reginald Stadlbauer <reggie@kde.org>
4 SPDX-FileCopyrightText: 1997 Stephan Kulow <coolo@kde.org>
5 SPDX-FileCopyrightText: 1997-2000 Sven Radej <radej@kde.org>
6 SPDX-FileCopyrightText: 1997-2000 Matthias Ettrich <ettrich@kde.org>
7 SPDX-FileCopyrightText: 1999 Chris Schlaeger <cs@kde.org>
8 SPDX-FileCopyrightText: 2002 Joseph Wenninger <jowenn@kde.org>
9 SPDX-FileCopyrightText: 2005-2006 Hamish Rodda <rodda@kde.org>
10
11 SPDX-License-Identifier: LGPL-2.0-only
12*/
13
14#include "kxmlguiwindow.h"
15#include "debug.h"
16
17#include "kactioncollection.h"
18#include "kmainwindow_p.h"
19#include <KMessageBox>
20#include <kcommandbar.h>
21#ifdef WITH_QTDBUS
22#include "kmainwindowiface_p.h"
23#endif
24#include "kedittoolbar.h"
25#include "khelpmenu.h"
26#include "ktoolbar.h"
27#include "ktoolbarhandler_p.h"
28#include "kxmlguifactory.h"
29
30#ifdef WITH_QTDBUS
31#include <QDBusConnection>
32#endif
33#include <QDomDocument>
34#include <QEvent>
35#include <QList>
36#include <QMenuBar>
37#include <QStatusBar>
38#include <QWidget>
39
40#include <KAboutData>
41#include <KCommandBar>
42#include <KConfig>
43#include <KConfigGroup>
44#include <KLocalizedString>
45#include <KSharedConfig>
46#include <KStandardActions>
47#include <KToggleAction>
48
49#include <cctype>
50#include <cstdlib>
51
52/**
53 * A helper function that takes a list of KActionCollection* and converts it
54 * to KCommandBar::ActionGroup
55 */
56static QList<KCommandBar::ActionGroup> actionCollectionToActionGroup(const std::vector<KActionCollection *> &actionCollections)
57{
58 using ActionGroup = KCommandBar::ActionGroup;
59
60 QList<ActionGroup> actionList;
61 actionList.reserve(actionCollections.size());
62
63 for (const auto collection : actionCollections) {
64 const QList<QAction *> collectionActions = collection->actions();
65 const QString componentName = collection->componentDisplayName();
66
67 ActionGroup ag;
68 ag.name = componentName;
69 ag.actions.reserve(collection->count());
70 for (const auto action : collectionActions) {
71 /**
72 * If this action is a menu, fetch all its child actions
73 * and skip the menu action itself
74 */
75 if (QMenu *menu = action->menu()) {
76 const QList<QAction *> menuActions = menu->actions();
77
78 ActionGroup menuActionGroup;
79 menuActionGroup.name = KLocalizedString::removeAcceleratorMarker(action->text());
80 menuActionGroup.actions.reserve(menuActions.size());
81 for (const auto mAct : menuActions) {
82 if (mAct) {
83 menuActionGroup.actions.append(mAct);
84 }
85 }
86
87 /**
88 * If there were no actions in the menu, we
89 * add the menu to the list instead because it could
90 * be that the actions are created on demand i.e., aboutToShow()
91 */
92 if (!menuActions.isEmpty()) {
93 actionList.append(menuActionGroup);
94 continue;
95 }
96 }
97
98 if (action && !action->text().isEmpty()) {
99 ag.actions.append(action);
100 }
101 }
102 actionList.append(ag);
103 }
104 return actionList;
105}
106
107static void getActionCollections(KXMLGUIClient *client, std::vector<KActionCollection *> &actionCollections)
108{
109 if (!client) {
110 return;
111 }
112
113 auto actionCollection = client->actionCollection();
114 if (actionCollection && !actionCollection->isEmpty()) {
115 actionCollections.push_back(client->actionCollection());
116 }
117
118 const QList<KXMLGUIClient *> childClients = client->childClients();
119 for (auto child : childClients) {
120 getActionCollections(child, actionCollections);
121 }
122}
123
124class KXmlGuiWindowPrivate : public KMainWindowPrivate
125{
126public:
127 void slotFactoryMakingChanges(bool b)
128 {
129 // While the GUI factory is adding/removing clients,
130 // don't let KMainWindow think those are changes made by the user
131 // #105525
132 letDirtySettings = !b;
133 }
134
135 bool commandBarEnabled = true;
136 // Last executed actions in command bar
137 QList<QString> lastExecutedActions;
138
139 bool showHelpMenu : 1;
140 QSize defaultSize;
141
142 KDEPrivate::ToolBarHandler *toolBarHandler;
143 KToggleAction *showStatusBarAction;
144 QPointer<KEditToolBar> toolBarEditor;
145 KXMLGUIFactory *factory;
146};
147
149 : KMainWindow(*new KXmlGuiWindowPrivate, parent, flags)
150 , KXMLGUIBuilder(this)
151{
153 d->showHelpMenu = true;
154 d->toolBarHandler = nullptr;
155 d->showStatusBarAction = nullptr;
156 d->factory = nullptr;
157#ifdef WITH_QTDBUS
158 new KMainWindowInterface(this);
159#endif
160
161 /*
162 * Set up KCommandBar launcher action
163 */
164 auto a = actionCollection()->addAction(QStringLiteral("open_kcommand_bar"), this, [this] {
165 /*
166 * Do nothing when command bar is disabled
167 */
168 if (!isCommandBarEnabled()) {
169 return;
170 }
171
172 auto ac = actionCollection();
173 if (!ac) {
174 return;
175 }
176
177 auto kc = new KCommandBar(this);
178 std::vector<KActionCollection *> actionCollections;
179 const auto clients = guiFactory()->clients();
180 actionCollections.reserve(clients.size());
181
182 // Grab action collections recursively
183 for (const auto &client : clients) {
184 getActionCollections(client, actionCollections);
185 }
186
187 kc->setActions(actionCollectionToActionGroup(actionCollections));
188 kc->show();
189 });
190 a->setIcon(QIcon::fromTheme(QStringLiteral("search")));
191 a->setText(i18n("Find Action…"));
193}
194
196{
198 if (!d->toolBarHandler) {
199 return nullptr;
200 }
201
202 return d->toolBarHandler->toolBarMenuAction();
203}
204
206{
208 if (d->toolBarHandler) {
209 d->toolBarHandler->setupActions();
210 }
211}
212
214{
216 if (!tb) {
217 return false;
218 }
219
220 return tb->isVisible();
221}
222
223void KXmlGuiWindow::setToolBarVisible(const QString &name, bool visible)
224{
226 if (!tb) {
227 return;
228 }
229
230 tb->setVisible(visible);
231}
232
234{
235 QList<KToolBar *> bars = toolBars();
236 QStringList ret;
237
238 for (KToolBar *bar : bars) {
239 ret.append(bar->objectName());
240 }
241
242 return ret;
243}
244
246{
248 delete d->factory;
249}
250
252{
253 bool ret = KMainWindow::event(ev);
254 if (ev->type() == QEvent::Polish) {
255#ifdef WITH_QTDBUS
256 /* clang-format off */
257 constexpr auto opts = QDBusConnection::ExportScriptableSlots
262 /* clang-format on */
264#endif
265 }
266 return ret;
267}
268
270{
272 d->showHelpMenu = showHelpMenu;
273}
274
276{
277 Q_D(const KXmlGuiWindow);
278 return d->showHelpMenu;
279}
280
281KXMLGUIFactory *KXmlGuiWindow::guiFactory()
282{
284 if (!d->factory) {
285 d->factory = new KXMLGUIFactory(this, this);
286 connect(d->factory, &KXMLGUIFactory::makingChanges, this, [d](bool state) {
287 d->slotFactoryMakingChanges(state);
288 });
289 }
290 return d->factory;
291}
292
294{
298 if (!d->toolBarEditor) {
299 d->toolBarEditor = new KEditToolBar(guiFactory(), this);
300 d->toolBarEditor->setAttribute(Qt::WA_DeleteOnClose);
302 }
303 d->toolBarEditor->show();
304}
305
307{
308 // createGUI(xmlFile()); // this loses any plugged-in guiclients, so we use remove+add instead.
309
310 guiFactory()->removeClient(this);
311 guiFactory()->addClient(this);
312
315}
316
318{
319 setupGUI(QSize(), options, xmlfile);
320}
321
322void KXmlGuiWindow::setupGUI(const QSize &defaultSize, StandardWindowOptions options, const QString &xmlfile)
323{
325
326 if (options & Keys) {
327 KStandardActions::keyBindings(guiFactory(), &KXMLGUIFactory::showConfigureShortcutsDialog, actionCollection());
328 }
329
330 if ((options & StatusBar) && statusBar()) {
332 }
333
334 if (options & ToolBar) {
336 KStandardActions::configureToolbars(this, &KXmlGuiWindow::configureToolbars, actionCollection());
337 }
338
339 d->defaultSize = defaultSize;
340
341 if (options & Create) {
342 createGUI(xmlfile);
343 }
344
345 if (d->defaultSize.isValid()) {
346 resize(d->defaultSize);
347 } else if (isHidden()) {
348 adjustSize();
349 }
350
351 if (options & Save) {
353 if (cg.isValid()) {
355 } else {
357 }
358 }
359}
361{
363 // disabling the updates prevents unnecessary redraws
364 // setUpdatesEnabled( false );
365
366 // just in case we are rebuilding, let's remove our old client
367 guiFactory()->removeClient(this);
368
369 // make sure to have an empty GUI
370 QMenuBar *mb = menuBar();
371 if (mb) {
372 mb->clear();
373 }
374
375 qDeleteAll(toolBars()); // delete all toolbars
376
377 // don't build a help menu unless the user ask for it
378 if (d->showHelpMenu) {
379 delete d->helpMenu;
380 // we always want a help menu
381 d->helpMenu = new KHelpMenu(this);
382
384 QAction *helpContentsAction = d->helpMenu->action(KHelpMenu::menuHelpContents);
385 QAction *whatsThisAction = d->helpMenu->action(KHelpMenu::menuWhatsThis);
386 QAction *reportBugAction = d->helpMenu->action(KHelpMenu::menuReportBug);
387 QAction *switchLanguageAction = d->helpMenu->action(KHelpMenu::menuSwitchLanguage);
388 QAction *aboutAppAction = d->helpMenu->action(KHelpMenu::menuAboutApp);
389 QAction *aboutKdeAction = d->helpMenu->action(KHelpMenu::menuAboutKDE);
390 QAction *donateAction = d->helpMenu->action(KHelpMenu::menuDonate);
391
392 if (helpContentsAction) {
393 actions->addAction(helpContentsAction->objectName(), helpContentsAction);
394 }
395 if (whatsThisAction) {
396 actions->addAction(whatsThisAction->objectName(), whatsThisAction);
397 }
398 if (reportBugAction) {
399 actions->addAction(reportBugAction->objectName(), reportBugAction);
400 }
401 if (switchLanguageAction) {
402 actions->addAction(switchLanguageAction->objectName(), switchLanguageAction);
403 }
404 if (aboutAppAction) {
405 actions->addAction(aboutAppAction->objectName(), aboutAppAction);
406 }
407 if (aboutKdeAction) {
408 actions->addAction(aboutKdeAction->objectName(), aboutKdeAction);
409 }
410 if (donateAction) {
411 actions->addAction(donateAction->objectName(), donateAction);
412 }
413 }
414
415 const QString windowXmlFile = xmlfile.isNull() ? componentName() + QLatin1String("ui.rc") : xmlfile;
416
417 // Help beginners who call setXMLFile and then setupGUI...
418 if (!xmlFile().isEmpty() && xmlFile() != windowXmlFile) {
419 qCWarning(DEBUG_KXMLGUI) << "You called setXMLFile(" << xmlFile() << ") and then createGUI or setupGUI,"
420 << "which also calls setXMLFile and will overwrite the file you have previously set.\n"
421 << "You should call createGUI(" << xmlFile() << ") or setupGUI(<options>," << xmlFile() << ") instead.";
422 }
423
424 // we always want to load in our global standards file
426
427 // now, merge in our local xml file.
428 setXMLFile(windowXmlFile, true);
429
430 // make sure we don't have any state saved already
432
433 // do the actual GUI building
434 guiFactory()->reset();
435 guiFactory()->addClient(this);
436
438
439 // setUpdatesEnabled( true );
440}
441
443{
444 stateChanged(newstate, KXMLGUIClient::StateNoReverse);
445}
446
447void KXmlGuiWindow::slotStateChanged(const QString &newstate, bool reverse)
448{
449 stateChanged(newstate, reverse ? KXMLGUIClient::StateReverse : KXMLGUIClient::StateNoReverse);
450}
451
453{
455 if (showToolBarMenu) {
456 if (d->toolBarHandler) {
457 return;
458 }
459
460 d->toolBarHandler = new KDEPrivate::ToolBarHandler(this);
461
462 if (factory()) {
463 factory()->addClient(d->toolBarHandler);
464 }
465 } else {
466 if (!d->toolBarHandler) {
467 return;
468 }
469
470 if (factory()) {
471 factory()->removeClient(d->toolBarHandler);
472 }
473
474 delete d->toolBarHandler;
475 d->toolBarHandler = nullptr;
476 }
477}
478
480{
481 Q_D(const KXmlGuiWindow);
482 return (d->toolBarHandler);
483}
484
486{
488 if (!d->showStatusBarAction) {
490 QStatusBar *sb = statusBar(); // Creates statusbar if it doesn't exist already.
491 connect(d->showStatusBarAction, &QAction::toggled, sb, &QWidget::setVisible);
492 d->showStatusBarAction->setChecked(sb->isHidden());
493 } else {
494 // If the language has changed, we'll need to grab the new text and whatsThis
495 QAction *tmpStatusBar = KStandardAction::showStatusbar(nullptr, nullptr, nullptr);
496 d->showStatusBarAction->setText(tmpStatusBar->text());
497 d->showStatusBarAction->setWhatsThis(tmpStatusBar->whatsThis());
498 delete tmpStatusBar;
499 }
500}
501
502void KXmlGuiWindow::finalizeGUI(bool /*force*/)
503{
504 // FIXME: this really needs to be removed with a code more like the one we had on KDE3.
505 // what we need to do here is to position correctly toolbars so they don't overlap.
506 // Also, take in count plugins could provide their own toolbars and those also need to
507 // be restored.
508 if (autoSaveSettings() && autoSaveConfigGroup().isValid()) {
510 }
511}
512
514{
518 if (sb && d->showStatusBarAction) {
519 d->showStatusBarAction->setChecked(!sb->isHidden());
520 }
521}
522
524{
525 QMap<QString, QAction *> shortcuts;
526 QAction *editCutAction = actionCollection()->action(QStringLiteral("edit_cut"));
527 QAction *deleteFileAction = actionCollection()->action(QStringLiteral("deletefile"));
528 const auto actions = actionCollection()->actions();
529 for (QAction *action : actions) {
530 if (action->isEnabled()) {
531 const auto actionShortcuts = action->shortcuts();
532 for (const QKeySequence &shortcut : actionShortcuts) {
533 if (shortcut.isEmpty()) {
534 continue;
535 }
536 const QString portableShortcutText = shortcut.toString();
537 const QAction *existingShortcutAction = shortcuts.value(portableShortcutText);
538 if (existingShortcutAction) {
539 // If the shortcut is already in use we give a warning, so that hopefully the developer will find it
540 // There is one exception, if the conflicting shortcut is a non primary shortcut of "edit_cut"
541 // and "deleteFileAction" is the other action since Shift+Delete is used for both in our default code
542 bool showWarning = true;
543 if ((action == editCutAction && existingShortcutAction == deleteFileAction)
544 || (action == deleteFileAction && existingShortcutAction == editCutAction)) {
545 QList<QKeySequence> editCutActionShortcuts = editCutAction->shortcuts();
546 if (editCutActionShortcuts.indexOf(shortcut) > 0) // alternate shortcut
547 {
548 editCutActionShortcuts.removeAll(shortcut);
549 editCutAction->setShortcuts(editCutActionShortcuts);
550
551 showWarning = false;
552 }
553 }
554
555 if (showWarning) {
557 const QString existingShortcutActionName = KLocalizedString::removeAcceleratorMarker(existingShortcutAction->text());
558 QString dontShowAgainString = existingShortcutActionName + actionName + shortcut.toString();
559 dontShowAgainString.remove(QLatin1Char('\\'));
561 i18n("There are two actions (%1, %2) that want to use the same shortcut (%3). This is most probably a bug. "
562 "Please report it in <a href='https://bugs.kde.org'>bugs.kde.org</a>",
563 existingShortcutActionName,
564 actionName,
565 shortcut.toString(QKeySequence::NativeText)),
566 i18n("Ambiguous Shortcuts"),
567 dontShowAgainString,
569 }
570 } else {
571 shortcuts.insert(portableShortcutText, action);
572 }
573 }
574 }
575 }
576}
577
578void KXmlGuiWindow::setCommandBarEnabled(bool showCommandBar)
579{
580 /**
581 * Unset the shortcut
582 */
583 auto cmdBarAction = actionCollection()->action(QStringLiteral("open_kcommand_bar"));
584 if (showCommandBar) {
586 } else {
588 }
589
591 d->commandBarEnabled = showCommandBar;
592}
593
595{
596 Q_D(const KXmlGuiWindow);
597 return d->commandBarEnabled;
598}
599
600#include "moc_kxmlguiwindow.cpp"
A container for a set of QAction objects.
Q_INVOKABLE QAction * addAction(const QString &name, QAction *action)
Add an action under the given name to the collection.
static void setDefaultShortcut(QAction *action, const QKeySequence &shortcut)
Set the default shortcut for the given action.
QList< QAction * > actions() const
Returns the list of QActions which belong to this action collection.
QAction * action(int index) const
Return the QAction* at position index in the action collection.
bool isValid() const
A dialog used to customize or configure toolbars.
void newToolBarConfig()
Signal emitted when 'apply' or 'ok' is clicked or toolbars were reset.
Standard KDE help menu with dialog boxes.
Definition khelpmenu.h:109
static QString removeAcceleratorMarker(const QString &label)
KMainWindow represents a top-level main window.
Definition kmainwindow.h:60
virtual void applyMainWindowSettings(const KConfigGroup &config)
Read settings for statusbar, menubar and toolbar from their respective groups in the config file and ...
bool event(QEvent *event) override
Reimplemented to catch QEvent::Polish in order to adjust the object name if needed,...
void setAutoSaveSettings(const QString &groupName=QStringLiteral("MainWindow"), bool saveWindowSize=true)
This enables autosave of toolbar/menubar/statusbar settings (and optionally window size).
void setSettingsDirty()
Tell the main window that it should save its settings when being closed.
KConfigGroup autoSaveConfigGroup() const
void saveMainWindowSettings(KConfigGroup &config)
Manually save the settings for statusbar, menubar and toolbar to their respective groups in the KConf...
QString dbusName() const
static KSharedConfig::Ptr openConfig(const QString &fileName=QString(), OpenFlags mode=FullConfig, QStandardPaths::StandardLocation type=QStandardPaths::GenericConfigLocation)
Floatable toolbar with auto resize.
Definition ktoolbar.h:68
Implements the creation of the GUI (menubar, menus and toolbars) as requested by the GUI factory.
A KXMLGUIClient can be used with KXMLGUIFactory to create a GUI from actions and an XML document,...
virtual QString xmlFile() const
This will return the name of the XML file as set by setXMLFile().
virtual QString componentName() const
virtual void stateChanged(const QString &newstate, ReverseStateChange reverse=StateNoReverse)
Actions can collectively be assigned a "State".
virtual KActionCollection * actionCollection() const
Retrieves the entire action collection for the GUI client.
virtual void setXMLFile(const QString &file, bool merge=false, bool setXMLDoc=true)
Sets the name of the rc file containing the XML for the part.
QList< KXMLGUIClient * > childClients()
Retrieves a list of all child clients.
KXMLGUIFactory * factory() const
Retrieves a pointer to the KXMLGUIFactory this client is associated with (will return nullptr if the ...
void setXMLGUIBuildDocument(const QDomDocument &doc)
void loadStandardsXmlFile()
Load the ui_standards.rc file.
QAction * action(const QString &name) const
Retrieves an action of the client by name.
KXMLGUIFactory, together with KXMLGUIClient objects, can be used to create a GUI of container widgets...
QList< KXMLGUIClient * > clients() const
Returns a list of all clients currently added to this factory.
void removeClient(KXMLGUIClient *client)
Removes the GUI described by the client, by unplugging all provided actions and removing all owned co...
void addClient(KXMLGUIClient *client)
Creates the GUI described by the QDomDocument of the client, using the client's actions,...
void reset()
Use this method to free all memory allocated by the KXMLGUIFactory.
void showConfigureShortcutsDialog()
Shows a dialog (KShortcutsDialog) that lists every action in this factory, and which can be used to c...
void makingChanges(bool)
Emitted when the factory is currently making changes to the GUI, i.e.
KMainWindow with convenience functions and integration with XmlGui files.
void setToolBarVisible(const QString &name, bool visible)
Sets the visibility of a given toolbar.
void createGUI(const QString &xmlfile=QString())
Generates the interface based on a local XML file.
KXmlGuiWindow(QWidget *parent=nullptr, Qt::WindowFlags flags=Qt::WindowFlags())
Construct a main window.
QAction * toolBarMenuAction()
void createStandardStatusBarAction()
Creates a toggle under the 'Settings' menu to show/hide the statusbar.
void setStandardToolBarMenuEnabled(bool showToolBarMenu)
Creates a toggle under the 'Settings' menu to show/hide the available toolbars.
void applyMainWindowSettings(const KConfigGroup &config) override
Read settings for statusbar, menubar and toolbar from their respective groups in the config file and ...
QStringList toolBarNames() const
bool isStandardToolBarMenuEnabled() const
Returns whether setStandardToolBarMenuEnabled() was set.
@ StatusBar
Adds an action to show/hide the statusbar in the 'Settings' menu.
@ Save
Autosaves (and loads) the toolbar/menubar/statusbar settings and window size using the default name.
@ Create
Calls createGUI() once ToolBar, Keys and Statusbar have been taken care of.
@ Keys
Adds an action in the 'Settings' menu to open the configure keyboard shortcuts dialog.
void setupToolbarMenuActions()
virtual void slotStateChanged(const QString &newstate)
Applies a state change.
virtual void configureToolbars()
Show a standard configure toolbar dialog.
bool isCommandBarEnabled() const
Returns whether a KCommandBar was set.
void setHelpMenuEnabled(bool showHelpMenu=true)
Creates a standard help menu when calling createGUI() or setupGUI().
bool event(QEvent *event) override
Reimplemented to catch QEvent::Polish in order to adjust the object name if needed,...
~KXmlGuiWindow() override
Destructor.
virtual void saveNewToolbarConfig()
Rebuilds the GUI after KEditToolBar changes the toolbar layout.
void setCommandBarEnabled(bool showCommandBar)
Enable a KCommandBar to list and quickly execute actions.
void finalizeGUI(bool force)
bool isToolBarVisible(const QString &name)
Checks the visual state of a given toolbar.
void checkAmbiguousShortcuts()
Checks if there are actions using the same shortcut.
bool isHelpMenuEnabled() const
void setupGUI(StandardWindowOptions options=Default, const QString &xmlfile=QString())
Configures the current window and its actions in the typical KDE fashion.
QString i18n(const char *text, const TYPE &arg...)
void information(QWidget *parent, const QString &text, const QString &title=QString(), const QString &dontShowAgainName=QString(), Options options=Notify)
KToggleAction * showStatusbar(const QObject *recvr, const char *slot, QObject *parent)
bool isEnabled() const const
void setIcon(const QIcon &icon)
void setShortcuts(QKeySequence::StandardKey key)
QList< QKeySequence > shortcuts() const const
void toggled(bool checked)
bool registerObject(const QString &path, QObject *object, RegisterOptions options)
QDBusConnection sessionBus()
Type type() const const
QIcon fromTheme(const QString &name)
void append(QList< T > &&value)
qsizetype indexOf(const AT &value, qsizetype from) const const
bool isEmpty() const const
qsizetype removeAll(const AT &t)
void reserve(qsizetype size)
qsizetype size() const const
QMenuBar * menuBar() const const
QStatusBar * statusBar() const const
iterator insert(const Key &key, const T &value)
T value(const Key &key, const T &defaultValue) const const
void clear()
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T findChild(const QString &name, Qt::FindChildOptions options) const const
bool isNull() const const
QString & remove(QChar ch, Qt::CaseSensitivity cs)
void reserve(qsizetype size)
WA_DeleteOnClose
typedef WindowFlags
QList< QAction * > actions() const const
void adjustSize()
bool isHidden() const const
void resize(const QSize &)
bool isVisible() const const
Q_D(Todo)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 3 2025 11:52:09 by doxygen 1.12.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.