(Abstract. I'm gonna write the code and then I'll be back :)) |
Neverendingo (Talk | contribs) m (Text replace - "<code ini n>" to "<syntaxhighlight lang="ini" line>") |
||
| (18 intermediate revisions by 5 users not shown) | |||
| Line 1: | Line 1: | ||
| + | {{Warning|The subject matter that I was going to cover in this tutorial is already covered in [[Development/Tutorials/KConfig]] and so this tutorial will probably be removed.}} | ||
| + | |||
[[image:introtokdetutorial4.png|frame|center]] | [[image:introtokdetutorial4.png|frame|center]] | ||
==Abstract== | ==Abstract== | ||
| − | ''Author'': [[User:Milliams|Matt Williams]] | + | ''Author'': Fabian Korak |
| + | |||
| + | ''Author'': [[User:Milliams|Matt Williams]](presets) | ||
In this tutorial, we're going to be showing you how to utilise KConfig XT in an application. It is recommended that you read [[Development/Tutorials/Using KConfig XT]] before continuing in order to familiarise yourself with the framework. | In this tutorial, we're going to be showing you how to utilise KConfig XT in an application. It is recommended that you read [[Development/Tutorials/Using KConfig XT]] before continuing in order to familiarise yourself with the framework. | ||
| + | |||
==Prerequisites== | ==Prerequisites== | ||
| − | * [[Development/Tutorials | + | * [[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]] |
| + | |||
| + | * [[Development/Tutorials/Using_KConfig_XT]] | ||
==KConfig XT== | ==KConfig XT== | ||
| − | + | ||
| + | At first we make new File called tutorial4.kcfg within the source directory of your project. | ||
| + | |||
| + | <syntaxhighlight lang="xml"> | ||
| + | <?xml version="1.0" encoding="UTF-8"?> | ||
| + | <!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.xsd"> | ||
| + | <kcfg> | ||
| + | <kcfgfile name="kjotsrc"/> | ||
| + | <include>kglobalsettings.h</include> | ||
| + | <group name="kjots"> | ||
| + | <entry name="showAction" type="Bool"> | ||
| + | <label>Whether setupAction is called</label> | ||
| + | <default>true</default> | ||
| + | </entry> | ||
| + | </group> | ||
| + | </kcfg> | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | This code makes a setting of the type bool, which determines whether we want to do something. Then we set the default value to be true. | ||
| + | |||
| + | '''Always start the value of <entry name=""> in lower case since KConfig XT sets them to lower case within the generated headers either way. If you don't this could give you some nearly untraceable errors''' | ||
| + | |||
| + | Now we make a new File called tutorial4.kcfgc. | ||
| + | |||
| + | <syntaxhighlight lang="ini"> | ||
| + | File=tutorial4.kcfg | ||
| + | ClassName=tutorial4 | ||
| + | Singleton=true | ||
| + | Mutators=true | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | This should set up your configuration for now. | ||
| + | |||
==The Code== | ==The Code== | ||
===mainwindow.h=== | ===mainwindow.h=== | ||
| − | < | + | <syntaxhighlight lang="cpp-qt" line> |
| − | + | #ifndef MAINWINDOW_H | |
| − | </ | + | #define MAINWINDOW_H |
| + | |||
| + | #include <KXmlGuiWindow> | ||
| + | #include <KTextEdit> | ||
| + | |||
| + | |||
| + | class MainWindow : public KXmlGuiWindow | ||
| + | { | ||
| + | |||
| + | public: | ||
| + | MainWindow(QWidget *parent=0); | ||
| + | private: | ||
| + | KTextEdit* textArea; | ||
| + | void setupActions(); | ||
| + | void setupConfig(); | ||
| + | void readConfig(); | ||
| + | void saveSettings(); | ||
| + | int m_showAction; | ||
| + | |||
| + | }; | ||
| + | |||
| + | #endif | ||
| + | |||
| + | |||
| + | </syntaxhighlight> | ||
| + | |||
| + | There are some new voids in here, as well as m_showAction witch determines the value stored in KConfig XT. Despite that value being a bool we can actually use an integer here, since the type is converted either way. | ||
| + | |||
===mainwindow.cpp=== | ===mainwindow.cpp=== | ||
| − | < | + | <syntaxhighlight lang="cpp-qt" line> |
| − | + | #include "mainwindow.h" | |
| − | </ | + | #include "tutorial4.h" |
| + | |||
| + | #include <KApplication> | ||
| + | #include <KAction> | ||
| + | #include <KLocale> | ||
| + | #include <KActionCollection> | ||
| + | #include <KStandardAction> | ||
| + | #include <KConfigDialog> | ||
| + | |||
| + | MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent) | ||
| + | { | ||
| + | |||
| + | textArea = new KTextEdit; | ||
| + | setCentralWidget(textArea); | ||
| + | setupConfig(); | ||
| + | } | ||
| + | |||
| + | void MainWindow::setupActions() | ||
| + | { | ||
| + | |||
| + | QAction* clearAction = actionCollection()->addAction( "clear" ); | ||
| + | |||
| + | clearAction->setText(i18n("Clear")); | ||
| + | clearAction->setIcon(KIcon("filenew")); | ||
| + | clearAction->setShortcut(Qt::CTRL+ Qt::Key_W); | ||
| + | |||
| + | connect(clearAction, SIGNAL(triggered(bool)), textArea, SLOT(clear())); | ||
| + | |||
| + | KStandardAction::quit(kapp, SLOT(quit()), actionCollection()); | ||
| + | |||
| + | setupGUI(); | ||
| + | |||
| + | } | ||
| + | |||
| + | void MainWindow::setupConfig() | ||
| + | { | ||
| + | readConfig(); | ||
| + | |||
| + | |||
| + | } | ||
| + | |||
| + | void MainWindow::readConfig() { | ||
| + | m_showAction = tutorial4::showAction(); | ||
| + | if(m_showAction = (true)) | ||
| + | setupActions(); | ||
| + | |||
| + | } | ||
| + | |||
| + | void MainWindow::saveSettings() { | ||
| + | tutorial4::setShowAction(m_showAction); | ||
| + | tutorial4::self()->writeConfig(); | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | </syntaxhighlight> | ||
| + | |||
| + | At first we import "tutorial4.h", which should be auto-generated at runtime by KConfig XT every time you compile this. MainWindow and SetupActions are copied from the tutorials before. The only thing new is that we now call a new void called setupConfig. This then calls readConfig. We '''could''' also call saveSettings(but only after we called readConfig), but since we don't change any values there this is more of a "proof of concept". | ||
| + | |||
| + | Within readConfig we assign m_showAction the value of the setting showAction. If this returns true setupsActions makes buttons and all that. When false it doesn't. | ||
| + | |||
| + | The setShowActions() in saveSettings() overwrites showAction with a value of your choice, in this case with itself. Then you need to call writeConfig() to apply the changes you made. | ||
| + | |||
===main.cpp=== | ===main.cpp=== | ||
| − | < | + | <syntaxhighlight lang="cpp-qt" line> |
| − | + | ||
| − | </ | + | #include "mainwindow.h" |
| − | === | + | |
| − | < | + | |
| − | + | #include <KApplication> | |
| − | </ | + | #include <KAboutData> |
| + | #include <KCmdLineArgs> | ||
| + | |||
| + | int main (int argc, char *argv[]) | ||
| + | { | ||
| + | KAboutData aboutData( "tutorial4", "tutorial4", | ||
| + | "0.4", "KMessageBox popup", | ||
| + | KAboutData::License_GPL, "(c) 2007" ); | ||
| + | KCmdLineArgs::init( argc, argv, &aboutData ); | ||
| + | |||
| + | KApplication app; | ||
| + | |||
| + | MainWindow* window = new MainWindow(); | ||
| + | window->show(); | ||
| + | |||
| + | return app.exec(); | ||
| + | |||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | No news in here | ||
| + | |||
| + | ===tutorial4ui.rc=== | ||
| + | <syntaxhighlight lang="xml" line> | ||
| + | <?xml version="1.0" encoding="UTF-8"?> | ||
| + | <gui name="tutorial4" | ||
| + | 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" > | ||
| + | <text>&File</text> | ||
| + | <Action name="clear" /> | ||
| + | </Menu> | ||
| + | </MenuBar> | ||
| + | |||
| + | <ToolBar name="mainToolBar" > | ||
| + | <text>Main Toolbar</text> | ||
| + | <Action name="clear" /> | ||
| + | </ToolBar> | ||
| + | |||
| + | </gui> | ||
| + | |||
| + | </syntaxhighlight> | ||
==CMake== | ==CMake== | ||
| − | |||
===CMakeLists.txt=== | ===CMakeLists.txt=== | ||
| − | < | + | <syntaxhighlight lang="ini" line> |
| − | + | PROJECT(tutorial4) | |
| − | </ | + | |
| + | FIND_PACKAGE(KDE4 REQUIRED) | ||
| + | INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) | ||
| + | |||
| + | SET(tutorial4_SRCS | ||
| + | main.cpp | ||
| + | mainwindow.cpp | ||
| + | ) | ||
| + | |||
| + | KDE4_ADD_KCFG_FILES(tutorial4_SRCS settings.kcfgc) | ||
| + | |||
| + | KDE4_ADD_EXECUTABLE(tutorial4 ${tutorial4_SRCS}) | ||
| + | |||
| + | TARGET_LINK_LIBRARIES( tutorial4 ${KDE4_KDEUI_LIBS}) | ||
| + | |||
| + | install( TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR}) | ||
| + | install( FILES tutorial4ui.rc DESTINATION ${DATA_INSTALL_DIR}/tutorial4) | ||
| + | install( FILES tutorial4.kcfg DESTINATION ${KCFG_INSTALL_DIR} ) | ||
| + | </syntaxhighlight> | ||
| + | |||
==Moving On== | ==Moving On== | ||
| − | + | ||
| − | [[ | + | For a better understanding of the XML used in KConfig XT you could try |
| + | [[Development/Tutorials/Programming_Tutorial_KDE_4/How_to_write_an_XML_parser|to write an Xml Parser]] | ||
| Warning |
|---|
| The subject matter that I was going to cover in this tutorial is already covered in Development/Tutorials/KConfig and so this tutorial will probably be removed. |
Contents |
Author: Fabian Korak
Author: Matt Williams(presets)
In this tutorial, we're going to be showing you how to utilise KConfig XT in an application. It is recommended that you read Development/Tutorials/Using KConfig XT before continuing in order to familiarise yourself with the framework.
At first we make new File called tutorial4.kcfg within the source directory of your project.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.xsd"> <kcfg> <kcfgfile name="kjotsrc"/> <include>kglobalsettings.h</include> <group name="kjots"> <entry name="showAction" type="Bool"> <label>Whether setupAction is called</label> <default>true</default> </entry> </group> </kcfg>
This code makes a setting of the type bool, which determines whether we want to do something. Then we set the default value to be true.
Always start the value of <entry name=""> in lower case since KConfig XT sets them to lower case within the generated headers either way. If you don't this could give you some nearly untraceable errors
Now we make a new File called tutorial4.kcfgc.
File=tutorial4.kcfg ClassName=tutorial4 Singleton=true Mutators=true
This should set up your configuration for now.
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <KXmlGuiWindow>#include <KTextEdit>class MainWindow : public KXmlGuiWindow
{public:
MainWindow(QWidget *parent=0);
private:
KTextEdit* textArea;
void setupActions();
void setupConfig();
void readConfig();
void saveSettings();
int m_showAction;
};
#endifThere are some new voids in here, as well as m_showAction witch determines the value stored in KConfig XT. Despite that value being a bool we can actually use an integer here, since the type is converted either way.
#include "mainwindow.h"#include "tutorial4.h"#include <KApplication>#include <KAction>#include <KLocale>#include <KActionCollection>#include <KStandardAction>#include <KConfigDialog>MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)
{textArea = new KTextEdit;
setCentralWidget(textArea);
setupConfig();
}void MainWindow::setupActions()
{QAction* clearAction = actionCollection()->addAction( "clear" );
clearAction->setText(i18n("Clear"));
clearAction->setIcon(KIcon("filenew"));
clearAction->setShortcut(Qt::CTRL+ Qt::Key_W);
connect(clearAction, SIGNAL(triggered(bool)), textArea, SLOT(clear()));
KStandardAction::quit(kapp, SLOT(quit()), actionCollection());
setupGUI();
}void MainWindow::setupConfig()
{readConfig();
}void MainWindow::readConfig() {
m_showAction = tutorial4::showAction();
if(m_showAction = (true))
setupActions();
}void MainWindow::saveSettings() {
tutorial4::setShowAction(m_showAction);
tutorial4::self()->writeConfig();
}At first we import "tutorial4.h", which should be auto-generated at runtime by KConfig XT every time you compile this. MainWindow and SetupActions are copied from the tutorials before. The only thing new is that we now call a new void called setupConfig. This then calls readConfig. We could also call saveSettings(but only after we called readConfig), but since we don't change any values there this is more of a "proof of concept".
Within readConfig we assign m_showAction the value of the setting showAction. If this returns true setupsActions makes buttons and all that. When false it doesn't.
The setShowActions() in saveSettings() overwrites showAction with a value of your choice, in this case with itself. Then you need to call writeConfig() to apply the changes you made.
#include "mainwindow.h"#include <KApplication>#include <KAboutData>#include <KCmdLineArgs>int main (int argc, char *argv[])
{KAboutData aboutData( "tutorial4", "tutorial4",
"0.4", "KMessageBox popup",
KAboutData::License_GPL, "(c) 2007" );
KCmdLineArgs::init( argc, argv, &aboutData );
KApplication app;MainWindow* window = new MainWindow();
window->show();
return app.exec();
}No news in here
<?xml version="1.0" encoding="UTF-8"?><gui name="tutorial4" 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" ><text>&File</text>
<Action name="clear" /> </Menu> </MenuBar> <ToolBar name="mainToolBar" ><text>Main Toolbar</text>
<Action name="clear" /> </ToolBar></gui>PROJECT(tutorial4)
FIND_PACKAGE(KDE4 REQUIRED)
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR})
SET(tutorial4_SRCS main.cpp
mainwindow.cpp
)KDE4_ADD_KCFG_FILES(tutorial4_SRCS settings.kcfgc)
KDE4_ADD_EXECUTABLE(tutorial4 ${tutorial4_SRCS})
TARGET_LINK_LIBRARIES( tutorial4 ${KDE4_KDEUI_LIBS})
install( TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})
install( FILES tutorial4ui.rc DESTINATION ${DATA_INSTALL_DIR}/tutorial4)
install( FILES tutorial4.kcfg DESTINATION ${KCFG_INSTALL_DIR} )
For a better understanding of the XML used in KConfig XT you could try to write an Xml Parser