Development/Tutorials/Using KActions/KF5
How To Use KActions and XMLGUI
Tutorial Series | Beginner Tutorial |
Previous | Tutorial 2 - KXmlGuiWindow, Basic XML knowledge |
What's Next | Tutorial 4 - Saving and loading |
Further Reading | None |
Abstract
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.
For example, if we wanted to let the user of Tutorial 2 clear the text box by clicking a button in the toolbar, from an option in the File menu or through a keyboard shortcut, it could all be done with one QAction.
KAction
A QAction is an object which contains all the information about the icon and shortcuts that is associated with a certain action. The action is then connected to a slot which carries out the work of your action.
The Code
main.cpp
#include <cstdlib>
#include <QApplication>
#include <QCommandLineParser>
#include <KAboutData>
#include <KLocalizedString>
#include "mainwindow.h"
int main (int argc, char *argv[])
{
QApplication app(argc, argv);
KLocalizedString::setApplicationDomain("tutorial3");
KAboutData aboutData(
// The program name used internally. (componentName)
QStringLiteral("tutorial3"),
// A displayable program name string. (displayName)
i18n("Tutorial 3"),
// The program version string. (version)
QStringLiteral("1.0"),
// Short description of what the app does. (shortDescription)
i18n("A simple text area using KAction etc."),
// The license this code is released under
KAboutLicense::GPL,
// Copyright Statement (copyrightStatement = QString())
i18n("(c) 2015"),
// Optional text shown in the About box.
// Can contain any information desired. (otherText)
i18n("Some text..."),
// The program homepage string. (homePageAddress = QString())
QStringLiteral("http://example.com/"),
// The bug report email address
// (bugsEmailAddress = QLatin1String("[email protected]")
QStringLiteral("[email protected]"));
aboutData.addAuthor(i18n("Name"), i18n("Task"), QStringLiteral("[email protected]"),
QStringLiteral("http://your.website.com"), QStringLiteral("OSC Username"));
KAboutData::setApplicationData(aboutData);
QCommandLineParser parser;
parser.addHelpOption();
parser.addVersionOption();
aboutData.setupCommandLine(&parser);
parser.process(app);
aboutData.processCommandLine(&parser);
MainWindow* window = new MainWindow();
window->show();
return app.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <KXmlGuiWindow>
class KTextEdit;
class MainWindow : public KXmlGuiWindow
{
public:
MainWindow(QWidget *parent=0);
private:
KTextEdit* textArea;
void setupActions();
};
#endif
mainwindow.cpp
// 1
#include <QApplication>
// 2
#include <QAction>
#include <KTextEdit>
// 3
#include <KLocalizedString>
#include <KActionCollection>
#include <KStandardAction>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)
{
textArea = new KTextEdit();
setCentralWidget(textArea);
setupActions();
}
void MainWindow::setupActions()
{
QAction* clearAction = new QAction(this);
clearAction->setText(i18n("&Clear"));
// 4
clearAction->setIcon(QIcon::fromTheme("document-new"));
// 5
actionCollection()->setDefaultShortcut(clearAction, Qt::CTRL + Qt::Key_W);
actionCollection()->addAction("clear", clearAction);
connect(clearAction, SIGNAL(triggered(bool)), textArea, SLOT(clear()));
// 6
KStandardAction::quit(qApp, SLOT(quit()), actionCollection());
setupGUI(Default, "tutorial3ui.rc");
}
Notes
- No more KApplication - https://community.kde.org/Frameworks/Porting_Notes#Application
- Replace KAction with QAction and/or QWidgetAction - https://community.kde.org/Frameworks/Porting_Notes#Action
- KLocale is deprecated is kdelibs4support, use KLocalizedString for i18n() - https://community.kde.org/Frameworks/Porting_Notes#Localization
- KIcon has been deprecated, use QIcon https://community.kde.org/Frameworks/Porting_Notes#General_2
- Warning message: Shortcut for action "clear" "&Clear" set with QAction::setShortcut()! Use KActionCollection::setDefaultShortcut(s) instead.
- Since KApplication is gone, we can't use kapp anymore. Use qApp macro instead.
appnameui.rc file
tutorial3ui.rc
<?xml version="1.0" encoding="UTF-8"?>
<gui name="tutorial3"
version="1"
xmlns="http://www.kde.org/standards/kxmlgui/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0
http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" >
<MenuBar>
<Menu name="file" >
<Action name="clear" />
</Menu>
<Menu >
<text>A&nother Menu</text>
<Action name="clear" />
</Menu >
</MenuBar>
<ToolBar name="mainToolBar" >
<text>Main Toolbar</text>
<Action name="clear" />
</ToolBar>
</gui>
CMake
CMakeLists.txt
project (tutorial3)
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
set(QT_MIN_VERSION "5.3.0")
set(KF5_MIN_VERSION "5.2.0")
find_package(ECM 1.0.0 REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings)
include(FeatureSummary)
# Find Qt modules
find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
Core # QCommandLineParser, QStringLiteral
Widgets # QApplication, QAction
)
# Find KDE modules
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS
CoreAddons # KAboutData
I18n # KLocalizedString
XmlGui # KXmlGuiWindow, KActionCollection
TextWidgets # KTextEdit
ConfigWidgets # KStandardActions
)
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
set(tutorial3_SRCS main.cpp mainwindow.cpp)
# just plain add_executable
add_executable(tutorial3 ${tutorial3_SRCS})
# module-based linking
target_link_libraries(tutorial3
Qt5::Widgets
KF5::CoreAddons
KF5::I18n
KF5::XmlGui
KF5::TextWidgets
KF5::ConfigWidgets
)
install(TARGETS tutorial3 ${INSTALL_TARGETS_DEFAULT_ARGS})
# 1
install(FILES tutorial3ui.rc DESTINATION ${KXMLGUI_INSTALL_DIR}/tutorial3)
Notes
- .ui files now installed to {KXMLGUI_INSTALL_DIR - https://community.kde.org/Frameworks/Porting_Notes#General