Development/Tutorials/Using KActions/KF5: Difference between revisions

From KDE TechBase
(change prev and next link to represent the KF5 version)
(→‎Abstract: Fill in content from KDE4 version)
Line 14: Line 14:


==Abstract==
==Abstract==
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.


Rough draft of port to KDE Frameworks 5.
For example, if we wanted to let the user of [[Development/Tutorials/Using_KXmlGuiWindow|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 [http://doc.qt.io/qt-5/qaction.html QAction].


[[image:tutorial3-kf5.png|frame|center]]
[[image:tutorial3-kf5.png|frame|center]]

Revision as of 03:07, 16 January 2016

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

KAction has been deprecated in favor of QAction and QWidgetAction.

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

  1. No more KApplication - https://community.kde.org/Frameworks/Porting_Notes#Application
  2. Replace KAction with QAction and/or QWidgetAction - https://community.kde.org/Frameworks/Porting_Notes#Action
  3. KLocale is deprecated is kdelibs4support, use KLocalizedString for i18n() - https://community.kde.org/Frameworks/Porting_Notes#Localization
  4. KIcon has been deprecated, use QIcon https://community.kde.org/Frameworks/Porting_Notes#General_2
  5. Warning message: Shortcut for action "clear" "&Clear" set with QAction::setShortcut()! Use KActionCollection::setDefaultShortcut(s) instead.
  6. 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&amp;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

  1. .ui files now installed to {KXMLGUI_INSTALL_DIR - https://community.kde.org/Frameworks/Porting_Notes#General