<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://techbase.kde.org/skins/common/feed.css?0.2"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://techbase.kde.org/api.php?action=feedcontributions&amp;user=Milliams&amp;feedformat=atom</id>
		<title>KDE TechBase - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://techbase.kde.org/api.php?action=feedcontributions&amp;user=Milliams&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Special:Contributions/Milliams"/>
		<updated>2013-05-24T17:13:41Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/Session_Management</id>
		<title>Talk:Development/Tutorials/Session Management</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/Session_Management"/>
				<updated>2009-04-11T12:29:05Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This tutorial really shouldn't be linked under the 'Introduction To KDE 4 Programming' section on [[Development/Tutorials]]. IT doesn't fit in _at all_ with the rest of the series either in terms of flow or in target audience. Perhaps you should find another place to link to it from, otherwise I will move the link myself [[User:Milliams|milliams]] 19:56, 5 April 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: When creating the turotial, I've asked at the diskussion page of Development/Turorials (http://techbase.kde.org/index.php?title=Talk:Development/Tutorials&amp;amp;oldid=36921) where to put it because I wasn't shure in which category it fits. Someone has than put it to 'Introduction To KDE 4 Programming'. However, I thing also that this category isn't perfect and I'm fine with another category. You can just move it to another place, where you think it fits better.&lt;br /&gt;
&lt;br /&gt;
::Ok, I've moved it to the '' Basics'' category. [[User:Milliams|milliams]] 12:29, 11 April 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials</id>
		<title>Development/Tutorials</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials"/>
				<updated>2009-04-11T12:27:44Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Move session management tutorial link. This is better but maybe still not perfect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Tutorials are the fastest way of finding out what KDE will do for you, and how to do it. Here is a list of currently available tutorials '''for KDE4'''. Material for KDE3 and KDE2 is available on the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
== Introduction To KDE 4 Programming ==&lt;br /&gt;
Are you interested in writing applications with KDE 4? This tutorial series is aimed at those completely new to KDE programming.&lt;br /&gt;
;[[Development/Tutorials/First program|Hello World]]&lt;br /&gt;
:''A preliminary introduction to the very basics of KDE4 programming''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow|Creating the Main Window]]&lt;br /&gt;
:''This tutorial shows you the magic of an application's most important thing: The main window.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions|Using KActions]]&lt;br /&gt;
:''How to add actions to the menus and toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Saving and Loading]]&lt;br /&gt;
:''Introduces the KIO library while adding loading and saving support to our application.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Command line arguments]]&lt;br /&gt;
:''Adds the ability to specify which file to open from the command line to our text editor.''&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Porting Your Application]]&lt;br /&gt;
:''Help Porting Applications from Qt3/KDE3 to Qt4/KDE4''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introduction to CMake]]&lt;br /&gt;
:''How to use the CMake build system used by KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Common Programming Mistakes]]&lt;br /&gt;
:''Various common mistakes made while developing Qt and KDE applications and how to avoid them.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Using Qt Designer to build user interfaces]]&lt;br /&gt;
:''How to create UI files with designer, and how to integrate them into a KDE program.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Creating Libraries to share code]]&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Session_Management|Session Management]]&lt;br /&gt;
:''Make your application aware of X sessions''&lt;br /&gt;
&lt;br /&gt;
== Testing And Debugging ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Debugging your application]]&lt;br /&gt;
:''Tips, tools and techniques to apply when debugging your KDE application''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Writing Unittests for Qt4 and KDE4 with QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html Original link])&lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to write unit tests using the QTestLib framework. It is presented as an example based tutorial, and is still under development.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Semi-automatic ways to detect code errors]]&lt;br /&gt;
:''Techniques you can use to detect errors in KDE code''&lt;br /&gt;
&lt;br /&gt;
== Managing Configuration Data With KConfig ==&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introduction To KConfig]]&lt;br /&gt;
:''An overview of the KConfig classes and how to use them in your application code''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Using KConfig XT]]&lt;br /&gt;
:''Tutorial on how to efficiently use the KConfig XT framework.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Updating KConfig Files]]&lt;br /&gt;
:''Tutorial on how to write an update script to keep changes in your application's config file format in sync with the user's already existing config file''&lt;br /&gt;
&lt;br /&gt;
== Services: Applications and Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introduction to the Services Framework]]&lt;br /&gt;
:''An overview of the services framework in KDE and what it provides the application developer. Covers the system configuration cache (SyCoCa), the source data files and what the indexed information can be used for.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Finding Services Using Trader Queries]]&lt;br /&gt;
:''How to find services, such as plugins or mimetypes, that are indexed in the SyCoCa using Trader Query Syntax''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Creating and Loading Plugins Using KService]]&lt;br /&gt;
:''Learn how to define custom plugin types, find installed plugins (including 3rd party plugins) and load them in an easy and portable fashion using KService.''&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
See also [[Localization|Localization portal]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introduction To Unicode]]&lt;br /&gt;
:''An introduction to what Unicode is as well as how to handle Unicode data in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n|Writing Applications With Localization In Mind]]&lt;br /&gt;
:''This tutorial covers what localization is, why it's important and how to ensure your application is ready to be localized. A must read for all application developers.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Mistakes|Avoiding Common Localization Pitfalls]]&lt;br /&gt;
:''There are several common mistakes that prevent applications from being properly localized. Find out what they are and how to easily avoid them in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Building KDE's Localization Module]]&lt;br /&gt;
:''Building and installing language support from KDE's localization (l10n) module is a good idea for those working on applications in the main KDE repository. Doing so will allow you to test your application in another language and spot problem areas. Learn how to do just that in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporating i18n Into the Build System]]&lt;br /&gt;
:''Once your application is ready to be localized, the next step is to ensure that translation files are built automatically and kept up to date. This tutorial covers the necessary CMakeFiles.txt additions as well the process of distributing the resulting message catalogs with your application.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Common i18n Challenges and Solutions]]&lt;br /&gt;
:''This tutorial covers challenges that you may eventually run into such as translating handbooks and other data that exists outside of the source code, merging and handling obsolete .po files, dealing with freezes, coding in languages other than English and creating independent releases of or moving applications between KDE modules.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n_Semantics|Semantic Markup of Messages]]&lt;br /&gt;
:''To ensure consistent presentation and more meaningful representations of messages in applications, semantic markup can be applied to messages marked for translation using the KUIT system. This tutorial describes how this system works.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Automated i18n Code Checking]]&lt;br /&gt;
:''The Krazy code checker scans KDE's code and reports common i18n mistakes.''&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/API_Documentation|API Documentation]]&lt;br /&gt;
:''This tutorial explains how to document your APIs properly.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Man_Pages|Man Pages]]&lt;br /&gt;
:''Writing and Generating Reference Manual Pages.''&lt;br /&gt;
&lt;br /&gt;
== Application Automation and Scripting ==&lt;br /&gt;
&lt;br /&gt;
=== D-Bus ===&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Introduction|Introduction to D-Bus]]&lt;br /&gt;
:''A straight-forward introduction to the core concepts in D-Bus from an application developer's perspective, this tutorial covers what D-Bus is and how it can be used by applications.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Accessing Interfaces|Accessing D-Bus Interfaces]]&lt;br /&gt;
:''A step-by-step guide to calling D-Bus methods and connecting to D-Bus signals using QtDBus.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Intermediate_D-Bus|Intermediate D-Bus]]&lt;br /&gt;
:''Tips to make use of QtDBus when faced with problematic real-world interfaces.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Creating Interfaces|Creating D-Bus Interfaces]]&lt;br /&gt;
:''Learn how to expose functionality in your application by creating and using custom D-Bus interfaces. Covers generating the XML descriptions, instantiating interfaces at run time and setting up the build system with CMake.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Autostart Services|D-Bus Autostart Services]]&lt;br /&gt;
:''Turn your application into a D-Bus autostart service with this tutorial. This D-Bus feature, also known as &amp;quot;D-Bus service activation&amp;quot;, will ensure that even when your application isn't running that D-Bus calls made to it will work by relying on the D-Bus daemon itself to start your app if and when needed.''&lt;br /&gt;
; [[Development/Tutorials/Porting_to_D-Bus|Porting from DCOP to D-Bus]]&lt;br /&gt;
: ''Port your applications from DCOP to D-Bus with this handy guide.''&lt;br /&gt;
&lt;br /&gt;
=== Konqueror ===&lt;br /&gt;
; [[Development/Tutorials/Creating Konqueror Service Menus|Creating Konqueror Service Menus]]&lt;br /&gt;
:''This tutorial shows you how to create mimetype-specific actions in Konqueror's context menu (aka &amp;quot;servicemenus&amp;quot;).''&lt;br /&gt;
&lt;br /&gt;
=== Kross ===&lt;br /&gt;
; [[Development/Tutorials/Kross/Introduction|Introduction to Kross]]&lt;br /&gt;
:''An introduction to the Kross Scripting Framework.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Hello_World|Hello World]]&lt;br /&gt;
:''A first application with working kross code.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Call_Functions_in_Kross|Calling Functions in Kross]]&lt;br /&gt;
:''Simple demonstration of calling scripting functions''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Connecting_Signals_and_slots_in_Kross|Connecting Signals and Slots in Kross]]&lt;br /&gt;
:''Simple demonstration of connecting object signals with script slots''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Scripts-as-Plugins|Scripts as Plugins with Kross]]&lt;br /&gt;
:''This tutorial provides a step-by-step introduction how to integrate scripts as plugins into a KDE application.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Scripts-as-KPlugins|Load Kross Scripts as KPlugins]]&lt;br /&gt;
:''This tutorial provides a step-by-step introduction how to load scripts as KPlugins.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Script-Actions|Placing script actions in your application menus ]]&lt;br /&gt;
:''Simple demonstration on how to extend you application menus to execute script files.''&lt;br /&gt;
&lt;br /&gt;
{{:KOffice/Plugin Tutorials}}&lt;br /&gt;
&lt;br /&gt;
=== SuperKaramba ===&lt;br /&gt;
; [[Development/Tutorials/SuperKaramba|SuperKaramba Tutorial]]&lt;br /&gt;
:''This tutorial provides an overview of SuperKaramba, theme files and scripting with Python, Ruby and JavaScript.''&lt;br /&gt;
&lt;br /&gt;
== Plugins and KParts ==&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Writing kontact plugins|Writing kontact plugins]]:''Kontact plugins are KParts. This tutorial describes how you can write one.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Using KParts|Using KParts]]:''Learn how to load a KPart into an application window.''&lt;br /&gt;
&lt;br /&gt;
== Search and Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== Strigi ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Writing file analyzers|Writing file analyzers]]&lt;br /&gt;
:''File analyzers extract data from files to display in the file dialogs and file managers. The data gathered this way is also used to search for files. KDE4 allows the use of multiple analyzers per file type. This tutorial describes how you can write new analyzers.''&lt;br /&gt;
&lt;br /&gt;
=== [http://nepomuk.kde.org Nepomuk] ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/Nepomuk/Quickstart|Nepomuk Quickstart]]&lt;br /&gt;
:''How to use Nepomuk resources in a quick and painless way without much fuss.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/Nepomuk/RDFIntroduction|RDF and Ontologies in Nepomuk]]&lt;br /&gt;
:''An introduction to RDF and the usage of ontologies in Nepomuk.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/Nepomuk/Resources|Handling Resources with Nepomuk]]&lt;br /&gt;
:''Nepomuk is the KDE library which provides easy access to metadata in the Nepomuk system. Learn how to make your application create and read metadata using the Nepomuk system.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/Nepomuk/ResourceGenerator|Using the Nepomuk Resource Generator]]&lt;br /&gt;
:''Nepomuk includes a resource generator which creates convenience classes for handling metadata.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/Nepomuk/AdvancedQueries|Advanced Queries]]&lt;br /&gt;
:''The real power of Nepomuk can only be exposed when performing fancy queries on the data repository. This tutorial provides an introduction to semantic and full text queries in Nepomuk.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/Nepomuk/NepomukServer|The Nepomuk Server and the Architecture of the Nepomuk subsystem]]&lt;br /&gt;
:''The Nepomuk Server hosts the main Nepomuk data repository and can be accessed directly via a Soprano API.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/Nepomuk/NepomukServices|Nepomuk Services]]&lt;br /&gt;
:''The Nepomuk Server manages a set of Nepomuk services.''&lt;br /&gt;
:* [[Development/Tutorials/Metadata/Nepomuk/StorageService|Storage Service]] ''The probably most important service hosts the Nepomuk data repository using [http://soprano.sourceforge.net Soprano].''&lt;br /&gt;
:* [[Development/Tutorials/Metadata/Nepomuk/OntologyLoaderService|Ontology Loader]] ''Makes sure installed ontologies such as RDF, RDFS, NRL, or Xesam are loaded into the storage repository.''&lt;br /&gt;
:* [[Development/Tutorials/Metadata/Nepomuk/FileWatchService|File Watch Service]] ''Monitors the file system for changes and updates the file resource paths and URIs in Nepomuk.''&lt;br /&gt;
:* [[Development/Tutorials/Metadata/Nepomuk/StrigiService|Strigi Service]] ''Controls Strigi, the file indexing tool which extracts metadata from files and stores it into the storage repository.''&lt;br /&gt;
:* [[Development/Tutorials/Metadata/Nepomuk/QueryService|Query Service]] ''Provides persistant query folders.''&lt;br /&gt;
&lt;br /&gt;
== Hardware Awareness (Solid) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Tutorials|Introduction to Solid]]&lt;br /&gt;
:''An introduction to using the Solid hardware discovery and interaction system in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Network_Tutorial|Accessing Network Information]]&lt;br /&gt;
:''How to use the Solid system to get information about the network''&lt;br /&gt;
&lt;br /&gt;
== Privileged Applications (PolicyKit) ==&lt;br /&gt;
; [[Development/Tutorials/PolicyKit/Introduction|Introduction to PolicyKit]]&lt;br /&gt;
:''A straight-forward introduction to what PolicyKit is, and how it can be useful for your next application requiring super-user privileges or user authentication''&lt;br /&gt;
; [[Development/Tutorials/PolicyKit/Helper_HowTo|Using the caller-helper model to perform actions as root]]&lt;br /&gt;
:''This tutorial will teach you how to get your application to perform some actions as root in a completely safe and easy manner, if the user is authorized to, by using PolicyKit and the caller-helper technique''&lt;br /&gt;
; [[Development/Tutorials/PolicyKit/KCM_HowTo|Getting root privileges in KCM Modules]]&lt;br /&gt;
:''This tutorial will teach you how to create KCModules able to save settings as root''&lt;br /&gt;
&lt;br /&gt;
== Multimedia (Phonon) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Phonon/Introduction|Phonon]]&lt;br /&gt;
:''How to start with the multimedia API''&lt;br /&gt;
&lt;br /&gt;
:''How to compile and use Phonon and its GStreamer backend on Linux using Qt 4.3.x''&lt;br /&gt;
::''This article gives you a quick brief of how you can use checkout, compile Phonon and its GStreamer backend on GNU/Linux with just Qt 4.3.x. Towards the end, the article also describes how a developer can make use of Phonon to create simple audio and video players. You can read the article [http://www.vcreatelogic.com/oss/docs/CompilingPhononOnLinux.pdf here]. You can download the editable OpenDocumentText file from [http://www.prashanthudupa.com/phonon/CompilingPhononOnLinux.odt here].''&lt;br /&gt;
&lt;br /&gt;
== Plasma ==&lt;br /&gt;
&lt;br /&gt;
See [[Development/Tutorials/Plasma]] for Plasma tutorials.&lt;br /&gt;
&lt;br /&gt;
== Communication (Decibel) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Decibel/GettingStarted|Getting started with Decibel]]&lt;br /&gt;
:''This tutorial describes how to set up Decibel.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Decibel/Handling_TextChannels|Handling TextChannels]]&lt;br /&gt;
:''This tutorial introduces the basics of handling incoming TextChannels by guiding you through building a simple text chat application.''&lt;br /&gt;
&lt;br /&gt;
== Personal Information Management (Akonadi) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Akonadi/Application|Using Akonadi in Applications]]&lt;br /&gt;
:''Displaying and modifying data provided by Akonadi''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Akonadi/Resources|Developing Akonadi Resources]]&lt;br /&gt;
:''Akonadi Resources are agent programs which transport PIM data between Akonadi and a backend (files, servers, etc)''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Akonadi/SerializerPlugin|Using custom data types with Akonadi]]&lt;br /&gt;
:''Akonadi can handle arbitrary data as item payloads through the use of a plugin based serialization framework''&lt;br /&gt;
&lt;br /&gt;
== Kate / Kwrite ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Kate/KTextEditor Plugins|Getting started with KTextEditor plugins]]&lt;br /&gt;
:''Creating your first KTextEditor plugin''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Kate/KTextEditor_Plugins_Advanced|Developing a plugin with configuration dialog]]&lt;br /&gt;
:''Adding a configuration dialog to the Time &amp;amp; Date example''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Kate/KTextEditor_Example|A small Editor]]&lt;br /&gt;
:''Create a small application using KTextEditor''&lt;br /&gt;
&lt;br /&gt;
==Printing==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Hello World|Hello World]]&lt;br /&gt;
:''Introduction to the KDE printing system''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Print Dialog|Print Dialog]]&lt;br /&gt;
:''Using the KDE print dialog''&lt;br /&gt;
&lt;br /&gt;
== kioslaves ==&lt;br /&gt;
* [[Development/Tutorials/KIO Slaves/Using KIO Slaves in your Program|Using kioslaves in your Program]]&lt;br /&gt;
* [[Development/Tutorials/KIO Slaves/Hello World|Creating a Hello-World kioslave]]&lt;br /&gt;
&lt;br /&gt;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/K_Hot_New_Stuff2|New introduction to Get Hot New Stuff 2]]&lt;br /&gt;
:''A short tutorial about how to use KHotNewStuff2 in your application.''&lt;br /&gt;
&lt;br /&gt;
* old links for KNS1 content:&lt;br /&gt;
; [[Development/Tutorials/Introduction to Get Hot New Stuff|Introduction to Get Hot New Stuff]]&lt;br /&gt;
:''An introduction to the developer-friendly network update system that allows KDE applications to fetch new application data at runtime in a user friendly manner.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KNewStuffSecure|KNewStuff Secure]] ([http://developer.kde.org/documentation/tutorials/knewstuffsecure/index.html Original Link])&lt;br /&gt;
:''Tutorial showing how to share resources in a secured way (KDE 3.4 and later).''  By Andr&amp;amp;#225;s Mantia &amp;amp;lt;amantia@kde.org&amp;amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Goya ==&lt;br /&gt;
; [[Development/Tutorials/Introduction to Goya usage|Introduction to Goya usage]]&lt;br /&gt;
:''An introduction for the Goya subsystem usage, which allows you to easily add widgets to your itemviews and connect their signals to your code, as they were real widgets.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Introduction to Goya usage 2|Introduction to Goya usage (part 2)]]&lt;br /&gt;
:''The second part of the tutorial, with a slightly more complex example than the first part.''&lt;br /&gt;
&lt;br /&gt;
== Other programming languages ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
;[http://www.learningpython.com/2008/09/20/an-introduction-to-pyqt/ An Introduction to PyQt]&lt;br /&gt;
:''Starting off''&lt;br /&gt;
&lt;br /&gt;
;[http://lateral.netmanagers.com.ar/stories/BBS47.html PyQt by Example]&lt;br /&gt;
:''Another introduction to PyQt''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Languages/Python/PyKDE_WebKit_Tutorial|PyKDE WebKit Tutorial]]&lt;br /&gt;
:''A simple web browser application in PyKDE''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Python introduction to signals and slots|101 Introduction to signals and slots]]&lt;br /&gt;
:''A simple introduction to Qt's signal and slot architecture.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Languages/Python/PyKDE_DBus_Tutorial|PyKDE DBus Tutorial]]&lt;br /&gt;
:''An introduction to DBus communication using PyKDE''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ruby ===&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/language-bindings/ruby/kde3tutorial/index.html KDE Ruby Korundum tutorial]&lt;br /&gt;
:''A ruby version of Antonio Larrosa Jim&amp;amp;eacute;nez's KDE tutorial by Richard Dale. See the [http://developer.kde.org/language-bindings/ruby/index.html Ruby Developers Corner] for Qt tutorials and other info.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Qt4_Ruby_Tutorial|Qt4 Ruby Tutorial]]&lt;br /&gt;
:''Trolltech's fabulous introductory tutorial to Qt, translated to Ruby.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/RubyApplet|Creating a Plasma Widget in Ruby]]&lt;br /&gt;
:''Tutorial that shows how to create your first Plasma Applet using the Ruby language.''&lt;br /&gt;
&lt;br /&gt;
=== Shell ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Shell_Scripting_with_KDE_Dialogs|Shell Scripting with KDE dialogs]] ([http://developer.kde.org/documentation/tutorials/kdialog/t1.html Original Link]) &lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to use KDE dialogs in shell scripts with kdialog. It is presented as an example based tutorial.''&lt;br /&gt;
&lt;br /&gt;
== Graphics Programming ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Graphics/Performance|QPainter Perfomance]]&lt;br /&gt;
:''Hints on avoiding common mistakes leading to poor performance when using QPainter''&lt;br /&gt;
&lt;br /&gt;
== Using the KDE Games Libraries ==&lt;br /&gt;
;[[Development/Tutorials/Games/KStandardGameAction| KStandardGameAction]]&lt;br /&gt;
:''Using libkdegames to make your game fit the kdegames standard''&lt;br /&gt;
;[[Development/Tutorials/Games/Highscores| Highscores]]&lt;br /&gt;
:''Implementing a simple highscore table into your game''&lt;br /&gt;
;[[Development/Tutorials/Games/Theme Selector| Theme Selector]]&lt;br /&gt;
:''Using the libkdegames theme selection dialog''&lt;br /&gt;
;[[Development/Tutorials/Games/Palapeli Patterns| Palapeli Patterns]]&lt;br /&gt;
:''Creating a pattern for Palapeli''&lt;br /&gt;
=== KGLEngine ===&lt;br /&gt;
;[[Development/Tutorials/Games/kglengine/kglengine-simpleBox| installation and your first KGLItem]]&lt;br /&gt;
:''start your first kglengine application''&lt;br /&gt;
;[[Development/Tutorials/Games/kglengine/kglengine-motion| item motion]]&lt;br /&gt;
:''how to move kglitem''&lt;br /&gt;
;[[Development/Tutorials/Games/kglengine/kglengine-collision| collision detection]]&lt;br /&gt;
:''how to detect collision and interact ''&lt;br /&gt;
;[[Development/Tutorials/Games/kglengine/kglengine-texture| texture and color]]&lt;br /&gt;
:''apply texture and color for your items ''&lt;br /&gt;
;[[Development/Tutorials/Games/kglengine/kglengine-effects| particles and shadow effects]]&lt;br /&gt;
:''add some nice effects ''&lt;br /&gt;
;[[Development/Tutorials/Games/KGLEngine2d| kglpong]]&lt;br /&gt;
:''Now use our knowledge to make a pong''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== KALEngine ===&lt;br /&gt;
;[[Development/Tutorials/Games/KALEngine| Play hello word sound]]&lt;br /&gt;
:''Using KALEngine for games sound development using openAL''&lt;br /&gt;
;[[Development/Tutorials/Games/KALEngine-music| Play music]]&lt;br /&gt;
:''Using KALEngine to play music in a stream''&lt;br /&gt;
&lt;br /&gt;
== Using the KDE PIM Libraries ==&lt;br /&gt;
;[[Development/Tutorials/PIM/ical| iCalendar functionality]]&lt;br /&gt;
:''Using kcal to manage iCalendar files''&lt;br /&gt;
&lt;br /&gt;
== Other tutorials ==&lt;br /&gt;
&lt;br /&gt;
=== 2D Plotting (KPlotWidget) ===&lt;br /&gt;
;[[Development/Tutorials/KPlotWidget|Using the KDE data-plotting widget]]&lt;br /&gt;
:''This tutorial introduces KPlotWidget, which is used for 2-D data plotting.  It includes information on simple usage of the widget (including adding and modifying data sets, and customizing the plot axes and labels), and advanced customization (including extending the widget through sub-classing).''&lt;br /&gt;
&lt;br /&gt;
=== Spelling and Grammar Checking (Sonnet) ===&lt;br /&gt;
;[[Development/Tutorials/Sonnet/SonnetTutorial|Adding spell-checking or grammar-checking to KDE applications]]&lt;br /&gt;
:''This tutorial introduces Sonnet and how one may use it to add language correction to your KDE application. Sonnet's auxiliary features shall be described in a separate tutorial.''&lt;br /&gt;
&lt;br /&gt;
=== Pixmap cache (KPixmapCache) ===&lt;br /&gt;
;[[Development/Tutorials/KPixmapCache|Using the KDE pixmap cache]]&lt;br /&gt;
:''This tutorial shows how to use KPixmapCache to cache e.g. pixmaps generated from SVGs or some data.''&lt;br /&gt;
&lt;br /&gt;
=== Using MarbleWidget (Marble) ===&lt;br /&gt;
;[[Development/Tutorials/MarbleWidget|Using MarbleWidget]]&lt;br /&gt;
:''This short tutorial describes how to use the MarbleWidget in your project''&lt;br /&gt;
&lt;br /&gt;
=== Using local SCM for KDE development ===&lt;br /&gt;
;[[Development/Tutorials/Git|Using Git to develop for KDE]]&lt;br /&gt;
:''This tutorial shows how to use Git to develop for KDE''&lt;br /&gt;
&lt;br /&gt;
=== Implementing KSysGuard sensors and adding them ===&lt;br /&gt;
;[[Development/Tutorials/Sensors]]&lt;br /&gt;
:''This tutorial shows how to write and KSysGuard sensor and connect it to the systray.''&lt;br /&gt;
Runners&lt;br /&gt;
== KDE2 and KDE3 Materials ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE3|KDE3 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE3.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE2|KDE2 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE2.''&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/Session_Management</id>
		<title>Talk:Development/Tutorials/Session Management</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/Session_Management"/>
				<updated>2009-04-05T19:56:00Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: This tutorial doesn't belong where it is&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This tutorial really shouldn't be linked under the 'Introduction To KDE 4 Programming' section on [[Development/Tutorials]]. IT doesn't fit in _at all_ with the rest of the series either in terms of flow or in target audience. Perhaps you should find another place to link to it from, otherwise I will move the link myself [[User:Milliams|milliams]] 19:56, 5 April 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2008-08-16T17:31:41Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Board Games|Board Games]]&lt;br /&gt;
*[[/Card Games|Card games]]&lt;br /&gt;
*[[Dice Games]]&lt;br /&gt;
*[[Logic Games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
*[[Toys]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
* [[/Akademy 2008 Notes|Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : July 1st/2008 20:00 UTC]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2008-08-16T17:23:02Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Board Games|Board Games]]&lt;br /&gt;
*[[/Card Games|Card games]]&lt;br /&gt;
*[[Dice Games]]&lt;br /&gt;
*[[Logic Games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
*[[Toys]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
* [[/Proposed_Games|Proposed new games]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
* [[Akademy 2008 Notes]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : July 1st/2008 20:00 UTC]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Category:Usability</id>
		<title>Category:Usability</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Category:Usability"/>
				<updated>2008-07-16T18:54:31Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For pages related to usability. See http://usability.kde.org&lt;br /&gt;
&lt;br /&gt;
See also&lt;br /&gt;
* [[:Category:Documentation]]&lt;br /&gt;
* [[:Category:Programming]]&lt;br /&gt;
* [[:Category:Artwork]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG</id>
		<title>Projects/Usability/HIG</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG"/>
				<updated>2008-07-16T18:52:36Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Add to Usability category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Please add any guidelines questions or requests to the [[Projects/Usability/HIG_Questions|HIG Questions]] page.&lt;br /&gt;
&lt;br /&gt;
Also see the  [http://developer.kde.org/documentation/standards/kde/style/basics/index.html KDE3 User Interface Guidelines] and the draft notes for the  [http://wiki.openusability.org/guidelines/ KDE4 Human Interface Guidelines].&lt;br /&gt;
&lt;br /&gt;
==Index==&lt;br /&gt;
===C===&lt;br /&gt;
* [[Projects/Usability/HIG/Capitalization|Capitalization]]&lt;br /&gt;
* [[Projects/Usability/HIG/Check_Box|Check Box]]&lt;br /&gt;
* [[Projects/Usability/HIG/Combo_Box|Combo Box]]&lt;br /&gt;
===E===&lt;br /&gt;
* [[Projects/Usability/HIG/Ellipsis|Ellipsis]]&lt;br /&gt;
===K===&lt;br /&gt;
* [[Projects/Usability/HIG/Keyboard_Accelerators|Keyboard Accelerators]]&lt;br /&gt;
* [[Projects/Usability/HIG/Keyboard_Shortcuts|Keyboard Shortcuts]]&lt;br /&gt;
===M===&lt;br /&gt;
* [[Projects/Usability/HIG/Menu_Bar|Menu Bar]]&lt;br /&gt;
===R===&lt;br /&gt;
* [[Projects/Usability/HIG/Radio Buttons|Radio Buttons]]&lt;br /&gt;
===S===&lt;br /&gt;
* [[Projects/Usability/HIG/Slider|Slider]]&lt;br /&gt;
* [[Projects/Usability/HIG/Spin_Box|Spin Box]]&lt;br /&gt;
===W===&lt;br /&gt;
* [[Projects/Usability/HIG/Warning_and_Error_Messages|Warning and Error Messages]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Usability]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability</id>
		<title>Projects/Usability</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability"/>
				<updated>2008-07-16T18:51:33Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Add to Usability category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The KDE Usability Project aims to improve KDE usability and user experience through:&lt;br /&gt;
&lt;br /&gt;
* Educating developers about usability practices&lt;br /&gt;
* Conducting usability activities to help gather feedback from users&lt;br /&gt;
* Working with projects and help design usable user interfaces&lt;br /&gt;
&lt;br /&gt;
Learn more at the [http://usability.kde.org KDE Usability Project] website.&lt;br /&gt;
&lt;br /&gt;
= [[Projects/Usability/HIG|KDE4 Human Interface Guidelines]] =&lt;br /&gt;
&lt;br /&gt;
If you have questions about guidelines or want to request a missing guideline or change to a guideline, please put it on the [http://techbase.kde.org/Projects/Usability/HIG_Questions HIG Questions] page.  We will refer to this page during the [http://season.openusability.org Season of Usability] KDE4 HIG project.&lt;br /&gt;
&lt;br /&gt;
= User Research Profiles = &lt;br /&gt;
&lt;br /&gt;
The purpose of this template is to provide a place to document an application's user research information for reference during development. Top level items are information everyone in the project should be aware of. Some of the details in the lower sections may take some work and discussion within the project to complete.&lt;br /&gt;
&lt;br /&gt;
[http://techbase.kde.org/index.php?title=Projects/Usability/Project_User_Research_Template Project User Research Template]&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
&lt;br /&gt;
These projects have been called to work on their user research profiles:&lt;br /&gt;
&lt;br /&gt;
* [[Projects/Plasma/PURP|Plasma]]&lt;br /&gt;
* [[Projects/Okular/User_Research_Profile|Okular]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Usability]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/Using_KXmlGuiWindow</id>
		<title>Talk:Development/Tutorials/Using KXmlGuiWindow</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/Using_KXmlGuiWindow"/>
				<updated>2008-05-28T20:30:35Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Example code line numbering */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I had a couple of problems:&lt;br /&gt;
&lt;br /&gt;
In order to make cmake find my installed header files, I needed to specify -DCMAKE_INSTALL_PREFIX=/home/kde-devel/kde&lt;br /&gt;
&lt;br /&gt;
and still it wouldn't compile. I had to change it to use KXmlGuiWindow instead of KMainWindow as it didn't seem to be able to use setupGUI(); &lt;br /&gt;
&lt;br /&gt;
/Sune&lt;br /&gt;
&lt;br /&gt;
== Why KXmlGuiWindow??? ==&lt;br /&gt;
&lt;br /&gt;
Hi! I can't understand why KXmlGuiWindow is used. There are no any xml files. And it's used in the tutorial as KMainWindow.&lt;br /&gt;
Also the title is &amp;quot;How To Use KMainWindow&amp;quot;.&lt;br /&gt;
So, from my point of view it needs to be improved.&lt;br /&gt;
--[[User:Powerfox|Powerfox]] 00:29, 29 July 2007 (CEST)&lt;br /&gt;
: Why? This page is the base for the next part, &amp;quot;using KAction&amp;quot;. Giving a correct skeleton now can save some work later. -- [[user:Pino|pino]] 15:52, 29 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Example code line numbering ==&lt;br /&gt;
&lt;br /&gt;
Hello, I am working through this tutorial and am having a problem cutting and pasting the code from this page to my text-editor.  The line number information is copied with each selection.  This means that I have to go back through it and delete the numbers 1, 2, 3, 4, 5.... (and extra spaces and such) for each line.  the first tutorial IMO seemed to do this in a more copy-paste friendly way.   Note I do like having the line numbers, but I would also like to be able to copy-paste the code easily.&lt;br /&gt;
:As I answered to a similar post on one of the other tutorials, I can't replicate this problem. With Konqueror 3 and 4, Firefox 2 and Opera I can select the code without selecting the line numbers too. What browser are you using? --[[User:Milliams|milliams]] 22:30, 28 May 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tools/Automoc4</id>
		<title>Talk:Development/Tools/Automoc4</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tools/Automoc4"/>
				<updated>2008-05-16T18:50:20Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: New page: This is probably best suited under Development/Tools or under Projects --~~~~&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is probably best suited under [[Development/Tools]] or under [[Projects]] --[[User:Milliams|milliams]] 20:50, 16 May 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan</id>
		<title>Schedules/KDE4/4.1 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan"/>
				<updated>2008-05-05T15:15:53Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Update text to reflect current release mode&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for KDE 4.1. '''The deadline for adding entries to this page has already passed'''.&lt;br /&gt;
&lt;br /&gt;
Any features which are not mentioned on this page must be rescheduled for 4.2 and added to the list at [[Schedules/KDE4/4.2 Feature Plan]].&lt;br /&gt;
&lt;br /&gt;
Please ensure that any entries you have on this page are kept up to date with respect to their status (''todo'', ''in-progress'' or ''done'').&lt;br /&gt;
&lt;br /&gt;
Legend:&lt;br /&gt;
* todo =&amp;gt; not started yet&lt;br /&gt;
* in-progress =&amp;gt; started, but not completed yet&lt;br /&gt;
* done =&amp;gt; completed&lt;br /&gt;
__TOC__&lt;br /&gt;
= kdelibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|various|[[Projects/Widgets_and_Classes | Classes and Widgets]] that should be moved from others modules up into kdelibs|kde-core-devel@kde.org|The Core Developers}}&lt;br /&gt;
{{FeatureDone|kdeui|Add KFadeWidgetEffect to easily add fading UI transitions to KDE applications|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureDone|kdeui|Make icon naming spec compliant 3rd party icon themes like Tango or gnome-icon-theme work correctly.|jpetso@gmx.at|Jakob Petsovits}}&lt;br /&gt;
{{FeatureDone|kross|Add QtScript support|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KHTML|Support CSS3 Media Queries|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureDone|KHTML|Efficient smooth scrolling|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureDone|Phonon KCM|More UI feedback|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|VideoWidget snapshot function|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|better integration of pulseaudio|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|make AbstractMediaStream/StreamInterface threadsafe|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|allow backend switching on the fly|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|Phonon|add Port class for fine grained control over data flow between Phonon objects|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureDone|Phonon|subtitle, audio track selection|kretz@kde.org|Matthias Kretz and Ian Monroe}}&lt;br /&gt;
{{FeatureTodo|Phonon|DVD menu selection support|imonroe@kde.org|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Phonon|&amp;quot;low-level&amp;quot; PCM I/O with at least an ALSA implementation|kretz@kde.org|Matthias Kretz and Ian Monroe}}&lt;br /&gt;
{{FeatureTodo|Phonon|update device preference on the fly|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Goya, a framework for inserting controls into itemviews in a really easy and fast way|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureInProgress | kdeui | Rich textedit widget supporting most rich text features. | steveire@gmail.com | Stephen Kelly }}&lt;br /&gt;
{{FeatureInProgress|kdeui|Shortcut schemes for KDE applications|adymo@kdevelop.org|Alexander Dymo}}&lt;br /&gt;
{{FeatureDone|kmimetypetrader/kbuildsycoca|Replace use of profilerc for ordering applications with new mimeapps.list standard|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureInProgress|knewstuff|Support caching, and speed up the interface through use of Models/Views and goya|jeremy@scitools.com|Jeremy Whiting}}&lt;br /&gt;
{{FeatureInProgress|Phonon KCM|Handle advanced devices|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Reintroduce KDEPrint in some form, depending on what Qt4.4 delivers.|john@layt.net|john Layt}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Add CUPS Options tabs to QPrintDialog to support n-up, page borders, banner pages, page labels, mirror pages, job scheduling, and manual CUPS options.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|Add framework for standard actions for 'Send to...' for e-mail, fax, etc by printing to PDF/PS.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|Migrate FilePrinter class from Okular to enable file printing for all apps via QPrinter, modify to utilise new Qt4.4 features.  To be discussed on k-c-d first.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KIO|speed limits on KIO Transfers|nolis71cu@gmail.com|Manolo Valdes}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Printing of shortcuts from the shortcut dialog|apaku@gmx.de|Andreas Pakulat}}&lt;br /&gt;
{{FeatureDone|Kate Part|Annotation framework for the editor|apaku@gmx.de|Andreas Pakulat}}&lt;br /&gt;
{{FeatureInProgress|KJS|Bytecode interpreter and performance improvements|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureInProgress|KHTML|Sync class and file structure with WebKit to prepare merging|porten@kde.org|Harri Porten}}&lt;br /&gt;
{{FeatureInProgress|KHTML|contentEditable/designMode implementation|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KCalenderSystem|Complete migration of Jalali, Hijri, and Hebrew calendars to new code base.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KCalenderSystem|Add new calendar systems: Indian Civil (Saka), Ethiopean, Chinese, Pure Julian, Pure Gregorian. (Note, not all may live in kdelibs or be available as a global calendar system)|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KLocale|Implement KLocale based methods to return weekend days and day of religious observance.  Currently KCalendarSystem provides dayOfPray(), but for Gregorian this is not correct in all locales where it is used.  Currently KDatePicker hardcodes Saturday and dayOfPray() as weekend days which may not be correct in all locales.  To be discussed first on k-c-d and with kdepim.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|dnssd|Models for service browser and domain browser.|qbast@go2.pl|Jakub Stachowski}}&lt;br /&gt;
{{FeatureTodo|KHTML|Adaptable/Scriptable workarounds for broken websites.|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureTodo|KHTML|support for borders-* properties from the CSS3 Background and Borders Module|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KHTML|support for Audio/Video tags from the HTML5 draft specification|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureDone|KHTML|prospective loading of other network resources while waiting for arrival of blocking scripts|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureInProgress|KJS|Public API for extensions. Possibly analog to JavaScriptCore's C API.|porten@kde.org|Harri Porten}}&lt;br /&gt;
{{FeatureTodo|KTextEditor|Several interface extensions (e.g. open/save filter)|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureTodo|KTextEditor|Plugin for basic collaborative editing|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureInProgress|Kate Part|Scripting support for indentation and little helpers|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureTodo|Kate Part|Input modes to allow e.g. vim-like editing|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureDone|KIO|Implement support for inline editing in KFileItemDelegate|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureDone|KIO|Add support for drawing text shadows in KFileItemDelegate|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Emoticons lib|An emoticons library so each applications doesn't have to implement the same things over and over again |brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureInProgress|KFile|Implement fd.o desktop-bookmark-spec for KFilePlacesModel|nf2@scheinwelt.at|Norbert Frese}}&lt;br /&gt;
{{FeatureTodo|kdeui| Support for About Data of libs and modules used by a program |kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|kdeui|Drop-in replacement for QFontComboBox, with more informative previews in non-Latin1 locales|caslav.ilic@gmx.net|Chusslove Illich}}&lt;br /&gt;
{{FeatureInProgress|KAboutLicense|Select licenses by keyword, to centralize license info texts for frequent licenses.|caslav.ilic@gmx.net|Chusslove Illich}}&lt;br /&gt;
{{FeatureTodo|KIO|KIO::AuthInfo and PasswordDialog: optional fields (like &amp;quot;domain&amp;quot;); optional anonymous switch and flag to suppress KIO's password caching|nf2@scheinwelt.at|Norbert Frese}}&lt;br /&gt;
{{FeatureTodo|kdeui|Support for KConfigGroup in KConfigSkeleton|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepimlibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Akonadi|Move the Akonadi development library from kdepim.|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Item size ([[Projects/PIM/Akonadi#Core|details]])|thomas.mcguire@gmx.net|Thomas McGuire}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Payload serialization format versioning ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Item streaming in ItemSync/ResourceBase ([[Projects/PIM/Akonadi#Core|details]])|tomalbers@kde.nl|Tom Albers}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|API for additional item parts ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org,tokoe@kde.org|Volker Krause/Tobias Koenig}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Infrastructure for showing additional dialogs from agents/resources ([[Projects/PIM/Akonadi#Core|details]])|tomalbers@kde.nl|Tom Albers}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Allow to limit ItemFetchJob to current cache content ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Fix API for item/collection modifications ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Error reporting ([[Projects/PIM/Akonadi#Core|details]])|tokoe@kde.org|Tobias Koenig}}&lt;br /&gt;
{{FeatureTodo|gpgme++2|newly designed gpgme++ (multithreaded, exceptions, less event loop integration: better for Windows)|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureTodo|kpimutils|Change linklocator to use the new emoticon lib|brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Dolphin|Details-view: Allow to open folders as tree (turned off per default).|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Refactor view-action handling to a DolphinViewActionHandler to share more code with DolphinPart|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureDone|Konqueror|Re-implement Copy To / Move To in the popup menu|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureDone|Konqueror|Separate Home URL settings in konquerorrc and kfmrc; save toolbar settings into the profile automatically|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureDone|Dolphin|Simplify selecting of files in the single-click mode (based on http://aseigo.blogspot.com/2006/04/icons.html).|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Raptor|The KDE4-Application-Menu}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Provide optional tooltips for files and directories.|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Tabs|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Bring back the large tooltip like in kde3|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Session management (save/restore session/restore from crash).|edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Support for undo closed window.|edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureDone|Konqueror|Allow to configure the Dolphin KPart within the Konquerors settings dialog.|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Improve code and usability.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Reimplement partitions list.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Reimplement memory module.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Reimplement PCI module.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureTodo|KInfocenter|Reimplement Network module.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Plasma|Kickoff orientation dependent layout|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureDone|kmenuedit|Restore menu system|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureDone|KCM autostart|Configure autostart desktop file|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureDone|Plasma|improve fail to launch and needs &lt;br /&gt;
config|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureDone|ksmserver|UI for selecting WMs|l.lunak@kde.org|Luboš Luňák}}&lt;br /&gt;
{{FeatureDone|Plasma|polish kickoff|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureDone|Plasma|toolbox improvements |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureDone|Plasma|GHNS2 plasma themes|jeremy@scitools.com|Jeremy Whiting}}&lt;br /&gt;
{{FeatureDone|Plasma|Resizable, relocatable panel|binner@kde.org|Stephan Binner}}&lt;br /&gt;
{{FeatureInProgress|Solid|Refactor Solid::Control networking|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|Solid|Backend for NetworkManager 0.7|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|System Settings|Filtering/Lazy load category modules|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KSysGuard|Monitor process I/O|tapsell@kde.org|John Tapsell}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Mac-like menu bar plasmoid|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Add 'smart setting' of extended colors|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Add KDE3 scheme import|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Query kwin for supported colors; add full set of kwin colors|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|reintroduce KDEPrint Print Management tools, e.g. KCM, kprinter, kjobviewer, etc.  Depends upon progress of kdelibs side of KDEPrint and Qt4.4 feature set.|john@layt.net|john Layt}}&lt;br /&gt;
{{FeatureTodo|System Settings|Administrator mode support|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|krunner|Revamp GUI.|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|Plasma|keyboard shortcuts|Chani Armitage|chanika@gmail.com}}&lt;br /&gt;
{{FeatureInProgress|Plasma|webkit widget|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|shared timer in engines|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|welcome plasmoid|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|dashboard widget support|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasmagik packaging (and package classes)|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Scriptengines|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureInProgress|Plasma|QtScript scriptengine|richmoore44@gmail.com|Richard Moore}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Filebrowser Plasmoid|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Improve QtScript support|richmoore44@gmail.com|Richard Moore}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Zooming User Interface|chanika@gmail.com|Chani Armitage}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Multiple Desktop Containments|chanika@gmail.com|Chani Armitage}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Networkmanager Plasmoid and DataEngine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureInProgress|Plasma|API changes [[Projects/Plasma/Tokamak1]]|panel-devel@kde.org|Plasma team }}&lt;br /&gt;
{{FeatureInProgress|Plasma|Panel Toolbox|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Panel changes to make it work with the new default theme|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Generic folder view applet/containment, that can also be used as the desktop background (showing the desktop folder).|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Krunner|Configuration options for blacklisting, user ranking, runner ranking, learning|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureTodo|Krunner|Simple learning|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureTodo|Krunner|Simple GUI for above options|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureTodo|Krunner|Runners able to share parsing|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureInProgress|Krunner|Configuration dialog for KRunner|ryan.bitanga@gmail.com|Ryan P. Bitanga}}&lt;br /&gt;
{{FeatureTodo|Krunner|Noun-Verb support|ryan.bitanga@gmail.com|Ryan P. Bitanga}}&lt;br /&gt;
{{FeatureDone|Plasma|Temperature sensing in the device engine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureDone|Plasma|Video data in the device engine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureTodo|Plasma|New plasma themes|nuno@oxygen-icons.org|Nuno Pinheiro}}&lt;br /&gt;
{{FeatureTodo|Plasma|physics-based animator|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|Improve the base set of plasmoids|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|New wallpapers|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|New way of handling wallpapers and different sizes (package format, and so on...)|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|Top-level windows plasmoids|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureDone|Plasma|change showConfigurationInterfaction to createConfigurationInterface|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|Plasma::Service |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|panel hiding |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureDone|KWin|non-linear animations also for KWin|sebas@kde.org|Sebastian Kuegler}}&lt;br /&gt;
{{FeatureInProgress|KWin|Compiz's wobbly like effect for KWin|cedric.borgese@gmail.com|Cédric Borgese}}&lt;br /&gt;
{{FeatureTodo|KDM|Theme KDM (login manager) by default|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureTodo|Splash screen|New default splashscreen|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|Nepomuk|Simple Desktop Search client based on Nepomuk search|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Add a dataengine that implements galago-project Notifications DBus interface and a plasmoid which provides cute visualization of notifications along with nice and easy way to interact with them|dimsuz@gmail.com|Dmitry Suzdalev}}&lt;br /&gt;
{{FeatureInProgress|Plasma|loadDefaultSetup from a file, not hardcoded|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|ksmserver|Make the fade-to-gray logout effect work even when composite is disabled|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|nepomuk|Service that monitors file rename and delete operations and updates the metadata accordingly. kded module already exists in playground. problem: depends on inotify.|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|KCM emoticons|Adding/editing/removing emoticons theme|brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureDone|KCM splash screen|Be able to install splash screen themes via GHNS2|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KCM icons|Be able to install icon themes via GHNS2|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureInProgress|phonon-xine|snapshots in video widget|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|try to make VideoWidget work on GraphicsView|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|make states compatible to other backends|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|better support for pulseaudio (most work possibly in kdelibs)|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-gstreamer|Make phonon-gstreamer as released with Qt 4.4 fully integrate into KDE and add the features added to libphonon after libphonon 4.1|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|desktop ioslave|Add an ioslave that lists the contents of the desktop folder, and reports the names in the .desktop files instead of the actual file names.|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureDone|knotify|Add support for galago-like desktop notifications spec - if knotify will find a certain DBus service on session bus, it'll forward its popup notification events to this service |dimsuz@gmail.com|Dmitry Suzdalev}}&lt;br /&gt;
{{FeatureInProgress|Oxygen cursors|Oxygen cursor set|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KMagnifier|Add color blindness simulation|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|KMagnifier|Refactor color menu, re-add invert, add color-shift modes to help people with color blindness|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeadmin =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KSystemLog|KSystemLog, a Log Viewer Tool. Move from kde-apps|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Do some refactoring in KCron|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Improve ergonomy and general interface|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Fix all existing bugs in KCron|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Convert KCron into a KCM Module, to use it in System Settings|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureInProgress|Environment Variables|Create a environment variables KCM Module|nicolas.ternisien@gmail.com}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeartwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebindings =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|Smoke2|Move modular Smoke2 to kdebindings-trunk.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|PHP-Qt|Move PHP-Qt to kdebindings-trunk.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureDone|kross|Move krossjava to kdebindings-trunk.|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureInProgress|General|Wrap some more APIs (at least Akanodi for all languages and Plasma for C#)|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|Qyoto|Add delegate support for signal/slot connections.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeedu =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Kalzium|Clean up the database. I am syncing with the BlueObelisk data repository again. There we decided to remove the density (not a element property but a compound property. I also removed the mean weight. We think it is better to provide correct data than a lot (but partly wrong) data.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Calculator Plasmoid|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Vector support|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureDone|Step|A physics simulator, move from playground to kdeedu module |ks.vladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureDone|Kalzium|Update the snapshot of libavogadro to 0.6.1. This introduces a gazillion new possibilities for the 3D renderer and fixes many issues.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Make use of the new libavogadro-version.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Expose molecular editing features of libavogadro.|marcus@cryos.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureTodo|Kalzium|Port Kalzium's periodic table to use new QGraphicsView.|marcus@cryos.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureInProgress|KStars|Tool to predict Conjunctions|akarshsimha@gmail.com|Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|Marble|DGML2 Support|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|KDE-Version settings dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Port authors list from the Qt-About dialog to the KDE-About dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Qt-Version settings dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Improved KML support|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|OpenStreetMap support using original OSM tiles|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Real Time Cloud-Cover|tackat@kde.org|David Roberts / Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Map Contents translation|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Copy position to clipboard|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureDone|Marble|Create Tiles on compile time|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Mercator Projection|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureInProgress|Marble|More generic projection support|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureInProgress|Marble|Usage of Marble in non-widgets|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Export map to MxN pixel bitmap|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Support for MarbleWidget::setEnabled( bool )|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Layer Management Class|tokoe@kde.org|Tobias König}}&lt;br /&gt;
{{FeatureTodo|Marble|Plugin architecture for map layers|tokoe@kde.org|Tobias König}}&lt;br /&gt;
{{FeatureInProgress|KEduca|Rewrite of the classic test writing/taking application|matt@milliams.com|Matt Williams}}&lt;br /&gt;
{{FeatureDone|Parley|Redesigned main window|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|Parley|Vocabulary Plasmoid|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|KBruch and KPercentage|Merge in 1 app|pete@pmurdoch.com|Peter Murdoch}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Plasmoid to access Kalzium database|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Step|Improve GUI for creating gas and softbody|ksvladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureInProgress|KAlgebra|Variables share between calculations|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Export canvas as image|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Optional rulers/grid for canvas units|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add command line|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add a color picker|nielsslot@gmail.com|Niels Slot}}&lt;br /&gt;
{{FeatureInProgress|Parley|Declensions|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|Parley|Improved printing support|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureTodo|KLettres|Number support|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KLettres|Theme manager|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Add a Open File action|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Integrate an editor|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Plasmoid|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Theme manager|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KLettres|Visual indicator when letter is wrong|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|Kiten|Link radselect with kiten|jkerian@gmail.com|Joe Kerian}}&lt;br /&gt;
{{FeatureInProgress|Kiten|Sort output by dictionary/user selected sorting values|jkerian@gmail.com|Joe Kerian}}&lt;br /&gt;
{{FeatureTodo|Step|Use common constraints handling code for collisions|ksvladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureDone|Kig|Cubic-line intersection in case two of the three intersection points are already present|paolini@dmf.unicatt.it|Maurizio Paolini}}&lt;br /&gt;
{{FeatureTodo|Kig|Properties dialog for objects.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Improve construction of bisect lines.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Improve feedback when constructing objects.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|More geometric objects.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Script objects as macros (to be reused more than once).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Improve the Cabri import filter.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KDiamond|New game, move to kdegames|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KDiamond|Get themes with KNewStuff|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Better scoring system|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Add support for loading new themes|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureDone|Kollision|Move to kdereview/kdegames|p.capriotti@gmail.com|Paolo Capriotti}}&lt;br /&gt;
{{FeatureDone|Kubrick|New game, 3D OpenGL - move to playground|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Polish up the features|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Port to Qt4 and KDE4|ianw}}&lt;br /&gt;
{{FeatureDone|KBlocks|Finish display of points and level|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Implement KNewStuff support|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Implement key/action/shortcut configuration|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Docbook|piacentini@kde.org}}&lt;br /&gt;
{{FeatureInProgress|KGoldRunner|Improved theming and animation|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KGoldRunner|Sound support and theming|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KSquares|Multiplayer support|josef}}&lt;br /&gt;
{{FeatureDone|KsirK|New game, move to kdereview|kleag@free.fr|Gaël de Chalendar}}&lt;br /&gt;
{{FeatureDone|KsirK|Make network games work again|kleag@free.fr|Gaël de Chalendar}}&lt;br /&gt;
{{FeatureDone|KBattleship|Bring back Zeroconf support for network games|qbast@go2.pl}}&lt;br /&gt;
{{FeatureInProgress|Kubrick|New game, 3D OpenGL - in kdereview|ianw}}&lt;br /&gt;
{{FeatureInProgress|KGGZ|Add kggzcore and kggzdmod libraries|josef}}&lt;br /&gt;
{{FeatureTodo|KBlocks|Add additional themes|piacentini@kde.org}}&lt;br /&gt;
{{FeatureInProgress|KBreakout|Finish it, and move it from playground to kdegames|fela.kde@gmail.com}}&lt;br /&gt;
{{FeatureTodo|KGGZ|Add new Qt4-based core client as successor to the old KDE3-based KGGZ|josef (now SoC proposal)}}&lt;br /&gt;
{{FeatureTodo|KGGZ|Fire-and-forget highscore submission for single-player games and client-to-client multiplayer games|josef)}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Also see kdegames/kgoldrunner/TODO|ianw}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Hot new stuff support for themes and levels|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Startup screen|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KMahjongg|Reimplement the Board Editor|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KMines|Add pause actions|eike.lange@kdemail.net}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Configurable keyboard support|eike.lange@kdemail.net}}&lt;br /&gt;
{{FeatureTodo|KNetWalk|Support for custom and non-square board sizes|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureTodo|KShisen|Port to KScoreDialog|piacentini@kde.org}}&lt;br /&gt;
{{FeatureTodo|Kubrick|See SVN file kubrick/TODO|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Move to KDE Games for 4.1|ianw}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Gwenview|Undo system|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Gwenview|Fullscreen meta information|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Gwenview|Ability to open an image with another application|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Okular|Better Text-To-Speech integration: speech the whole document, the current page or the selection.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureDone|Okular|Encryption support for ODF generator|bradh@kde.org}}&lt;br /&gt;
{{FeatureInProgress|Okular|Backward direction for text search.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|Centralized text &amp;amp; graphics antialias configuration.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureDone|Okular|EPub backend.|elylevy@cs.huji.ac.il|Ely Levy}}&lt;br /&gt;
{{FeatureInProgress|Okular|Improved form support (add missing types, handle the fields better).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Support for tagging with Nepomuk|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Thumbnail bar in view and fullscreen modes|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Crop ratio|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|KIPI support|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Red eye correction|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Start page|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Okular|JavaScript support (mostly for PDF documents).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|Improved placement and sizing of the presentation mode: choose the screen to use, adapt to screen size changes.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Caret annotations.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|File attachment annotations (read only for now).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Sound annotations.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Link annotations.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Improve annotation support: for existing types (rubber stamps, line, note, etc), and for the way they are constructed and handled.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Separate the &amp;quot;view properties&amp;quot; out of the Document, in a View class. Use it for the page view and the presentation mode.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Per-document zoom level.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|libksane|Move libksane to kdegraphics|kare.sars@kolumbus.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureTodo|ksaneplugin|Replase libkscan with ksaneplugin|kare.sars@kolumbus.fi|Kåre Särs}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Dragon Player|A simple Phonon-based videoplayer application|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|Make Dragon indipendent from Xine|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|File Manager|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|play media dialog|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|slider changes|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|show info while playing audio files|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdenetwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KGet|Group-Settings|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Torrent-Support|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Transfer-Settings|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Webinterface|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|Kopete|AIM offline messages|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureDone|Kopete|OTR Encryption support|michael_zanetti@gmx.net|Michael Zanetti}}&lt;br /&gt;
{{FeatureDone|Kopete|Status manager|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureDone|Kopete|Non-intrusive notification system|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureInProgress|KGet|MultiSource-Downloading|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|Kopete|Bring back chat style selection via knewstuff2|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Kopete|ICQ 6 status icons|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureInProgress|Kopete|MSNP15 implementation for MSN|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|UPnp Support|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Updated contact list interface (uses Qt 4 rather than Qt 3)|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Use notebook lid for auto away|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureTodo|Kopete|Update Kopete to better support Decibel|kopete-devel@kde.org|Kopete Developers}}&lt;br /&gt;
{{FeatureTodo|Kopete|use the new emoticons library|brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureInProgress|KGet|Nepomuk-Integration|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureInProgress|KGet|Support mms://-protocol, see https://launchpad.net/libmms|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Global Speedlimits|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Setup libbtcore from KTorrent in KGet (to avoid dependency to extragear)|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureInProgress|KGet|Extend the TransferHistory to use SQLite and XML-Backends and display the information inside a kcategorizedview|jgoday@gmail.com|Javier Goday}}&lt;br /&gt;
{{FeatureTodo|Kopete|GroupWise chatroom support|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|[http://decibel.kde.org Decibel]|Decibel, a framework for real time communication services. Move from playground/pim|info@basyskom.de|Tobias Hunger}}&lt;br /&gt;
{{FeatureDone|KRDC|Optional system tray icon (with quick access to bookmarks)|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Improved behavior of entering special keys for better workflow|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Zeroconf support (detecting remote desktop services in local network)|romnes@stud.ntnu.no|Magnus Romnes}}&lt;br /&gt;
{{FeatureInProgress|KRDC|Bookmark dock widget for quick access to bookmars, zero conf detected services and recently used connections|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Support for up- and downscaling VNC remote desktop|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Network Manager Applet|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepim =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KAddressbook|Ability to add LDAP search results to distribution lists|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|Indication of which resource folder a contact belongs to|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|Read-only view for contacts in read-only folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|copy/cut/paste context menu items|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAlarm|Allow use of multiple calendar resources|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Handle time zones and seasonal time changes properly|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Abolish alarm daemon and make kalarm trigger alarms itself|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Replace simple repetitions by recurrence sub-repetitions to reduce confusion|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|New option for display alarm text to be generated by a command|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|New option to specify reminder times in minutes|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Prevent multiple identical error messages accumulating for the same alarm|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Provide &amp;quot;don't show again for this alarm&amp;quot; option for command error messages|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Remember main window show/hide options used when KAlarm closed instead of setting them in Preferences dialog|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Simplification and improvements to alarm edit dialog|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Option to display alarms in centre of screen, with enable delay on buttons to avoid accidental acknowledgement|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|Kleopatra|Ability to search in internal and external certificates at the same time|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kleopatra|General UI Server|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureDone|Kleopatra|New, tabbed, mainwindow design|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to create hyperlinks in HTML messages|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to easily create todos with reminders from emails|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to open messages from search results when the reader is hidden|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better invitation update emails showing what changed|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better reminder visualization in very small events|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better, natural language search criteria names|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Clickable status columns|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Client side configurability of warnings in shared folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Colored ribbons for indication of signing and encryption status in the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Configuration option for whether invitation emails are automatically deleted or not when having been acted upon|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Copy/paste and drag and drop from/to the mail composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Decryption on demand in reader window|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Display of quota information in foldertree tooltips|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop and copy and paste support in the search result viewer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop from the mail reader window and mime-tree viewer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop of folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Editing of attachments from the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Export and import of filters|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Favorites Folder|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Folder quicksearch|m.koller@surfeu.at|Martin Koller}}&lt;br /&gt;
{{FeatureDone|KMail|Harmonization of actions in main and standalone mail reader windows|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|IMAP Server storage of non-standard flags|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Improved TNEF attachment handling|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Improved quota warnings|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Initialize full search from quicksearch on request|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Override font and fontsize for standalone message viewers|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Per-folder identity configurability|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Recursive IMAP cache troubleshooting|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Resizable recipients area in composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for creating new mails based on received mails (Resend)|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for immediate sync of resource folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for soft line breaking|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Tab navigation through groups in the address completion|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Text snippets with shortcuts and variable expansion in the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Warning about active out-of-office scripts|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|lost+found recovery of locally changed folders that lose access rights|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KNotes|Ability to print notes|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KonsoleKalendar|Support &amp;quot;file&amp;quot; and &amp;quot;localdir&amp;quot; resources|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureDone|Kontact|Config option to close despite system tray|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Harmonization of component naming in sidebar, configuration, summary view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Right-aligned component navigation toolbar|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Ubiquitous sync actions|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Ability to have both distribution lists and addresbook extension visible|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Aggregated reminders view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Better default resource colors|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Drag and drop of attachments|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Faster initial loading of kolab resources|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Forwarding and delegation of invitations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Improved coloring of agenda view items|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Improved event printing|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Merge of the attachment view in into the main page|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Merge of the free-busy and attendee views for easier scheduling|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Month view scrolling, paging, mouse-wheeling|tom_t@gmx.at|Thomas Thrainer}}&lt;br /&gt;
{{FeatureDone|KOrganizer|More readable Kolab resource folder labels|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Redesigned incidence editor UI|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Side-by-side calendar view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Support for by-value attachments|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Timeline calendar view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Rich text incidence editor|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Hide/Show reminder daemon icon in the systeay|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Column-specific whatsthis-help| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Combined search and add task widget| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Drag&amp;amp;Drop| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|File management (file-&amp;gt;load)| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Managing history| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Tracking tasks by active applications| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Whatsthis-help dependent on if a task has been created| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureInProgress|Akregator|Support for syncing the feed list with Google Reader |osterfeld@kde.org|Frank Osterfeld}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|New option to restrict alarms to working hours|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|Kleopatra|OpenPGP support|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureInProgress|KMail|HTML  Signatures|yez@familieschepers.nl|Edwin Schepers}}&lt;br /&gt;
{{FeatureInProgress|KNotes|Zeroconf support for sending notes on LAN|qbast@go2.pl|Jakub Stachowski}}&lt;br /&gt;
{{FeatureInProgress|Kontact|New Planner summary; combines Appointment+To-do+SpecialDates into 1 pretty summary|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureInProgress|KOrganizer|New To-do View (model/view)|tom_t@gmx.at|Thomas Thrainer}}&lt;br /&gt;
{{FeatureInProgress|KOrganizer|New Month View (qgraphicsitem)|bvirlet@kdemail.net|Bruno Virlet}}&lt;br /&gt;
{{FeatureInProgress|KPilot|Finish Keyring conduit, base conduit code and test cases, category syncing|jkasper@kde.org|Jason 'vanRijn' Kasper}}&lt;br /&gt;
{{FeatureTodo|Akregator|Basic support for enclosures (Displaying links, mimetype and size)|osterfeld@kde.org|Frank Osterfeld}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Option to display alarm only if pre-alarm command succeeded|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|[http://kblogger.pwsp.net KBlogger]|KBlogger, a blogging application| christian_weilbach@.web.de|Christian Weilbach}}&lt;br /&gt;
{{FeatureTodo|Kleopatra|Konqueror and Dolphin Kleopatra plugins|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureTodo|KMail|Aggregated attachment view in the mail header area of the reader window|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KMail|Improved error messages and audit log for cryptographic operations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|Kontact|Support for Kontact wide profiles|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Ability to jump to the right day in the agenda from invitation mails|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Drag and drop in the free-busy view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Support for comments in replies to invitations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Support for extended free-busy lists|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Blog-styled journal view|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Blogging KResource|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureTodo|KPilot|Port old conduits to new base conduit architecture and KDE4/Qt4|jkasper@kde.org|Jason 'vanRijn' Kasper}}&lt;br /&gt;
{{FeatureTodo|KMail|Port to use KRichTextEdit|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
{{FeatureTodo|KBlogger|Port to use KRichTextEdit (Or KMEditor)|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
{{FeatureTodo|KNode|Port to use KRichTextEdit (Or KMEditor)|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdesdk =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Cervisia|New context menu entry &amp;quot;Add to Ignore List&amp;quot;|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
{{FeatureDone|Lokalize|Move this application (formerly known as Kaider) from extragear|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Cervisia|A file view based on KDirModel|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
{{FeatureInProgress|Lokalize|various Translation Memory enhancements|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Lokalize|XLIFF support|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|KBugBuster|Make it work|fabiolocati@gmail.com|Fabio Locati}}&lt;br /&gt;
{{FeatureInProgress|KCachegrind|Everything working again|josef.weidendorfer@gmx.de|Josef Weidendorfer}}&lt;br /&gt;
{{FeatureInProgress|Kate|Session plasmoid|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Make a GUI for it - in kdereview|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a PyQt4 template - in kdereview|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a Ruby template - in kdereview|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a Plasmoid template - in kdereview|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KAppTemplate|Add DBUS support in templates|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KCachegrind|Better handling of huge symbols|josef.weidendorfer@gmx.de|Josef Weidendorfer}}&lt;br /&gt;
{{FeatureTodo|Lokalize|Kross-based scripting|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|Lokalize|QA: glossary checklists|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|kioslave svn|Add Export/Import feature|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureTodo|Kate App|Improved session management|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdetoys =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeutils =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|printer-applet|Add printer applet for viewing print jobs and printer auto-configuration.|jriddell@ubuntuFIXMEcom|Jonathan Riddell}}&lt;br /&gt;
{{FeatureDone|Okteta|binary/hex editor (successor to KHexEdit). Move from playground/utils.|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureDone|Okteta|enable extract-strings tool and add copy|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|make printing support only selection|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|ask artists for own icon|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add &amp;quot;Export as&amp;quot;|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|more explicit titels for undo/redo actions, also from filters|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|parameter dialog for &amp;quot;Copy as...&amp;quot;|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for blocking processes like printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|refactor KByteArrayView|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|KDiskFree|Use Solid API|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureTodo|KwikDisk|Replace it by a Plasmoid (in the desktop bar and on the desktop|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureInProgress | KJots | Support more rich text features like text formatting, hyperlinks and ordered/unordered lists. | steveire@gmail.com | Stephen Kelly }}&lt;br /&gt;
{{FeatureDone | KJots | Add checkmarks to pages. | steveire@gmail.com | Stephen Kelly }}&lt;br /&gt;
{{FeatureInProgress | KJots | Port to KRichText widget. | steveire@gmail.com |Stephen Kelly }}&lt;br /&gt;
{{FeatureTodo | KJots | Create a Kontact::Plugin to integrate kjots into Kontact. | steveire@gmail.com |Stephen Kelly }}&lt;br /&gt;
{{FeatureDone|SuperKaramba|Integrate Kross and be able to write Karambas using Python, Ruby and JavaScript||The SuperKaramba Team}}&lt;br /&gt;
{{FeatureDone|SuperKaramba|Integrate into Plasma||The SuperKaramba Team}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevelop =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevplatform =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdewebdev =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Kommander|Port the executor to KDE4.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureTodo|Kommander|Create Qt Designer plugins for the editor.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Create an upload plugin.| niko.sams@gmail.com|Niko Sams}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Create a new, state machine based parser.| amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Port existing functionality to KDevPlatform plugins. Only text mode is targeted.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|KXslDbg|Port to KDE4.|keith@kdewebdev.org  | &lt;br /&gt;
Keith Isdale}}&lt;br /&gt;
{{FeatureTodo|KLinkStatus|Aided correction of broken links||}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Site check automation|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureInProgress|KLinkStatus|D-Bus/Scripting interfaces|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureInProgress|KLinkStatus|HTML validation|thesquib@gmail.com|Sam Ryan}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Ability to export only broken links|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Ability to do background search which only update the GUI when finished (much faster))|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Tray Icon and KUniqueApplication|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Scripting Plugin|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Get Hot New Stuff for HTML result stylesheets|Paulo Moura Guedes}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.2_Feature_Plan</id>
		<title>Schedules/KDE4/4.2 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.2_Feature_Plan"/>
				<updated>2008-05-04T15:45:19Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Add kdegames and kscoremanager entry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features for the 4.2 release.&lt;br /&gt;
&lt;br /&gt;
Legend:&lt;br /&gt;
* todo =&amp;gt; not started yet&lt;br /&gt;
* in-progress =&amp;gt; started, but not completed yet&lt;br /&gt;
* done =&amp;gt; completed&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepimlibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeutils =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|Power Manager|import either Guidance Power Manager or move kde4powersaver into kdeutils|?|?}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|libkdegames|New highscore management system|milliams|Matt Williams}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Games/Highscores</id>
		<title>Development/Tutorials/Games/Highscores</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Games/Highscores"/>
				<updated>2008-05-03T21:07:21Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: No longer encessary. FindLibKDEGames.cmake is fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KDE Games|&lt;br /&gt;
&lt;br /&gt;
name=High Scores|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Programming_Tutorial_KDE_4|Introduction to KDE4 programming]], [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction Tutorial]]|&lt;br /&gt;
&lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KScoreDialog}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will explain how to use the high score system built into kdegames in your application.&lt;br /&gt;
&lt;br /&gt;
[[image:Highscore.png|center|thumb|Dialog in KMines]]&lt;br /&gt;
&lt;br /&gt;
==KScoreDialog==&lt;br /&gt;
The high score system is provided through the KScoreDialog class. It is intended to be a lightweight solution and offers the following abilities:&lt;br /&gt;
#Grouping of scores (for different difficulty levels etc.)&lt;br /&gt;
#Standard fields: Name, Level, Date, Time, Score&lt;br /&gt;
#Custom fields (e.g. number of moves)&lt;br /&gt;
&lt;br /&gt;
==Displaying Scores==&lt;br /&gt;
To display the high score table, it's as simple as two lines of code. &lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void showHighscores()&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will display the highscore table showing, by default, the 'Name' and 'Score' columns.&lt;br /&gt;
&lt;br /&gt;
In order to comply with the kdegames standards, you should use a {{class|KStandardGameAction}} to launch this function. This will set up the icons and toolbars correctly. See the [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction tutorial]] for more information on this.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardGameAction&amp;gt;&lt;br /&gt;
void setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KStandardGameAction::highscores(this, &lt;br /&gt;
                       SLOT(showHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adding Scores==&lt;br /&gt;
===Simplest way to add a score===&lt;br /&gt;
The simplest way to add a new score to the table is as follows:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will add the score &amp;lt;tt&amp;gt;playersScore&amp;lt;/tt&amp;gt; to the high score table and then launch the dialog. If it is the first score to be entered on the table, a blank line-edit will be provided for the player to enter their name, otherwise the line-edit will still be provided but the player's name will be automatically filled in.&lt;br /&gt;
&lt;br /&gt;
However, you will notice that the dialog is shown every time, even if the player didn't manage to get onto the table. If you only want to show the table if the player achieved a high score, place an &amp;lt;tt&amp;gt;if()&amp;lt;/tt&amp;gt; command around the &amp;lt;tt&amp;gt;KScoreDialog::addScore()&amp;lt;/tt&amp;gt; call:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
if(ksdialog.addScore(playersScore))&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Passing name by code===&lt;br /&gt;
If you want to suggest a name programatically you can do so by using the &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; type. It's easy to use, for example:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in this same way you can display other default fields by passing them to the &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; constructor and adding the information to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt;. For example, to display the level the player got to:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int level)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name |&lt;br /&gt;
                        KScoreDialog::Level, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  scoreInfo[KScoreDialog::Level].setNum(level);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Custom fields===&lt;br /&gt;
Since there are only a set number of standatd fields it is possible to add you own custom fields. For example you may want to put the number of moves the player made on the table. This is done through the &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int numMoves)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = &amp;quot;Matt&amp;quot;;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(playersScore);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addField(KScoreDialog::Custom1, &lt;br /&gt;
                    i18n(&amp;quot;Num of Moves&amp;quot;), &amp;quot;moves&amp;quot;);&lt;br /&gt;
  scoreInfo[KScoreDialog::Custom1].setNum(numMoves);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument to &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; must be from &amp;lt;tt&amp;gt;KScoreDialog::Custom1&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;KScoreDialog::Custom5&amp;lt;/tt&amp;gt;, the second is the text that will appear on the high score table at the head of the column (and must therefore be i18n'd) and the last argument is a unique identifier for the field. After that, it is added to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; in the same way as before.&lt;br /&gt;
&lt;br /&gt;
==Grouping Scores==&lt;br /&gt;
Your game may have different levels of difficulty and so you don't want to put the scores for the 'Hard' level on the same table as the 'Easy' table. Grouping scores is easy to achieve using the &amp;lt;tt&amp;gt;KScoreDialog::setConfigGroup()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.setConfigGroup(I18N_NOOP(&amp;quot;Easy&amp;quot;));&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Each group will show up as a tab on the high score table dialog. If you don't specify a group, the score will be added to the generic 'High Score' tab.&lt;br /&gt;
&lt;br /&gt;
A very important point to remember is to pass the untranslated group name through &amp;lt;tt&amp;gt;I18N_NOOP()&amp;lt;/tt&amp;gt; otherwise the group name will not be translated properly and will cause bugs.&lt;br /&gt;
&lt;br /&gt;
==Advanced Features==&lt;br /&gt;
===Hiding Fields===&lt;br /&gt;
In some special cases you won't want to display a score as such but rather just the time the player took to complete the level.&lt;br /&gt;
&lt;br /&gt;
While you're not going to display the 'Score' field in your table you must always submit a value to 'Score' field since it is used for sorting the scores. In fact, the 'Score' field is always present in a &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; object even if you didn't pass it to the constructor. However, ity is possible to hide the 'Score' field (and in fact any field) from display using the &amp;lt;tt&amp;gt;KScoreDialog::hideField()&amp;lt;/tt&amp;gt; function. It takes a Field flag from the same set that the constructor takes.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// timeString is a nicely formatted string&lt;br /&gt;
// e.g. &amp;quot;1:24&amp;quot; used for display&lt;br /&gt;
void newHighscore(const QString&amp;amp; timeString, int seconds)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name | &lt;br /&gt;
                        KScoreDialog::Time, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Time] = timeString;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(seconds);&lt;br /&gt;
  ksdialog.hideField(KScoreDialog::Score);&lt;br /&gt;
  ksdialog.addScore(scoreInfo, KScoreDialog::LessIsMore)&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Games/KStandardGameAction</id>
		<title>Development/Tutorials/Games/KStandardGameAction</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Games/KStandardGameAction"/>
				<updated>2008-05-03T21:06:17Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: No longer encessary. FindLibKDEGames.cmake is fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KDE Games|&lt;br /&gt;
&lt;br /&gt;
name=KStandardGameAction|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Programming_Tutorial_KDE_4|Introduction to KDE4 programming]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Games/Highscores|High Scores Tutorial]]|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reading={{class|KStandardGameAction}}, {{class|KStandardAction}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will explain the usage of &amp;lt;tt&amp;gt;KStandardGameAction&amp;lt;/tt&amp;gt;s in libkdegames.&lt;br /&gt;
&lt;br /&gt;
== KStandardGameAction ==&lt;br /&gt;
This class is an extension to the usual &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; class which provides easy access to often used KDE actions.&lt;br /&gt;
&lt;br /&gt;
Using these actions helps maintaining consistency among the games.&lt;br /&gt;
&lt;br /&gt;
Games often use different menu entries than other programs, e.g. games use&lt;br /&gt;
the menu &amp;quot;game&amp;quot; instead of &amp;quot;file&amp;quot;. This class provides the entries which&lt;br /&gt;
differ from the usual KStandardAction entries.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Add some code like this to your action setup code.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardGameAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setupActions()&lt;br /&gt;
{&lt;br /&gt;
  // Game&lt;br /&gt;
  KStandardGameAction::gameNew(this, &lt;br /&gt;
                       SLOT(newGame()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::highscores(this, &lt;br /&gt;
                       SLOT(showHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::quit(this, &lt;br /&gt;
                       SLOT(close()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
&lt;br /&gt;
  // Move&lt;br /&gt;
  KStandardGameAction::undo(this, &lt;br /&gt;
                       SLOT(undoMove()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::redo(this, &lt;br /&gt;
                       SLOT(redoMove()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
&lt;br /&gt;
  // Settings&lt;br /&gt;
  KStandardGameAction::configureHighscores(this, &lt;br /&gt;
                       SLOT(configureHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KConfig</id>
		<title>Development/Tutorials/KConfig</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KConfig"/>
				<updated>2008-05-03T15:16:05Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Add 'further reading' link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KConfig}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KConfig|&lt;br /&gt;
&lt;br /&gt;
name=Introduction to KConfig|&lt;br /&gt;
&lt;br /&gt;
next=[[../Using_KConfig_XT|Using KConfig XT]]|&lt;br /&gt;
&lt;br /&gt;
reading={{Class|KConfig}} apidocs&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
This tutorial looks at the KDE configuration data system, starting with an overview of the design fundamentals from an application developer's point of view. It then looks at the classes relevant to application development one by one before moving on to kiosk (user and group profiles) integration.&lt;br /&gt;
&lt;br /&gt;
== Design Essentials ==&lt;br /&gt;
&lt;br /&gt;
KConfig is designed to abstract away the concept of actual storage and retrieval of configuration settings behind an API that allows easy fetching and setting of information. Where and in what format the data is stored is not relevant to an application using KConfig. This keeps all KDE applications consistent in their handling of configurations while alleviating each and every application author to build such a system on their own from scratch, which can be a highly error prone exercise.&lt;br /&gt;
&lt;br /&gt;
A KConfig object represents a single configuration object. Each configuration object is referenced by its unique name and may be actually read from multiple local or remote files or services. Each application has a default configuration object associated with it and there is also a global configuration object.&lt;br /&gt;
&lt;br /&gt;
These configuration objects are broken down into a two level hierarchy: groups and keys. A configuration object can have any number of groups and each group can have one or more keys with associated values.&lt;br /&gt;
&lt;br /&gt;
Values stored may be of any number of data types. They are stored and retreived as the objects themselves. For example, a {{qt|QObject}} object is passed to a config object directly when storing a color value and when retreived a {{qt|QObject}} object is returned. Applications themselves therefore generally do not have to perform serialization and deserialization of objects themselves.&lt;br /&gt;
&lt;br /&gt;
== The KConfig Class ==&lt;br /&gt;
&lt;br /&gt;
The {{class|KConfig}} object is used to access a given configuration object. There are a number of ways to create a config object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
// a plain old read/write config object&lt;br /&gt;
KConfig config(&amp;quot;myapprc&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// a specific file in the filesystem&lt;br /&gt;
// currently must be an INI style file&lt;br /&gt;
KConfig fullPath(&amp;quot;/etc/kderc&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// not merged with global values&lt;br /&gt;
KConfig globalFree( &amp;quot;localsrc&amp;quot;, KConfig::NoGlobals );&lt;br /&gt;
&lt;br /&gt;
// not merged with globals or the $KDEDIRS hierarchy&lt;br /&gt;
KConfig simpleConfig( &amp;quot;simplerc&amp;quot;, KConfig::SimpleConfig );&lt;br /&gt;
&lt;br /&gt;
// config specific to a component, in this case a plugin&lt;br /&gt;
KConfig pluginConfig( componentData(), &amp;quot;pluginrc&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
// outside the standard config resource&lt;br /&gt;
KConfig dataResource( &amp;quot;data&amp;quot;, &amp;quot;myapp/somefile&amp;quot; );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The KConfig object create on line 2 is a regular config object. We can read values from it, write new entries and ask for various properties of the object.  This object will be loaded from the config resource as determined by {{class|KStandardDirs}}, meaning that every instance of the &amp;lt;tt&amp;gt;myapprc&amp;lt;/tt&amp;gt; object in each of the directories in the config resource hierarchy will be merged to create the values seen in this object. This is how system wide and per-user/group profiles are generated and supported and it all happens transparently to the application itself.&lt;br /&gt;
&lt;br /&gt;
{{tip|For more information on how the merging works, see the [[KDE System Administration/KDE_Filesystem_Hierarchy|KDE Filesystem Hierarchy]] article.}}&lt;br /&gt;
&lt;br /&gt;
On line 6 we open a specific local file, this case {{path|/etc/kderc}}. This performs no merging of values and expects an INI style file.&lt;br /&gt;
&lt;br /&gt;
Line 9 sees the creation of a configuration object that is not merged with the global &amp;lt;tt&amp;gt;kdeglobals&amp;lt;/tt&amp;gt; configuration object, while the configuration file on line 12 is additionally not merged with any files in the &amp;lt;tt&amp;gt;$KDEDIRS&amp;lt;/tt&amp;gt; hierarchy. This can noticeably improve performance in the case where one is simply reading values out of a simple configuration for which global values are not meaningful.&lt;br /&gt;
&lt;br /&gt;
Line 15 creates a configuration object using the {{class|KComponentData}} object that belongs to a plugin or other component. The plugin may have a different set of directories defined in its {{class|KStandardDirs}} and this is a way of ensuring that {{class|KConfig}} respects this.&lt;br /&gt;
&lt;br /&gt;
Finally on line 18 we see the creation of a configuration object that does not exist in the &amp;lt;tt&amp;gt;config&amp;lt;/tt&amp;gt; resource but rather in the application &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; resource. You may use any resource that {{class|KStandardDirs}} is aware of, including ones that are added at runtime.&lt;br /&gt;
&lt;br /&gt;
=== Special Configuration Objects ===&lt;br /&gt;
&lt;br /&gt;
Each application has its own configuration object that uses the name provided to {{class|KAboutData}} appended with &amp;quot;rc&amp;quot; as its name. So an app named &amp;quot;myapp&amp;quot; would have the default configuration object of &amp;quot;myapprc&amp;quot;. This configuration file can be retrieved in this way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KComponentData&amp;gt;&lt;br /&gt;
#include &amp;lt;KConfig&amp;gt;&lt;br /&gt;
#include &amp;lt;KGlobal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MyClass::MyClass()&lt;br /&gt;
{&lt;br /&gt;
    // note that this is actually a KSharedConfig&lt;br /&gt;
    // more on that class in a bit!&lt;br /&gt;
    KConfig* config = KGlobal::config();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default configuration object for the application is accessed when no name is specified when creating a {{class|KConfig}} object. So we could also do this instead:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KConfig&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MyClass::MyClass()&lt;br /&gt;
{&lt;br /&gt;
    KConfig config;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, each component may have its own configuration object. This is generally accessed via the plugin's &amp;lt;tt&amp;gt;componentData()&amp;lt;/tt&amp;gt; rather than &amp;lt;tt&amp;gt;{{class|KGlobal}}::mainComponent()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Finally there is a global configuration object, &amp;lt;tt&amp;gt;kdeglobals&amp;lt;/tt&amp;gt;, that is shared by every application. It holds such information as the default application shortcuts for various actions. It is &amp;quot;blended&amp;quot; into the configuration object if the &amp;lt;tt&amp;gt;KConfig::IncludeGlobals&amp;lt;/tt&amp;gt; flag is passed to the {{class|KConfig}} constructor, which is the default.&lt;br /&gt;
&lt;br /&gt;
=== Commonly Useful Methods ===&lt;br /&gt;
&lt;br /&gt;
To save the current state of the configuration object we call the &amp;lt;tt&amp;gt;sync()&amp;lt;/tt&amp;gt; method. This method is also called when the object is destroyed. If no changes have been made or the resource reports itself as non-writable (such as in the case of the user not having write permissions to the file) then no disk activity occurs. &amp;lt;tt&amp;gt;sync()&amp;lt;/tt&amp;gt; merges changes performed concurrently by other processes - local changes have priority, though.&lt;br /&gt;
&lt;br /&gt;
If we want to make sure that we have the latest values from disk we can call &amp;lt;tt&amp;gt;reparseConfiguration()&amp;lt;/tt&amp;gt; which calls &amp;lt;tt&amp;gt;sync()&amp;lt;/tt&amp;gt; and then reloads the data from disk.&lt;br /&gt;
&lt;br /&gt;
If we need to prevent the config object from saving already made modifications to disk we need to call &amp;lt;tt&amp;gt;markAsClean()&amp;lt;/tt&amp;gt;. A particular use case for this is rolling back the configuration to the on-disk state by calling &amp;lt;tt&amp;gt;markAsClean()&amp;lt;/tt&amp;gt; followed by &amp;lt;tt&amp;gt;reparseConfiguration()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Listing all groups in a configuration object is as simple as calling &amp;lt;tt&amp;gt;groupList()&amp;lt;/tt&amp;gt; as in this code snippet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
KConfig* config = KGlobal::mainComponent().config();&lt;br /&gt;
&lt;br /&gt;
foreach ( const QString&amp;amp; group, config.groupList() ) {&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; &amp;quot;next group:&amp;quot; &amp;lt;&amp;lt; group;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== KSharedConfig ==&lt;br /&gt;
&lt;br /&gt;
The {{class|KSharedConfig}} class is a reference counted version of {{class|KConfig}}. It thus provides a way to reference the same configuration object from multiple places in your application without the extra overhead of separate objects or concerns about syncronizing writes to disk even if the configuration object is updated from multiple code paths. &lt;br /&gt;
&lt;br /&gt;
Accessing a {{class|KSharedConfig}} object is as easy as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
KSharedConfigPtr config = KSharedConfig::openConfig();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;openConfig()&amp;lt;/tt&amp;gt; take the same parameters as {{class|KConfig}}'s constructors do, allowing one to define which configuration file to open, flags to control merging and non-&amp;lt;tt&amp;gt;config&amp;lt;/tt&amp;gt; resources.&lt;br /&gt;
&lt;br /&gt;
{{class|KSharedConfig}} is generally recommended over using {{class|KConfig}} itself, and the object returned from {{class|KComponentData}} is indeed a {{class|KSharedConfig}} object.&lt;br /&gt;
&lt;br /&gt;
== KConfigGroup ==&lt;br /&gt;
&lt;br /&gt;
Now that we have a configuration object, the next step is to actually use it. The first thing we must do is to define which group of key/value pairs we wish to access in the object. We do this by creating a KConfigGroup object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
KConfig config;&lt;br /&gt;
KConfigGroup generalGroup( &amp;amp;config, &amp;quot;General&amp;quot; );&lt;br /&gt;
KConfigGroup colorsGroup = config.group( &amp;quot;Colors&amp;quot; ); // ... or a bit differently ...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can pass {{class|KConfig}} or {{class|KSharedConfig}} objects to {{class|KConfigGroup}}.&lt;br /&gt;
&lt;br /&gt;
Config groups can be nested as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
KConfigGroup subGroup1( &amp;amp;generalGroup, &amp;quot;LessGeneral&amp;quot; );&lt;br /&gt;
KConfigGroup subGroup2 = colorsGroup.group( &amp;quot;Dialogs&amp;quot; );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reading Entries ==&lt;br /&gt;
&lt;br /&gt;
With a {{class|KConfigGroup}} object in hand reading entries is now quite straight forward:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
QString accountName = generalGroup.readEntry( &amp;quot;Account&amp;quot;,&lt;br /&gt;
                                              QString() );&lt;br /&gt;
QColor color = colorsGroup.readEntry( &amp;quot;background&amp;quot;,&lt;br /&gt;
                                      Qt::white );&lt;br /&gt;
QStringList list = generalGroup.readEntry( &amp;quot;List&amp;quot;,&lt;br /&gt;
                                           QStringList() );&lt;br /&gt;
QString path = generalGroup.readPathEntry( &amp;quot;SaveTo&amp;quot;,&lt;br /&gt;
                                           defaultPath );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As can be seen from the above, you can mix reads from different {{class|KConfigGroup}} objects created on the same {{class|KConfig}} object. The read methods take the key, which is case sensitive, as the first argument and the default value as the second argument. This argument controls what kind of data, e.g. a color in line 3 above, is to be expected as well as the type of object returned. The returned object is wrapped in a {{qt|QVariant}} to make this magic happen.&lt;br /&gt;
&lt;br /&gt;
There are a couple of special read methods, including &amp;lt;tt&amp;gt;readPathEntry&amp;lt;/tt&amp;gt; which returns a file system path. It is vital that one uses &amp;lt;tt&amp;gt;readPathEntry&amp;lt;/tt&amp;gt; if it is a path as this enables such features as roaming profiles to work properly.&lt;br /&gt;
&lt;br /&gt;
If no such key currently exists in the configuration object, the default value is returned instead. If there is a localized (e.g. translated into another language) entry for the key that matches the current locale, that is returned.&lt;br /&gt;
&lt;br /&gt;
== Writing Entries ==&lt;br /&gt;
&lt;br /&gt;
Setting new values is similarly straightforward:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
generalGroup.writeEntry( &amp;quot;Account&amp;quot;, accountName );&lt;br /&gt;
generalGroup.writePathEntry( &amp;quot;SaveTo&amp;quot;, savePath );&lt;br /&gt;
colorGroup.writeEntry( &amp;quot;background&amp;quot;, color );&lt;br /&gt;
generalGroup.config()-&amp;gt;sync();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the use of &amp;lt;tt&amp;gt;writePathEntry&amp;lt;/tt&amp;gt; and how the type of object we use, such as {{qt|QColor}} on line 3, dictates how the data is serialized. Additionally, once we are done writing entries, &amp;lt;tt&amp;gt;sync()&amp;lt;/tt&amp;gt; must be called on the config object for it to be saved to disk. We can also simply wait for the object to be destroyed, which triggers an automatic &amp;lt;tt&amp;gt;sync()&amp;lt;/tt&amp;gt; if necessary.&lt;br /&gt;
&lt;br /&gt;
== KDesktopFile: A Special Case ==&lt;br /&gt;
&lt;br /&gt;
When is a configuration file not a configuration file? When it is a [http://freedesktop.org/wiki/Standards_2fdesktop_2dentry_2dspec desktop file]. These files, which are essentially configuration files at their heart, are used  to describe entries for application menus, mimetypes, plugins and various services.&lt;br /&gt;
&lt;br /&gt;
When accessing a .desktop file, one should instead use the {{class|KDesktopFile}} class which, while a {{class|KConfig}} class offering all the capabilities described above, offers a set of methods designed to make accessing standard attributes of these files consistent and reliable.&lt;br /&gt;
&lt;br /&gt;
== Kiosk: Lockdown and User/Group Profiles ==&lt;br /&gt;
&lt;br /&gt;
KConfig provides a powerful set of lockdown and configuration definition capabilities, collectively known as &amp;quot;Kiosk&amp;quot;, that many system administrators and system integrators rely on. While most of this framework is provided transparently to the application, there is occassion when an application will want to check on the read/write status of a configuration object.&lt;br /&gt;
&lt;br /&gt;
Entries in configuration objects that are locked down using the kiosk facilities are said to be ''immutable''. An application can check for immutability of entire configuration objects, groups or keys as shown in this example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
KConfig* config = KGlobal::config();&lt;br /&gt;
&lt;br /&gt;
if ( config-&amp;gt;isImmutable() ) {&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; &amp;quot;configuration object is immutable&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
KConfigGroup group(config, &amp;quot;General&amp;quot;);&lt;br /&gt;
if ( group.isImmutable() ) {&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; &amp;quot;group General is immutable&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( group.entryIsImmutable(&amp;quot;URL&amp;quot;) ) {&lt;br /&gt;
    kDebug() &amp;lt;&amp;lt; &amp;quot;URL entry in group General is immutable&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be useful in particular situations where an action should be taken when an item is immutable. For instance, the KDE panels will not offer configuration options to the user or allow them to otherwise change the order of applets and icons when the panel's configuration object is marked as immutable.&lt;br /&gt;
&lt;br /&gt;
== KConfig XT ==&lt;br /&gt;
&lt;br /&gt;
There is a way to make certain use cases of KConfig easier, faster and more reliable: KConfig XT. In particular, for main application or plugin configuration objects and when syncing configuration dialogs and other interfaces with these values, KConfig XT can help immensely. It also  simultaneously documents the configuration options available, which makes every sys admin and system integrator that uses KDE that much more happy.&lt;br /&gt;
&lt;br /&gt;
[[../Using_KConfig_XT|The next tutorial in the KConfig series covers what KConfig XT is and how to use it.]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:Dukat</id>
		<title>User talk:Dukat</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:Dukat"/>
				<updated>2008-05-03T14:30:32Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Your page [[Standard Shortcuts]] doesn't belong here (see [[Help:Wiki Structure]]). Techbase is for technical documentation and tutorials, not for random discussion. This is best carried out on the kde-core-devel@kde.org mailing list or placed on the [http://wiki.kde.org kde wiki]. I'll probably be back to delete the page at some point. --[[User:Milliams|milliams]] 17:49, 2 May 2008 (CEST)&lt;br /&gt;
:Okay, I've moved the page to [[Projects/Usability/HIG Questions/Standard Shortcuts]] since that fits in with our scheme of using subdirectories. Feel free to continue to edit it there and add other pages in the same manner if you need. --[[User:Milliams|milliams]] 16:30, 3 May 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG_Questions</id>
		<title>Projects/Usability/HIG Questions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG_Questions"/>
				<updated>2008-05-03T14:28:22Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* KDE4 HIG Questions and Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= KDE4 HIG Questions and Requests =&lt;br /&gt;
&lt;br /&gt;
Developer, please use this page to add questions and requests about the KDE4 Human Interface Guidelines (HIG)&lt;br /&gt;
&lt;br /&gt;
* Please list questions about the KDE4 HIG here&lt;br /&gt;
* Also include your name/IRC nick/email if you want to be contacted for follow up questions&lt;br /&gt;
* Be as specific as possible and include a screenshot if applicable. [http://lists.kde.org/?l=kde-usability&amp;amp;m=120955187622753&amp;amp;w=2 This email on the kde-usability mailing list] is a '''good''' example of a HIG question/request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Which buttons have icons and when should we use/not use icons on buttons?&lt;br /&gt;
* The growth policy: are widgets supposed to grow and take all the available (horizontal) space, even in case of widgets that don't have a size policy for expanding?&lt;br /&gt;
* Should the horizontal alignment of the layout be left- or center-? (eg: [http://img186.imageshack.us/img186/33/formlayoutalignxv0.png sample screenshot])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Some musing about [[Projects/Usability/HIG_Questions/Standard_Shortcuts | Standard Shortcuts]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Usability/HIG_Questions/Standard_Shortcuts</id>
		<title>Projects/Usability/HIG Questions/Standard Shortcuts</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Usability/HIG_Questions/Standard_Shortcuts"/>
				<updated>2008-05-03T14:26:52Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Standard Shortcuts moved to Projects/Usability/HIG Questions/Standard Shortcuts: We use subdirectories in techbase.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I believe the [http://wiki.openusability.org/guidelines/index.php/Appendices:Keyboard_Shortcuts KDE Standard Shortcuts ] are by far from perfect and have several consistency problems. A lot of these problems mostly due to be legacy problems.&lt;br /&gt;
&lt;br /&gt;
I'll list here some thought to start a discussion - I haven't thought it out completely by myself.&lt;br /&gt;
&lt;br /&gt;
The bisggest problem I see is the inconsitent usage of the modifier keys - there's no clear vision here&lt;br /&gt;
&lt;br /&gt;
* Nearly all modern keyboards have four modifier keys (SHIFT, CTRL, ALT, SYSTEM (SYSTEM is not defined: Win key on PC, Apple Key on Mac, Meta key on other) - so let's start use it!&lt;br /&gt;
&lt;br /&gt;
* Currently (aka KDE 3), do modifiers have a clear context meaning? By far not! Currently it looks something like this&lt;br /&gt;
** SHIFT changes case in Input fields (good) modifies some other modifier keys, to change its meaning like Save / Save As -&amp;gt; CTRL-S / SHIFT-CTRL-S, (good), but can be also used as a general shortcut key without any relation (New Text Document in Krusader -&amp;gt; SHIFT-F4) (bad)&lt;br /&gt;
** CTRL is supposed to be the standard shortcut key within applications, like CTRL-P, CTRL-S, etc - this is done quite well most of the time in KDE (good), however, a lot of System shortcuts (i.e. shortcuts with global scope) are also used with CTRL, like CTRL-Fx for Desktop Switching. Even better, some other are used in combination with ALT, like CTRL-ALT-left, again for Desktop switching.&lt;br /&gt;
** ALT is what? I seems to be used as the unversal do-all... Initially, its usage was to define Mouse-less control, so ALT-F would open the file menu. However, ALT is now used as general application shortcuts (Kruader Disk Usage -&amp;gt; ALT-D), Global navigation (ALT-TAB for application switching, yes I know this is legacy, or ALF-F1 for the main menu), ...&lt;br /&gt;
** SYSTEM is largely unused, and if used, sometimes in more than strage locations (sorry about the Krusader reference, but I use it that often -&amp;gt; List sort by name - WIN+1 ????????), maybe also a lot in Global Shortcuts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So, I propose a consistent scheme, something like this&lt;br /&gt;
&lt;br /&gt;
* Use the System key! If there are still (some older) keyboards that don't have it, it can normally easily be mapped to another key (maybe to CAPS-LOCK, which is useless anyway). Or have an Escape key, somethig like CTRL-ALT-ESC = Win. But use this key (and consistently)&lt;br /&gt;
* SHIFT is only used to change another modifier, and not a shortcut modifier by itself&lt;br /&gt;
* The System key is used for global scope only (That's why it's called system key)!, So switch between applications-&amp;gt; SYS-TAB. Change Desktop: SYS+Fx, or SYS-left. Task Menu -&amp;gt; SYS-ESC. Something in this direction.&lt;br /&gt;
* SYS-CTRL combinations are for Global Shortcuts only.  So, e.g. SYS-CTRL-V could be the Klipper clipboard menu, or used for quicklaunching applications (SYS-CTRL-C to lauch a Console)&lt;br /&gt;
* CTRL is used solely for application shortcuts. No Global Shortcuts. maybe, CTRL-ALT would be ok, to have more options.&lt;br /&gt;
* ALT is solely used for keyboard navigation. No dedicated shortcuts start with ALT.&lt;br /&gt;
* What about F-keys. Have to think about&lt;br /&gt;
&lt;br /&gt;
With this, it would be immediately clear, that when I press a CTRL or ALT key, the effect would only be for the current application, while the SYS key is to control the whole user environment.&lt;br /&gt;
&lt;br /&gt;
This is just a starting point, there might be inconsistencies. Feel free to add your comments.&lt;br /&gt;
&lt;br /&gt;
(TechBase user: dukat, mailto:gul@gmx.li)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Standard_Shortcuts</id>
		<title>Standard Shortcuts</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Standard_Shortcuts"/>
				<updated>2008-05-03T14:26:52Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Standard Shortcuts moved to Projects/Usability/HIG Questions/Standard Shortcuts: We use subdirectories in techbase.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Projects/Usability/HIG Questions/Standard Shortcuts]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:Dukat</id>
		<title>User talk:Dukat</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:Dukat"/>
				<updated>2008-05-02T15:49:12Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: New page: Your page Standard Shortcuts doesn't belong here (see Help:Wiki Structure). Techbase is for technical documentation and tutorials, not for random discussion. This is best carried o...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Your page [[Standard Shortcuts]] doesn't belong here (see [[Help:Wiki Structure]]). Techbase is for technical documentation and tutorials, not for random discussion. This is best carried out on the kde-core-devel@kde.org mailing list or placed on the [http://wiki.kde.org kde wiki]. I'll probably be back to delete the page at some point. --[[User:Milliams|milliams]] 17:49, 2 May 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Release_Team</id>
		<title>Projects/Release Team</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Release_Team"/>
				<updated>2008-04-30T21:14:08Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Coordinator List */ I'm now the kdegames release coordinator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The KDE Release Team Project Page =&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
The purpose of the KDE Release Team is to define and execute the official software releases of KDE.&lt;br /&gt;
&lt;br /&gt;
The Release Team is responsible for setting release schedules for the official KDE releases. This includes release dates, deadlines for individual release steps and restrictions for code changes.&lt;br /&gt;
&lt;br /&gt;
The Release Team coordinates release dates with the marketing and press efforts of KDE.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
The Release Team is composed of Module Coordinators, Marketing Team liaison (sebas), and the people who actually do the work of tagging and creating the releases (dirk).&lt;br /&gt;
&lt;br /&gt;
As is our tradition, decision making is an open and public process and we welcome input from all concerned parties, including our partners, the packagers, and the distros.&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
Please contact the Release Team by [mailto:release-team@kde.org email] or join our public [https://mail.kde.org/mailman/listinfo/release-team mailing list].&lt;br /&gt;
&lt;br /&gt;
== Current Activities ==&lt;br /&gt;
&lt;br /&gt;
* The 4.0 branch is in bugfixing mode, preparing for 4.0.4 to be tagged by the end of April 2008. Bugfix / translation updates are being shipped on a monthly schedule.&lt;br /&gt;
* Trunk is open for new features, new strings, bugfixing, and new artwork in preparation for 4.1.0 expected in Jul-Aug 2008&lt;br /&gt;
&lt;br /&gt;
== Module Coordinators ==&lt;br /&gt;
=== Functions ===&lt;br /&gt;
Module coordinators perform the following duties:&lt;br /&gt;
* primary point of contact for the Release Team concerning issues with the module&lt;br /&gt;
* help determine release schedules&lt;br /&gt;
* communicate release schedules with the module developers&lt;br /&gt;
* provide feedback from developers to the Release Team&lt;br /&gt;
* review new applications for inclusion in the module&lt;br /&gt;
* review old, unmaintained applications for removal from the modules and help find new maintainers&lt;br /&gt;
* review external dependencies for the module&lt;br /&gt;
* help set and review goals for major and feature releases&lt;br /&gt;
* help with release preparation (eg. update application version numbers)&lt;br /&gt;
&lt;br /&gt;
=== Coordinator List ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Module !! Description !! Release&amp;amp;nbsp;Coordinator&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdelibs kdelibs] || KDE foundational libraries || help wanted&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdepimlibs kdepimlibs] || KDE personal information libraries || [mailto:winter@kde.org Allen Winter]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdebase/runtime kdebase-runtime] ||Applications required by KDE apps to function properly at runtime, such as a help browser, framework (e.g. phonon, solid) backends, and certain configuration modules || [mailto:ogoffart@kde.org Olivier Goffart]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdebase/workspace kdebase-workspace] || the UNIX/Linux desktop shell || help wanted&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdebase/apps kdebase-apps] || Essential apps needed to complement a desktop shell for basic functionality (web browser, file manager, ...) || help wanted&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdeaccessibility kdeaccessibility] || Accessibility applications || [mailto:gunnar@schmi-dt.de Gunnar Schmi Dt]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdeartwork kdeartwork] || Additional icons, styles, etc. || help wanted&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdeadmin kdeadmin] || Tools for system administration || [mailto:nicolas.ternisien@gmail.com Nicolas Ternisien]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdeedu kdeedu] || Applications with educational content ||[mailto:annma@kde.org Anne-Marie Mahfouf]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdegames kdegames] || Entertainment || [mailto:matt@milliams.com Matt Williams]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdegraphics kdegraphics] || Graphics viewing and editing || [mailto:aseigo@kde.org Aaron Seigo]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdemultimedia kdemultimedia] || Audio and video applications || [mailto:kretz@kde.org Matthias Kretz]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdenetwork kdenetwork] || Network-centric apps (IM, remote desktop, etc) || [mailto:uwolfer@kde.org Urs Wolfer]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdepim kdepim] || Groupware || [mailto:winter@kde.org Allen Winter]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/kdereview kdereview] || Staging area || [mailto:tomalbers@kde.nl Tom Albers]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdesdk kdesdk] || Tools for software development || [mailto:mattr@kde.org Matt Rogers]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdetoys kdetoys] || Fun distractions || [mailto:kde@hilefoks.org Stefan Böhmann]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdeutils kdeutils] || Miscellaneous utilities || [mailto:kossebau@kde.org Friedrich W. H. Kossebau]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdevplatform kdevplatform] || KDE Development Applications Platform libraries || [mailto:mattr@kde.org Matt Rogers]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdevelop kdevelop] || IDE || [mailto:mattr@kde.org Matt Rogers]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/KDE/kdewebdev kdewebdev] || Web development tool suite || [mailto:amantia@kde.org Andras Mantia]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/extragear extragear] || Extragear || [mailto:helio@kde.org Helio Chissini de Castro]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/l10n-kde4 l10n-kde4] || Localization || [mailto:aacid@kde.org Albert Astals Cid]&lt;br /&gt;
|- valign=top&lt;br /&gt;
| [http://websvn.kde.org/trunk/koffice koffice] || KOffice || [mailto:boud@valdyas.org Boudewijn Rempt]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2008-04-29T12:32:14Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* The Game Categories */ Cleanup unnecessary links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Board Games|Board Games]]&lt;br /&gt;
*[[/Card Games|Card games]]&lt;br /&gt;
*[[Dice Games]]&lt;br /&gt;
*[[Logic Games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
*[[Toys]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : April 30th/2008 20:00 UTC]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Category:KDEGames</id>
		<title>Category:KDEGames</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Category:KDEGames"/>
				<updated>2008-04-28T20:47:22Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: New page: Pages relating to the kdegames module&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pages relating to the kdegames module&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2008-04-28T20:45:45Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Board Games|Board Games]]&lt;br /&gt;
*[[/Card Games|Card games]]&lt;br /&gt;
*[[Dice Games]]&lt;br /&gt;
*[[Logic Games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
*[[Toys]]&lt;br /&gt;
&lt;br /&gt;
===See also===&lt;br /&gt;
* [http://doc.trolltech.com/4.2/qsvgrenderer.html QSvgRenderer Class Reference]&lt;br /&gt;
* [http://developer.kde.org/documentation/library/cvs-api/kdelibs-apidocs/kdecore/html/classKSvgRenderer.html KSvgRenderer Class Reference]&lt;br /&gt;
* [http://websvn.kde.org/trunk/KDE/kdegames/katomic/ KAtomic KDE4 code in websvn]&lt;br /&gt;
* [[Schedules/KDE4/4.0 Release Schedule]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : April 30th/2008 20:00 UTC]]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Games/KStandardGameAction</id>
		<title>Development/Tutorials/Games/KStandardGameAction</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Games/KStandardGameAction"/>
				<updated>2008-04-28T20:45:32Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KDE Games|&lt;br /&gt;
&lt;br /&gt;
name=KStandardGameAction|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Programming_Tutorial_KDE_4|Introduction to KDE4 programming]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Games/Highscores|High Scores Tutorial]]|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reading={{class|KStandardGameAction}}, {{class|KStandardAction}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will explain the usage of &amp;lt;tt&amp;gt;KStandardGameAction&amp;lt;/tt&amp;gt;s in libkdegames.&lt;br /&gt;
&lt;br /&gt;
== KStandardGameAction ==&lt;br /&gt;
This class is an extension to the usual &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; class which provides easy access to often used KDE actions.&lt;br /&gt;
&lt;br /&gt;
Using these actions helps maintaining consistency among the games.&lt;br /&gt;
&lt;br /&gt;
Games often use different menu entries than other programs, e.g. games use&lt;br /&gt;
the menu &amp;quot;game&amp;quot; instead of &amp;quot;file&amp;quot;. This class provides the entries which&lt;br /&gt;
differ from the usual KStandardAction entries.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Add some code like this to your action setup code.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KStandardGameAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setupActions()&lt;br /&gt;
{&lt;br /&gt;
  // Game&lt;br /&gt;
  KStandardGameAction::gameNew(this, &lt;br /&gt;
                       SLOT(newGame()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::highscores(this, &lt;br /&gt;
                       SLOT(showHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::quit(this, &lt;br /&gt;
                       SLOT(close()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
&lt;br /&gt;
  // Move&lt;br /&gt;
  KStandardGameAction::undo(this, &lt;br /&gt;
                       SLOT(undoMove()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::redo(this, &lt;br /&gt;
                       SLOT(redoMove()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
&lt;br /&gt;
  // Settings&lt;br /&gt;
  KStandardGameAction::configureHighscores(this, &lt;br /&gt;
                       SLOT(configureHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Games/Highscores</id>
		<title>Development/Tutorials/Games/Highscores</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Games/Highscores"/>
				<updated>2008-04-28T20:45:24Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KDE Games|&lt;br /&gt;
&lt;br /&gt;
name=High Scores|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Programming_Tutorial_KDE_4|Introduction to KDE4 programming]], [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction Tutorial]]|&lt;br /&gt;
&lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KScoreDialog}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will explain how to use the high score system built into kdegames in your application.&lt;br /&gt;
&lt;br /&gt;
[[image:Highscore.png|center|thumb|Dialog in KMines]]&lt;br /&gt;
&lt;br /&gt;
==KScoreDialog==&lt;br /&gt;
The high score system is provided through the KScoreDialog class. It is intended to be a lightweight solution and offers the following abilities:&lt;br /&gt;
#Grouping of scores (for different difficulty levels etc.)&lt;br /&gt;
#Standard fields: Name, Level, Date, Time, Score&lt;br /&gt;
#Custom fields (e.g. number of moves)&lt;br /&gt;
&lt;br /&gt;
==Displaying Scores==&lt;br /&gt;
To display the high score table, it's as simple as two lines of code. &lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void showHighscores()&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will display the highscore table showing, by default, the 'Name' and 'Score' columns.&lt;br /&gt;
&lt;br /&gt;
In order to comply with the kdegames standards, you should use a {{class|KStandardGameAction}} to launch this function. This will set up the icons and toolbars correctly. See the [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction tutorial]] for more information on this.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KStandardGameAction&amp;gt;&lt;br /&gt;
void setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KStandardGameAction::highscores(this, &lt;br /&gt;
                       SLOT(showHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adding Scores==&lt;br /&gt;
===Simplest way to add a score===&lt;br /&gt;
The simplest way to add a new score to the table is as follows:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will add the score &amp;lt;tt&amp;gt;playersScore&amp;lt;/tt&amp;gt; to the high score table and then launch the dialog. If it is the first score to be entered on the table, a blank line-edit will be provided for the player to enter their name, otherwise the line-edit will still be provided but the player's name will be automatically filled in.&lt;br /&gt;
&lt;br /&gt;
However, you will notice that the dialog is shown every time, even if the player didn't manage to get onto the table. If you only want to show the table if the player achieved a high score, place an &amp;lt;tt&amp;gt;if()&amp;lt;/tt&amp;gt; command around the &amp;lt;tt&amp;gt;KScoreDialog::addScore()&amp;lt;/tt&amp;gt; call:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
if(ksdialog.addScore(playersScore))&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Passing name by code===&lt;br /&gt;
If you want to suggest a name programatically you can do so by using the &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; type. It's easy to use, for example:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in this same way you can display other default fields by passing them to the &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; constructor and adding the information to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt;. For example, to display the level the player got to:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int level)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name |&lt;br /&gt;
                        KScoreDialog::Level, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  scoreInfo[KScoreDialog::Level].setNum(level);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Custom fields===&lt;br /&gt;
Since there are only a set number of standatd fields it is possible to add you own custom fields. For example you may want to put the number of moves the player made on the table. This is done through the &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int numMoves)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = &amp;quot;Matt&amp;quot;;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(playersScore);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addField(KScoreDialog::Custom1, &lt;br /&gt;
                    i18n(&amp;quot;Num of Moves&amp;quot;), &amp;quot;moves&amp;quot;);&lt;br /&gt;
  scoreInfo[KScoreDialog::Custom1].setNum(numMoves);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument to &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; must be from &amp;lt;tt&amp;gt;KScoreDialog::Custom1&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;KScoreDialog::Custom5&amp;lt;/tt&amp;gt;, the second is the text that will appear on the high score table at the head of the column (and must therefore be i18n'd) and the last argument is a unique identifier for the field. After that, it is added to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; in the same way as before.&lt;br /&gt;
&lt;br /&gt;
==Grouping Scores==&lt;br /&gt;
Your game may have different levels of difficulty and so you don't want to put the scores for the 'Hard' level on the same table as the 'Easy' table. Grouping scores is easy to achieve using the &amp;lt;tt&amp;gt;KScoreDialog::setConfigGroup()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.setConfigGroup(I18N_NOOP(&amp;quot;Easy&amp;quot;));&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Each group will show up as a tab on the high score table dialog. If you don't specify a group, the score will be added to the generic 'High Score' tab.&lt;br /&gt;
&lt;br /&gt;
A very important point to remember is to pass the untranslated group name through &amp;lt;tt&amp;gt;I18N_NOOP()&amp;lt;/tt&amp;gt; otherwise the group name will not be translated properly and will cause bugs.&lt;br /&gt;
&lt;br /&gt;
==Advanced Features==&lt;br /&gt;
===Hiding Fields===&lt;br /&gt;
In some special cases you won't want to display a score as such but rather just the time the player took to complete the level.&lt;br /&gt;
&lt;br /&gt;
While you're not going to display the 'Score' field in your table you must always submit a value to 'Score' field since it is used for sorting the scores. In fact, the 'Score' field is always present in a &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; object even if you didn't pass it to the constructor. However, ity is possible to hide the 'Score' field (and in fact any field) from display using the &amp;lt;tt&amp;gt;KScoreDialog::hideField()&amp;lt;/tt&amp;gt; function. It takes a Field flag from the same set that the constructor takes.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// timeString is a nicely formatted string&lt;br /&gt;
// e.g. &amp;quot;1:24&amp;quot; used for display&lt;br /&gt;
void newHighscore(const QString&amp;amp; timeString, int seconds)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name | &lt;br /&gt;
                        KScoreDialog::Time, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Time] = timeString;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(seconds);&lt;br /&gt;
  ksdialog.hideField(KScoreDialog::Score);&lt;br /&gt;
  ksdialog.addScore(scoreInfo, KScoreDialog::LessIsMore)&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:KDEGames]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/GitoriousKDE</id>
		<title>Projects/GitoriousKDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/GitoriousKDE"/>
				<updated>2008-04-28T12:38:51Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Contribute/GitoriousKDE moved to Projects/GitoriousKDE: This definitely shouldn't be under Contribute. If anywhere it should be in Projects.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Goal =&lt;br /&gt;
&lt;br /&gt;
'''Improve and adapt the [http://gitorious.org Gitorious Web Application] for its use in the development of KDE'''&lt;br /&gt;
&lt;br /&gt;
= Process and development of the project =&lt;br /&gt;
&lt;br /&gt;
Evaluate the current peculiarities of Gitorious and the process or politics of the KDE development to define the new modifications needed to obtain the best integration with Gitorious.&lt;br /&gt;
&lt;br /&gt;
=KDE repository structure=&lt;br /&gt;
&lt;br /&gt;
First we need to study the KDE repository structure with Git.&lt;br /&gt;
KDE is an umbrella of many big projects, each of them is made of several smaller parts that are projects of their own.&lt;br /&gt;
What seems to be the current agreement is that KDE big projects would be git supermodules and KDE sub-projects would be git submodules.&lt;br /&gt;
&lt;br /&gt;
'''This is what it looks like''':&lt;br /&gt;
&lt;br /&gt;
==Supermodules==&lt;br /&gt;
&lt;br /&gt;
kdelibs.git&lt;br /&gt;
  README/TODO/CMake/...&lt;br /&gt;
  includes&lt;br /&gt;
  doc&lt;br /&gt;
  ...&lt;br /&gt;
  kdecore.git    (module)&lt;br /&gt;
  kdeui.git      (module)&lt;br /&gt;
  kio.git        (module)&lt;br /&gt;
  knewstuff.git  (module)&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
kdebase.git&lt;br /&gt;
  README/TODO/CMake/...&lt;br /&gt;
  includes&lt;br /&gt;
  doc&lt;br /&gt;
  ...&lt;br /&gt;
  plasma.git     (module)&lt;br /&gt;
    ruphy-plasma.git&lt;br /&gt;
    notmart-plasma.git&lt;br /&gt;
    chani-plasma.git&lt;br /&gt;
    someone-plasma.git&lt;br /&gt;
    ...&lt;br /&gt;
  kdm.git        (module)&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=KDE commit politic=&lt;br /&gt;
&lt;br /&gt;
KDE has a history of being developer friendly and easily giving svn accounts to most people that apply for them. Git makes this even easier as anybody can commit to his/her own branch.&lt;br /&gt;
&lt;br /&gt;
That being said, KDE is more or less a meritocracy and some developers have more power than others when it comes to administration. This is necessary but SVN can make the administration painful for admins and frustrating for wanna-be developers as they have to wait before they can commit.&lt;br /&gt;
&lt;br /&gt;
Given that, we have thought of a simple user/role organization (no complicated rwx type of permissions system that nobody gets and uses).&lt;br /&gt;
&lt;br /&gt;
==Type of users and their abilities==&lt;br /&gt;
&lt;br /&gt;
===regular users===&lt;br /&gt;
* ability to create clones and commit to their clones&lt;br /&gt;
* ability to make merge request to mainline&lt;br /&gt;
* ability to apply for developer status&lt;br /&gt;
* ability to request for the creation of a new supermodule/submodule&lt;br /&gt;
* ability to make bug reports/whishes&lt;br /&gt;
===KDE developers===&lt;br /&gt;
* ability to make commits to mainline&lt;br /&gt;
* ability to accept or reject appliances for developer status (see question 2)&lt;br /&gt;
* ability to request for the creation of a new supermodule/submodule&lt;br /&gt;
===Administrator===&lt;br /&gt;
* ability to create (and remove?) supermodules and submodule&lt;br /&gt;
* ability to move submodule from one supermodule to another supermodule (ex: kdeplayground=&amp;gt;kdeedu )&lt;br /&gt;
* ability to accept creation of new projects inside of supermodules&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is what we have so far.&lt;br /&gt;
&lt;br /&gt;
=We have a few questions too=&lt;br /&gt;
&lt;br /&gt;
1) What's the use of private clones?&lt;br /&gt;
&lt;br /&gt;
2) The question is to know if each submodule of a supermodule will have one or several admin or if every developers of a submodule will have the ability to accept or reject new developers?&lt;br /&gt;
&lt;br /&gt;
3) If there are submodules admins, who does grant them there role? the supermodule admin?&lt;br /&gt;
&lt;br /&gt;
4) Gitorious would be a websvn replacement only or will it be a bugzilla replacement too? Gitorious devs are implementing ticket tracking as of this document writing.&lt;br /&gt;
&lt;br /&gt;
5) is it necesary to implement &amp;quot;applying for developer status&amp;quot; or will it continue to happen by mail as it does now?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Suggestions=&lt;br /&gt;
&lt;br /&gt;
1) suggestion: anybody will be able to create projects/repositories/forks without any permissions, those projects will be moved to kdeplayground/&amp;lt;submodule&amp;gt; with the submodule created by the superadmin. The project creator could choose the submodule by him/herself. This seems to be in the spirit of kde playground, what do you think?&lt;br /&gt;
&lt;br /&gt;
2) Playground module for each supermodule(kdelibs, kdebase):&lt;br /&gt;
&lt;br /&gt;
kdelibs.git&lt;br /&gt;
  ...&lt;br /&gt;
  playground/&lt;br /&gt;
    project1.git&lt;br /&gt;
    project2.git&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
kdebase.git&lt;br /&gt;
  ...&lt;br /&gt;
  playground/&lt;br /&gt;
    project3.git&lt;br /&gt;
    project4.git&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
playground/ (is a supermodule)&lt;br /&gt;
  project5.git&lt;br /&gt;
  project.6git&lt;br /&gt;
  ...&lt;br /&gt;
3) knewstuff2 server (git repo =&amp;gt; knewstuff2 =&amp;gt; user )&lt;br /&gt;
&lt;br /&gt;
=Sum up of the evaluation=&lt;br /&gt;
&lt;br /&gt;
==What needs to be done==&lt;br /&gt;
&lt;br /&gt;
* adapt Gitorious to include roles for project members. Those would be developers and admins. For now, gitorious has the concept of &amp;quot;committers&amp;quot; who can commit to mainline (or a clone), those would be KDE developers.&lt;br /&gt;
&lt;br /&gt;
* it is necessary to implement the concept and managment of supermodules in Gitorious (those supermodules would be KDE super projects such as kdelibs, kdebase, kdeedu...). This functionality is already on the TODO list of Gitorious.&lt;br /&gt;
&lt;br /&gt;
* the visibility of a project's clone will be modifiable by its creator, ability that only developers will have&lt;br /&gt;
&lt;br /&gt;
* migration scripts to migrate bugzilla db to gitorious (suggestion)&lt;br /&gt;
&lt;br /&gt;
* adapt gitorious design to KDE web style&lt;br /&gt;
&lt;br /&gt;
* Annex: create plasmoids that will make use of the Gitorious web service api.&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Projects/GitoriousKDE</id>
		<title>Talk:Projects/GitoriousKDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Projects/GitoriousKDE"/>
				<updated>2008-04-28T12:38:51Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Talk:Contribute/GitoriousKDE moved to Talk:Projects/GitoriousKDE: This definitely shouldn't be under Contribute. If anywhere it should be in Projects.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Wrong place for this ==&lt;br /&gt;
&lt;br /&gt;
This isn't really techbase material but if anywhere, if should go under [[Projects]]. I'll move it there now --[[User:Milliams|milliams]] 14:37, 28 April 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Contribute/GitoriousKDE</id>
		<title>Contribute/GitoriousKDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Contribute/GitoriousKDE"/>
				<updated>2008-04-28T12:38:51Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Contribute/GitoriousKDE moved to Projects/GitoriousKDE: This definitely shouldn't be under Contribute. If anywhere it should be in Projects.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Projects/GitoriousKDE]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Contribute/GitoriousKDE</id>
		<title>Talk:Contribute/GitoriousKDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Contribute/GitoriousKDE"/>
				<updated>2008-04-28T12:38:51Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Talk:Contribute/GitoriousKDE moved to Talk:Projects/GitoriousKDE: This definitely shouldn't be under Contribute. If anywhere it should be in Projects.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Talk:Projects/GitoriousKDE]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Projects/GitoriousKDE</id>
		<title>Talk:Projects/GitoriousKDE</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Projects/GitoriousKDE"/>
				<updated>2008-04-28T12:37:40Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Wrong place for this&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Wrong place for this ==&lt;br /&gt;
&lt;br /&gt;
This isn't really techbase material but if anywhere, if should go under [[Projects]]. I'll move it there now --[[User:Milliams|milliams]] 14:37, 28 April 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:Danimo</id>
		<title>User talk:Danimo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:Danimo"/>
				<updated>2008-04-28T12:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* More readable URLs */ Thanks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==CAPTCHAs that won't go away==&lt;br /&gt;
Aseigo [[Talk:Main_Page#Something_wrong_with_the_CAPTCHAs|suggested]] that I ask you about this.  Everytime I make an edit, it claims that I am adding a URL, and wants me to do some math.  Is it even supposed to do this to registered users?  In any case, ''most'' times I am not adding a url at all, and I tire of the systems inordinate appetite for elementary arithmetic.  Can this be fixed?  Thanks. --[[User:Axiom|Axiom]] 20:27, 28 March 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
As you asked me, I removed all the occurrences of &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt; with &amp;lt;nowiki&amp;gt;{{path}}&amp;lt;/nowiki&amp;gt;, and removed the obsolete template &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt;. -- [[user:Pino|pino]] 02:16, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:There is also a template called &amp;lt;nowiki&amp;gt;{{module}}&amp;lt;/nowiki&amp;gt; for KDE modules (kdelibs, kdebase), etc. I initially used path here, too, and thought that's enough. It's not widely used, only by 2 articles. Maybe we should replace it by path again? What do you think? --[[User:Dhaumann|Dhaumann]] 09:14, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::I agree. --[[User:Danimo|Danimo]] 09:28, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::Or maybe link it to the module page in the apidocs (e.g [http://api.kde.org/4.0-api/kdelibs-apidocs/ kdelibs])? --[[User:Milliams|milliams]] 14:47, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:::Good idea, &amp;lt;nowiki&amp;gt;{{kdelibs}}, {{kdebase}}&amp;lt;/nowiki&amp;gt; etc... +1 from my side :) --[[User:Dhaumann|Dhaumann]] 15:11, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::::Sounds good. Or how about &amp;lt;nowiki&amp;gt;{{module|foo}}&amp;lt;/nowiki&amp;gt; linking to http://api.kde.org/4.0-api/foo-apidocs/? I don't know how flexible this method is though? --[[User:Milliams|milliams]] 19:41, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:::::+1 on [[User:Milliams|milliams]]' idea --[[user:Pino|pino]] 21:35, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Assistance needed for new contributor to Techbase==&lt;br /&gt;
Hi. My name is Thor, I am a new contributor to KDE and I am looking to provide some help with regard to one of the KDE Games, KTuberling (The Potato dude).  I am a Polyglot, and work in many different languages, and I have noticed on issues of KTuberling that even with correct software in place, certain speech selections do not function (Notably; Serbian and Danish).  I have been working on these for a while and would like to obtain source code for the Tuberling to try and correct the error.  Could you tell me please how I find out who is working on what, and what they are doing to it?  Thanks and Regards.  [[User:ThunderGod|ThunderGod]] 15:40, 30 December 2007 (CET)&lt;br /&gt;
:The best place to find assistance with this is by visiting the #kdegames or #kde-edu channels on irc.freenode.org or by sending an joining the KDE Games mailing list at [https://mail.kde.org/mailman/listinfo/kde-games-devel https://mail.kde.org/mailman/listinfo/kde-games-devel]. I believe tsdgeos (Albert Astals Cid) is the best person to speak to. --[[User:Milliams|milliams]] 17:13, 30 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== More readable URLs ==&lt;br /&gt;
&lt;br /&gt;
At the moment all links on this site are in the form [http://techbase.kde.org/index.php?title=Development/Tutorials http://techbase.kde.org/index.php?title=Development/Tutorials]. I think it would make the site much more readable to convert these links into something like [http://techbase.kde.org/Development/Tutorials http://techbase.kde.org/Development/Tutorials]. Now, as you can see, if you click on that link it does indeed work and takes you to the same page (so you've obviously got mod_rewrite working correctly) so the problem is that mediawiki itself isn't formatting it's links to take advantage of this. I think you basically need to do step 2 from [http://www.mediawiki.org/wiki/Manual:Short_URL#Setup_steps here]. --[[User:Milliams|milliams]] 14:53, 18 April 2008 (CEST)&lt;br /&gt;
:It seems this is working now. Thanks a lot :) --[[User:Milliams|milliams]] 14:34, 28 April 2008 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Remove my account ==&lt;br /&gt;
&lt;br /&gt;
Please remove my account; i'd like to choose another username. Thank you. [[User:Krf|KRF]]&lt;br /&gt;
&lt;br /&gt;
:Mediawiki has no concept of user account deletion, since that would mess up the history. Just create a new user and add redirects from your current user accounts user page. --[[User:Danimo|Danimo]] 17:55, 20 April 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan</id>
		<title>Schedules/KDE4/4.1 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan"/>
				<updated>2008-04-28T01:25:21Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* kdegames */ Kubrick is now in kdegames&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features. The deadline for adding entries here for the 4.1 release is '''20 April 2008'''.&lt;br /&gt;
&lt;br /&gt;
Entries added after that date will be scheduled for the 4.2 release.&lt;br /&gt;
&lt;br /&gt;
Legend:&lt;br /&gt;
* todo =&amp;gt; not started yet&lt;br /&gt;
* in-progress =&amp;gt; started, but not completed yet&lt;br /&gt;
* done =&amp;gt; completed&lt;br /&gt;
__TOC__&lt;br /&gt;
= kdelibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|various|[[Projects/Widgets_and_Classes | Classes and Widgets]] that should be moved from others modules up into kdelibs|kde-core-devel@kde.org|The Core Developers}}&lt;br /&gt;
{{FeatureDone|kdeui|Add KFadeWidgetEffect to easily add fading UI transitions to KDE applications|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureDone|kdeui|Make icon naming spec compliant 3rd party icon themes like Tango or gnome-icon-theme work correctly.|jpetso@gmx.at|Jakob Petsovits}}&lt;br /&gt;
{{FeatureDone|kross|Add QtScript support|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KHTML|Support CSS3 Media Queries|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureDone|KHTML|Efficient smooth scrolling|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureDone|Phonon KCM|More UI feedback|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|VideoWidget snapshot function|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|better integration of pulseaudio|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|make AbstractMediaStream/StreamInterface threadsafe|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|allow backend switching on the fly|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|Phonon|add Port class for fine grained control over data flow between Phonon objects|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureDone|Phonon|subtitle, audio track selection|kretz@kde.org|Matthias Kretz and Ian Monroe}}&lt;br /&gt;
{{FeatureTodo|Phonon|DVD menu selection support|imonroe@kde.org|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Phonon|&amp;quot;low-level&amp;quot; PCM I/O with at least an ALSA implementation|kretz@kde.org|Matthias Kretz and Ian Monroe}}&lt;br /&gt;
{{FeatureTodo|Phonon|update device preference on the fly|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Goya, a framework for inserting controls into itemviews in a really easy and fast way|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureInProgress | kdeui | Rich textedit widget supporting most rich text features. | steveire@gmail.com | Stephen Kelly }}&lt;br /&gt;
{{FeatureInProgress|kdeui|Shortcut schemes for KDE applications|adymo@kdevelop.org|Alexander Dymo}}&lt;br /&gt;
{{FeatureDone|kmimetypetrader/kbuildsycoca|Replace use of profilerc for ordering applications with new mimeapps.list standard|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureInProgress|knewstuff|Support caching, and speed up the interface through use of Models/Views and goya|jeremy@scitools.com|Jeremy Whiting}}&lt;br /&gt;
{{FeatureInProgress|Phonon KCM|Handle advanced devices|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Reintroduce KDEPrint in some form, depending on what Qt4.4 delivers.|john@layt.net|john Layt}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Add CUPS Options tabs to QPrintDialog to support n-up, page borders, banner pages, page labels, mirror pages, job scheduling, and manual CUPS options.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|Add framework for standard actions for 'Send to...' for e-mail, fax, etc by printing to PDF/PS.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|Migrate FilePrinter class from Okular to enable file printing for all apps via QPrinter, modify to utilise new Qt4.4 features.  To be discussed on k-c-d first.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KIO|speed limits on KIO Transfers|nolis71cu@gmail.com|Manolo Valdes}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Printing of shortcuts from the shortcut dialog|apaku@gmx.de|Andreas Pakulat}}&lt;br /&gt;
{{FeatureDone|Kate Part|Annotation framework for the editor|apaku@gmx.de|Andreas Pakulat}}&lt;br /&gt;
{{FeatureInProgress|KJS|Bytecode interpreter and performance improvements|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureInProgress|KHTML|Sync class and file structure with WebKit to prepare merging|porten@kde.org|Harri Porten}}&lt;br /&gt;
{{FeatureInProgress|KHTML|contentEditable/designMode implementation|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KCalenderSystem|Complete migration of Jalali, Hijri, and Hebrew calendars to new code base.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KCalenderSystem|Add new calendar systems: Indian Civil (Saka), Ethiopean, Chinese, Pure Julian, Pure Gregorian. (Note, not all may live in kdelibs or be available as a global calendar system)|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KLocale|Implement KLocale based methods to return weekend days and day of religious observance.  Currently KCalendarSystem provides dayOfPray(), but for Gregorian this is not correct in all locales where it is used.  Currently KDatePicker hardcodes Saturday and dayOfPray() as weekend days which may not be correct in all locales.  To be discussed first on k-c-d and with kdepim.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|dnssd|Models for service browser and domain browser.|qbast@go2.pl|Jakub Stachowski}}&lt;br /&gt;
{{FeatureTodo|KHTML|Adaptable/Scriptable workarounds for broken websites.|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureTodo|KHTML|support for borders-* properties from the CSS3 Background and Borders Module|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KHTML|support for Audio/Video tags from the HTML5 draft specification|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureDone|KHTML|prospective loading of other network resources while waiting for arrival of blocking scripts|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureInProgress|KJS|Public API for extensions. Possibly analog to JavaScriptCore's C API.|porten@kde.org|Harri Porten}}&lt;br /&gt;
{{FeatureTodo|KTextEditor|Several interface extensions (e.g. open/save filter)|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureTodo|KTextEditor|Plugin for basic collaborative editing|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureInProgress|Kate Part|Scripting support for indentation and little helpers|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureTodo|Kate Part|Input modes to allow e.g. vim-like editing|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureDone|KIO|Implement support for inline editing in KFileItemDelegate|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureDone|KIO|Add support for drawing text shadows in KFileItemDelegate|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Emoticons lib|An emoticons library so each applications doesn't have to implement the same things over and over again |brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureInProgress|KFile|Implement fd.o desktop-bookmark-spec for KFilePlacesModel|nf2@scheinwelt.at|Norbert Frese}}&lt;br /&gt;
{{FeatureTodo|kdeui| Support for About Data of libs and modules used by a program |kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|kdeui|Drop-in replacement for QFontComboBox, with more informative previews in non-Latin1 locales|caslav.ilic@gmx.net|Chusslove Illich}}&lt;br /&gt;
{{FeatureInProgress|KAboutLicense|Select licenses by keyword, to centralize license info texts for frequent licenses.|caslav.ilic@gmx.net|Chusslove Illich}}&lt;br /&gt;
{{FeatureTodo|KIO|KIO::AuthInfo and PasswordDialog: optional fields (like &amp;quot;domain&amp;quot;); optional anonymous switch and flag to suppress KIO's password caching|nf2@scheinwelt.at|Norbert Frese}}&lt;br /&gt;
{{FeatureTodo|kdeui|Support for KConfigGroup in KConfigSkeleton|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepimlibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Akonadi|Move the Akonadi development library from kdepim.|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Item size ([[Projects/PIM/Akonadi#Core|details]])|thomas.mcguire@gmx.net|Thomas McGuire}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Payload serialization format versioning ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Item streaming in ItemSync/ResourceBase ([[Projects/PIM/Akonadi#Core|details]])|tomalbers@kde.nl|Tom Albers}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|API for additional item parts ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org,tokoe@kde.org|Volker Krause/Tobias Koenig}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Infrastructure for showing additional dialogs from agents/resources ([[Projects/PIM/Akonadi#Core|details]])|tomalbers@kde.nl|Tom Albers}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Allow to limit ItemFetchJob to current cache content ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Fix API for item/collection modifications ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Error reporting ([[Projects/PIM/Akonadi#Core|details]])|tokoe@kde.org|Tobias Koenig}}&lt;br /&gt;
{{FeatureTodo|gpgme++2|newly designed gpgme++ (multithreaded, exceptions, less event loop integration: better for Windows)|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureTodo|kpimutils|Change linklocator to use the new emoticon lib|brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Dolphin|Details-view: Allow to open folders as tree (turned off per default).|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Refactor view-action handling to a DolphinViewActionHandler to share more code with DolphinPart|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureDone|Konqueror|Re-implement Copy To / Move To in the popup menu|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureTodo|Konqueror|Separate konquerorrc and kfmrc (at least useful for home URL and toolbar settings)|faure@kde.org|David Faure and Emanuele Tamponi}}&lt;br /&gt;
{{FeatureDone|Dolphin|Simplify selecting of files in the single-click mode (based on http://aseigo.blogspot.com/2006/04/icons.html).|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Raptor|The KDE4-Application-Menu}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Provide optional tooltips for files and directories.|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Tabs|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Bring back the large tooltip like in kde3|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Session management (save/restore session/restore from crash).|edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Support for undo closed window.|edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureDone|Konqueror|Allow to configure the Dolphin KPart within the Konquerors settings dialog.|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Improve code and usability.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Reimplement partitions list.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Reimplement memory module.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureDone|KInfocenter|Reimplement PCI module.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureTodo|KInfocenter|Reimplement Network module.|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Plasma|Kickoff orientation dependent layout|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureDone|kmenuedit|Restore menu system|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureDone|KCM autostart|Configure autostart desktop file|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureDone|Plasma|improve fail to launch and needs &lt;br /&gt;
config|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureDone|ksmserver|UI for selecting WMs|l.lunak@kde.org|Luboš Luňák}}&lt;br /&gt;
{{FeatureDone|Plasma|polish kickoff|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureDone|Plasma|toolbox improvements |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureDone|Plasma|GHNS2 plasma themes|jeremy@scitools.com|Jeremy Whiting}}&lt;br /&gt;
{{FeatureDone|Plasma|Resizable, relocatable panel|binner@kde.org|Stephan Binner}}&lt;br /&gt;
{{FeatureInProgress|Solid|Refactor Solid::Control networking|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|Solid|Backend for NetworkManager 0.7|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|System Settings|Filtering/Lazy load category modules|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KSysGuard|Monitor process I/O|tapsell@kde.org|John Tapsell}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Add printer applet for viewing print jobs and printer auto-configuration.|jriddell @ubuntu.com|Jonathan Riddell}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Mac-like menu bar plasmoid|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Add 'smart setting' of extended colors|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Add KDE3 scheme import|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Query kwin for supported colors; add full set of kwin colors|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|reintroduce KDEPrint Print Management tools, e.g. KCM, kprinter, kjobviewer, etc.  Depends upon progress of kdelibs side of KDEPrint and Qt4.4 feature set.|john@layt.net|john Layt}}&lt;br /&gt;
{{FeatureTodo|System Settings|Administrator mode support|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|krunner|Revamp GUI.|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|Plasma|keyboard shortcuts|Chani Armitage|chanika@gmail.com}}&lt;br /&gt;
{{FeatureInProgress|Plasma|webkit widget|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|shared timer in engines|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|welcome plasmoid|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|dashboard widget support|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasmagik packaging (and package classes)|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Scriptengines|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureInProgress|Plasma|QtScript scriptengine|richmoore44@gmail.com|Richard Moore}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Filebrowser Plasmoid|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Improve QtScript support|richmoore44@gmail.com|Richard Moore}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Zooming User Interface|chanika@gmail.com|Chani Armitage}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Multiple Desktop Containments|chanika@gmail.com|Chani Armitage}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Networkmanager Plasmoid and DataEngine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureInProgress|Plasma|API changes [[Projects/Plasma/Tokamak1]]|panel-devel@kde.org|Plasma team }}&lt;br /&gt;
{{FeatureInProgress|Plasma|Panel Toolbox|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Panel changes to make it work with the new default theme|notmart@gmail.com|Marco Martin}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Generic folder view applet/containment, that can also be used as the desktop background (showing the desktop folder).|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Krunner|Configuration options for blacklisting, user ranking, runner ranking, learning|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureTodo|Krunner|Simple learning|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureTodo|Krunner|Simple GUI for above options|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureTodo|Krunner|Runners able to share parsing|mumismo@gmail.com|Jordi Polo}}&lt;br /&gt;
{{FeatureInProgress|Krunner|Configuration dialog for KRunner|ryan.bitanga@gmail.com|Ryan P. Bitanga}}&lt;br /&gt;
{{FeatureTodo|Krunner|Noun-Verb support|ryan.bitanga@gmail.com|Ryan P. Bitanga}}&lt;br /&gt;
{{FeatureDone|Plasma|Temperature sensing in the device engine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureDone|Plasma|Video data in the device engine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureTodo|Plasma|New plasma themes|nuno@oxygen-icons.org|Nuno Pinheiro}}&lt;br /&gt;
{{FeatureTodo|Plasma|physics-based animator|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|Improve the base set of plasmoids|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|New wallpapers|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|New way of handling wallpapers and different sizes (package format, and so on...)|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|Top-level windows plasmoids|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureDone|Plasma|change showConfigurationInterfaction to createConfigurationInterface|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|Plasma::Service |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|Keyboard shortcuts |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|panel hiding |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|panel toolbox |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureDone|KWin|non-linear animations also for KWin|sebas@kde.org|Sebastian Kuegler}}&lt;br /&gt;
{{FeatureInProgress|KWin|Compiz's wobbly like effect for KWin|cedric.borgese@gmail.com|Cédric Borgese}}&lt;br /&gt;
{{FeatureTodo|KDM|Theme KDM (login manager) by default|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureTodo|Splash screen|New default splashscreen|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|Nepomuk|Simple Desktop Search client based on Nepomuk search|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Add a dataengine that implements galago-project Notifications DBus interface and a plasmoid which provides cute visualization of notifications along with nice and easy way to interact with them|dimsuz@gmail.com|Dmitry Suzdalev}}&lt;br /&gt;
{{FeatureInProgress|Plasma|loadDefaultSetup from a file, not hardcoded|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|ksmserver|Make the fade-to-gray logout effect work even when composite is disabled|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|nepomuk|Service that monitors file rename and delete operations and updates the metadata accordingly. kded module already exists in playground. problem: depends on inotify.|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|KCM emoticons|Adding/editing/removing emoticons theme|brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureInProgress|phonon-xine|snapshots in video widget|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|try to make VideoWidget work on GraphicsView|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|make states compatible to other backends|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|better support for pulseaudio (most work possibly in kdelibs)|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-gstreamer|Make phonon-gstreamer as released with Qt 4.4 fully integrate into KDE and add the features added to libphonon after libphonon 4.1|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|desktop ioslave|Add an ioslave that lists the contents of the desktop folder, and reports the names in the .desktop files instead of the actual file names.|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|knotify|Add support for galago desktop notifications spec - if knotify will find a certain DBus service on session bus, it'll forward its popup notification events to this service |dimsuz@gmail.com|Dmitry Suzdalev}}&lt;br /&gt;
{{FeatureInProgress|Oxygen cursors|Oxygen cursor set|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KMagnifier|Add color blindness simulation|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|KMagnifier|Refactor color menu, re-add invert, add color-shift modes to help people with color blindness|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeadmin =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KSystemLog|KSystemLog, a Log Viewer Tool. Move from kde-apps|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Do some refactoring in KCron|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Improve ergonomy and general interface|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Fix all existing bugs in KCron|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Convert KCron into a KCM Module, to use it in System Settings|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureInProgress|Environment Variables|Create a environment variables KCM Module|nicolas.ternisien@gmail.com}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeartwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebindings =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|Smoke2|Move Smoke2 to kdebindings-trunk.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|PHP-Qt|Move PHP-Qt to kdebindings-trunk.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|kross|Move krossjava to kdebindings-trunk.|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureTodo|General|Wrap some more APIs (at least Akanodi for all languages and Plasma for C#)|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|Qyoto|Add delegate support for signal/slot connections.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeedu =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Kalzium|Clean up the database. I am syncing with the BlueObelisk data repository again. There we decided to remove the density (not a element property but a compound property. I also removed the mean weight. We think it is better to provide correct data than a lot (but partly wrong) data.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Calculator Plasmoid|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Vector support|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureDone|Step|A physics simulator, move from playground to kdeedu module |ks.vladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureDone|Kalzium|Update the snapshot of libavogadro to 0.6.1. This introduces a gazillion new possibilities for the 3D renderer and fixes many issues.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Make use of the new libavogadro-version.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Expose molecular editing features of libavogadro.|marcus@cryos.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureTodo|Kalzium|Port Kalzium's periodic table to use new QGraphicsView.|marcus@cryos.org|Marcus D. Hanwell}}&lt;br /&gt;
{{FeatureInProgress|KStars|Tool to predict Conjunctions|akarshsimha@gmail.com|Akarsh Simha}}&lt;br /&gt;
{{FeatureInProgress|Marble|DGML2 Support|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|KDE-Version settings dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Port authors list from the Qt-About dialog to the KDE-About dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Qt-Version settings dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Improved KML support|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|OpenStreetMap support using original OSM tiles|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Real Time Cloud-Cover|tackat@kde.org|David Roberts / Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Map Contents translation|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Copy position to clipboard|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureDone|Marble|Create Tiles on compile time|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Mercator Projection|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureInProgress|Marble|More generic projection support|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureInProgress|Marble|Usage of Marble in non-widgets|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Export map to MxN pixel bitmap|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Support for MarbleWidget::setEnabled( bool )|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Layer Management Class|tokoe@kde.org|Tobias König}}&lt;br /&gt;
{{FeatureTodo|Marble|Plugin architecture for map layers|tokoe@kde.org|Tobias König}}&lt;br /&gt;
{{FeatureInProgress|KEduca|Rewrite of the classic test writing/taking application|matt@milliams.com|Matt Williams}}&lt;br /&gt;
{{FeatureDone|Parley|Redesigned main window|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|Parley|Vocabulary Plasmoid|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|KBruch and KPercentage|Merge in 1 app|pete@pmurdoch.com|Peter Murdoch}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Plasmoid to access Kalzium database|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Step|Improve GUI for creating gas and softbody|ksvladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureInProgress|KAlgebra|Variables share between calculations|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Export canvas as image|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Optional rulers/grid for canvas units|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add command line|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add a color picker|nielsslot@gmail.com|Niels Slot}}&lt;br /&gt;
{{FeatureInProgress|Parley|Declensions|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|Parley|Improved printing support|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureTodo|KLettres|Number support|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KLettres|Theme manager|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Add a Open File action|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Integrate an editor|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Plasmoid|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Theme manager|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KLettres|Visual indicator when letter is wrong|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|Kiten|Link radselect with kiten|jkerian@gmail.com|Joe Kerian}}&lt;br /&gt;
{{FeatureInProgress|Kiten|Sort output by dictionary/user selected sorting values|jkerian@gmail.com|Joe Kerian}}&lt;br /&gt;
{{FeatureTodo|Step|Use common constraints handling code for collisions|ksvladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureDone|Kig|Cubic-line intersection in case two of the three intersection points are already present|paolini@dmf.unicatt.it|Maurizio Paolini}}&lt;br /&gt;
{{FeatureTodo|Kig|Properties dialog for objects.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Improve construction of bisect lines.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Improve feedback when constructing objects.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|More geometric objects.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Script objects as macros (to be reused more than once).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Kig|Improve the Cabri import filter.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KDiamond|New game, move to kdegames|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KDiamond|Get themes with KNewStuff|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Better scoring system|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Add support for loading new themes|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureDone|Kollision|Move to kdereview/kdegames|p.capriotti@gmail.com|Paolo Capriotti}}&lt;br /&gt;
{{FeatureDone|Kubrick|New game, 3D OpenGL - move to playground|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Polish up the features|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Port to Qt4 and KDE4|ianw}}&lt;br /&gt;
{{FeatureDone|KBlocks|Finish display of points and level|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Implement KNewStuff support|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Implement key/action/shortcut configuration|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Docbook|piacentini@kde.org}}&lt;br /&gt;
{{FeatureInProgress|KGoldRunner|Improved theming and animation|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KGoldRunner|Sound support and theming|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KSquares|Multiplayer support|josef}}&lt;br /&gt;
{{FeatureDone|KsirK|New game, move to kdereview|kleag@free.fr|Gaël de Chalendar}}&lt;br /&gt;
{{FeatureInProgress|KsirK|Make network games work again|kleag@free.fr|Gaël de Chalendar}}&lt;br /&gt;
{{FeatureDone|KBattleship|Bring back Zeroconf support for network games|qbast@go2.pl}}&lt;br /&gt;
{{FeatureInProgress|Kubrick|New game, 3D OpenGL - in kdereview|ianw}}&lt;br /&gt;
{{FeatureInProgress|KGGZ|Add kggzcore and kggzdmod libraries|josef}}&lt;br /&gt;
{{FeatureTodo|KBlocks|Add additional themes|piacentini@kde.org}}&lt;br /&gt;
{{FeatureInProgress|KBreakout|Finish it, and move it from playground to kdegames|fela.kde@gmail.com}}&lt;br /&gt;
{{FeatureTodo|KGGZ|Add new Qt4-based core client as successor to the old KDE3-based KGGZ|josef (now SoC proposal)}}&lt;br /&gt;
{{FeatureTodo|KGGZ|Fire-and-forget highscore submission for single-player games and client-to-client multiplayer games|josef)}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Also see kdegames/kgoldrunner/TODO|ianw}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Hot new stuff support for themes and levels|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Startup screen|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KMahjongg|Reimplement the Board Editor|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KMines|Add pause actions|eike.lange@kdemail.net}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Configurable keyboard support|eike.lange@kdemail.net}}&lt;br /&gt;
{{FeatureTodo|KNetWalk|Support for custom and non-square board sizes|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureTodo|KShisen|Port to KScoreDialog|piacentini@kde.org}}&lt;br /&gt;
{{FeatureTodo|Kubrick|See SVN file kubrick/TODO|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Move to KDE Games for 4.1|ianw}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Gwenview|Undo system|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Gwenview|Fullscreen meta information|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Gwenview|Ability to open an image with another application|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Okular|Better Text-To-Speech integration: speech the whole document, the current page or the selection.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureDone|Okular|Encryption support for ODF generator|bradh@kde.org}}&lt;br /&gt;
{{FeatureInProgress|Okular|Backward direction for text search.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|Centralized text &amp;amp; graphics antialias configuration.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureDone|Okular|EPub backend.|elylevy@cs.huji.ac.il|Ely Levy}}&lt;br /&gt;
{{FeatureInProgress|Okular|Improved form support (add missing types, handle the fields better).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Support for tagging with Nepomuk|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Thumbnail bar in view and fullscreen modes|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Crop ratio|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|KIPI support|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Red eye correction|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Start page|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Okular|JavaScript support (mostly for PDF documents).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|Improved placement and sizing of the presentation mode: choose the screen to use, adapt to screen size changes.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Caret annotations.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|File attachment annotations (read only for now).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Sound annotations.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Link annotations.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Improve annotation support: for existing types (rubber stamps, line, note, etc), and for the way they are constructed and handled.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Separate the &amp;quot;view properties&amp;quot; out of the Document, in a View class. Use it for the page view and the presentation mode.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|Okular|Per-document zoom level.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureTodo|libksane|Move libksane to kdegraphics|kare.sars@kolumbus.fi|Kåre Särs}}&lt;br /&gt;
{{FeatureTodo|ksaneplugin|Replase libkscan with ksaneplugin|kare.sars@kolumbus.fi|Kåre Särs}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Dragon Player|A simple Phonon-based videoplayer application|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|Make Dragon indipendent from Xine|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|File Manager|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|play media dialog|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|slider changes|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|show info while playing audio files|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdenetwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KGet|Group-Settings|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Torrent-Support|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Transfer-Settings|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Webinterface|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|Kopete|AIM offline messages|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureDone|Kopete|OTR Encryption support|michael_zanetti@gmx.net|Michael Zanetti}}&lt;br /&gt;
{{FeatureDone|Kopete|Status manager|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureDone|Kopete|Non-intrusive notification system|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureInProgress|KGet|MultiSource-Downloading|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|Kopete|Bring back chat style selection via knewstuff2|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Kopete|ICQ 6 status icons|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureInProgress|Kopete|MSNP15 implementation for MSN|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|UPnp Support|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Updated contact list interface (uses Qt 4 rather than Qt 3)|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Use notebook lid for auto away|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureTodo|Kopete|Update Kopete to better support Decibel|kopete-devel@kde.org|Kopete Developers}}&lt;br /&gt;
{{FeatureTodo|Kopete|use the new emoticons library|brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureInProgress|KGet|Nepomuk-Integration|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureInProgress|KGet|Support mms://-protocol, see https://launchpad.net/libmms|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Global Speedlimits|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Setup libbtcore from KTorrent in KGet (to avoid dependency to extragear)|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureInProgress|KGet|Extend the TransferHistory to use SQLite and XML-Backends and display the information inside a kcategorizedview|jgoday@gmail.com|Javier Goday}}&lt;br /&gt;
{{FeatureTodo|Kopete|GroupWise chatroom support|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|[http://decibel.kde.org Decibel]|Decibel, a framework for real time communication services. Move from playground/pim|info@basyskom.de|Tobias Hunger}}&lt;br /&gt;
{{FeatureDone|KRDC|Optional system tray icon (with quick access to bookmarks)|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Improved behavior of entering special keys for better workflow|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Zeroconf support (detecting remote desktop services in local network)|romnes@stud.ntnu.no|Magnus Romnes}}&lt;br /&gt;
{{FeatureInProgress|KRDC|Bookmark dock widget for quick access to bookmars, zero conf detected services and recently used connections|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Support for up- and downscaling VNC remote desktop|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Network Manager Applet|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepim =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KAddressbook|Ability to add LDAP search results to distribution lists|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|Indication of which resource folder a contact belongs to|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|Read-only view for contacts in read-only folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|copy/cut/paste context menu items|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAlarm|Allow use of multiple calendar resources|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Handle time zones and seasonal time changes properly|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Abolish alarm daemon and make kalarm trigger alarms itself|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Replace simple repetitions by recurrence sub-repetitions to reduce confusion|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|New option for display alarm text to be generated by a command|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|New option to specify reminder times in minutes|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Prevent multiple identical error messages accumulating for the same alarm|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Provide &amp;quot;don't show again for this alarm&amp;quot; option for command error messages|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Remember main window show/hide options used when KAlarm closed instead of setting them in Preferences dialog|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Simplification and improvements to alarm edit dialog|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|KAlarm|Option to display alarms in centre of screen, with enable delay on buttons to avoid accidental acknowledgement|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureDone|Kleopatra|Ability to search in internal and external certificates at the same time|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kleopatra|General UI Server|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureDone|Kleopatra|New, tabbed, mainwindow design|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to create hyperlinks in HTML messages|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to easily create todos with reminders from emails|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to open messages from search results when the reader is hidden|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better invitation update emails showing what changed|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better reminder visualization in very small events|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better, natural language search criteria names|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Clickable status columns|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Client side configurability of warnings in shared folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Colored ribbons for indication of signing and encryption status in the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Configuration option for whether invitation emails are automatically deleted or not when having been acted upon|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Copy/paste and drag and drop from/to the mail composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Decryption on demand in reader window|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Display of quota information in foldertree tooltips|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop and copy and paste support in the search result viewer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop from the mail reader window and mime-tree viewer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop of folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Editing of attachments from the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Export and import of filters|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Favorites Folder|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Folder quicksearch|m.koller@surfeu.at|Martin Koller}}&lt;br /&gt;
{{FeatureDone|KMail|Harmonization of actions in main and standalone mail reader windows|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|IMAP Server storage of non-standard flags|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Improved TNEF attachment handling|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Improved quota warnings|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Initialize full search from quicksearch on request|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Override font and fontsize for standalone message viewers|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Per-folder identity configurability|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Recursive IMAP cache troubleshooting|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Resizable recipients area in composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for creating new mails based on received mails (Resend)|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for immediate sync of resource folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for soft line breaking|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Tab navigation through groups in the address completion|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Text snippets with shortcuts and variable expansion in the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Warning about active out-of-office scripts|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|lost+found recovery of locally changed folders that lose access rights|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KNotes|Ability to print notes|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KonsoleKalendar|Support &amp;quot;file&amp;quot; and &amp;quot;localdir&amp;quot; resources|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureDone|Kontact|Config option to close despite system tray|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Harmonization of component naming in sidebar, configuration, summary view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Right-aligned component navigation toolbar|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Ubiquitous sync actions|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Ability to have both distribution lists and addresbook extension visible|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Aggregated reminders view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Better default resource colors|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Drag and drop of attachments|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Faster initial loading of kolab resources|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Forwarding and delegation of invitations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Improved coloring of agenda view items|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Improved event printing|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Merge of the attachment view in into the main page|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Merge of the free-busy and attendee views for easier scheduling|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Month view scrolling, paging, mouse-wheeling|tom_t@gmx.at|Thomas Thrainer}}&lt;br /&gt;
{{FeatureDone|KOrganizer|More readable Kolab resource folder labels|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Redesigned incidence editor UI|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Side-by-side calendar view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Support for by-value attachments|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Timeline calendar view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Rich text incidence editor|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Hide/Show reminder daemon icon in the systeay|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Column-specific whatsthis-help| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Combined search and add task widget| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Drag&amp;amp;Drop| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|File management (file-&amp;gt;load)| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Managing history| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Tracking tasks by active applications| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Whatsthis-help dependent on if a task has been created| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureInProgress|Akregator|Support for syncing the feed list with Google Reader |osterfeld@kde.org|Frank Osterfeld}}&lt;br /&gt;
{{FeatureInProgress|KAlarm|New option to restrict alarms to working hours|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|Kleopatra|OpenPGP support|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureInProgress|KMail|HTML  Signatures|yez@familieschepers.nl|Edwin Schepers}}&lt;br /&gt;
{{FeatureInProgress|KNotes|Zeroconf support for sending notes on LAN|qbast@go2.pl|Jakub Stachowski}}&lt;br /&gt;
{{FeatureInProgress|Kontact|New Planner summary; combines Appointment+To-do+SpecialDates into 1 pretty summary|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureInProgress|KOrganizer|New To-do View (model/view)|tom_t@gmx.at|Thomas Thrainer}}&lt;br /&gt;
{{FeatureInProgress|KOrganizer|New Month View (qgraphicsitem)|bvirlet@kdemail.net|Bruno Virlet}}&lt;br /&gt;
{{FeatureInProgress|KPilot|Finish Keyring conduit, base conduit code and test cases, category syncing|jkasper@kde.org|Jason 'vanRijn' Kasper}}&lt;br /&gt;
{{FeatureTodo|Akregator|Basic support for enclosures (Displaying links, mimetype and size)|osterfeld@kde.org|Frank Osterfeld}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Option to display alarm only if pre-alarm command succeeded|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|[http://kblogger.pwsp.net KBlogger]|KBlogger, a blogging application| christian_weilbach@.web.de|Christian Weilbach}}&lt;br /&gt;
{{FeatureTodo|Kleopatra|Konqueror and Dolphin Kleopatra plugins|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureTodo|KMail|Aggregated attachment view in the mail header area of the reader window|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KMail|Improved error messages and audit log for cryptographic operations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|Kontact|Support for Kontact wide profiles|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Ability to jump to the right day in the agenda from invitation mails|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Drag and drop in the free-busy view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Support for comments in replies to invitations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Support for extended free-busy lists|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Blog-styled journal view|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Blogging KResource|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureTodo|KPilot|Port old conduits to new base conduit architecture and KDE4/Qt4|jkasper@kde.org|Jason 'vanRijn' Kasper}}&lt;br /&gt;
{{FeatureTodo|KMail|Port to use KRichTextEdit|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
{{FeatureTodo|KBlogger|Port to use KRichTextEdit (Or KMEditor)|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
{{FeatureTodo|KNode|Port to use KRichTextEdit (Or KMEditor)|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdesdk =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Cervisia|New context menu entry &amp;quot;Add to Ignore List&amp;quot;|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
{{FeatureDone|Lokalize|Move this application (formerly known as Kaider) from extragear|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Cervisia|A file view based on KDirModel|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
{{FeatureInProgress|Lokalize|various Translation Memory enhancements|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Lokalize|XLIFF support|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|KBugBuster|Make it work|fabiolocati@gmail.com|Fabio Locati}}&lt;br /&gt;
{{FeatureInProgress|KCachegrind|Everything working again|josef.weidendorfer@gmx.de|Josef Weidendorfer}}&lt;br /&gt;
{{FeatureInProgress|Kate|Session plasmoid|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Make a GUI for it - in playground/devtools|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a PyQt4 template|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a Ruby template|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a Plasmoid template|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KAppTemplate|Add DBUS support in templates|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KCachegrind|Better handling of huge symbols|josef.weidendorfer@gmx.de|Josef Weidendorfer}}&lt;br /&gt;
{{FeatureTodo|Lokalize|Kross-based scripting|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|Lokalize|QA: glossary checklists|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|kioslave svn|Add Export/Import feature|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureTodo|Kate App|Improved session management|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdetoys =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeutils =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Okteta|binary/hex editor (successor to KHexEdit). Move from playground/utils.|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|make printing support only selection|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|ask artists for own icon|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add &amp;quot;Export as&amp;quot;|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|enable extract-strings tool and add copy|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|more explicit titels for undo/redo actions, also from filters|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|parameter dialog for &amp;quot;Copy as...&amp;quot;|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for blocking processes like printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|refactor KByteArrayView|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|KDiskFree|Use Solid API|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureTodo|KwikDisk|Replace it by a Plasmoid (in the desktop bar and on the desktop|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureInProgress | KJots | Support more rich text features like text formatting, hyperlinks and ordered/unordered lists. | steveire@gmail.com | Stephen Kelly }}&lt;br /&gt;
{{FeatureDone | KJots | Add checkmarks to pages. | steveire@gmail.com | Stephen Kelly }}&lt;br /&gt;
{{FeatureInProgress | KJots | Port to KRichText widget. | steveire@gmail.com |Stephen Kelly }}&lt;br /&gt;
{{FeatureTodo | KJots | Create a Kontact::Plugin to integrate kjots into Kontact. | steveire@gmail.com |Stephen Kelly }}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevelop =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevplatform =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdewebdev =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Kommander|Port the executor to KDE4.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureTodo|Kommander|Create Qt Designer plugins for the editor.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Create an upload plugin.| niko.sams@gmail.com|Niko Sams}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Create a new, state machine based parser.| amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Port existing functionality to KDevPlatform plugins. Only text mode is targeted.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|KXslDbg|Port to KDE4.|keith@kdewebdev.org  | &lt;br /&gt;
Keith Isdale}}&lt;br /&gt;
{{FeatureTodo|KLinkStatus|Aided correction of broken links||}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Site check automation|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureInProgress|KLinkStatus|D-Bus/Scripting interfaces|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureInProgress|KLinkStatus|HTML validation|thesquib@gmail.com|Sam Ryan}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Ability to export only broken links|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Ability to do background search which only update the GUI when finished (much faster))|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Tray Icon and KUniqueApplication|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Scripting Plugin|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Get Hot New Stuff for HTML result stylesheets|Paulo Moura Guedes}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Games/Highscores</id>
		<title>Development/Tutorials/Games/Highscores</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Games/Highscores"/>
				<updated>2008-04-27T16:20:09Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Grouping Scores */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KDE Games|&lt;br /&gt;
&lt;br /&gt;
name=High Scores|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Programming_Tutorial_KDE_4|Introduction to KDE4 programming]], [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction Tutorial]]|&lt;br /&gt;
&lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KScoreDialog}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will explain how to use the high score system built into kdegames in your application.&lt;br /&gt;
&lt;br /&gt;
[[image:Highscore.png|center|thumb|Dialog in KMines]]&lt;br /&gt;
&lt;br /&gt;
==KScoreDialog==&lt;br /&gt;
The high score system is provided through the KScoreDialog class. It is intended to be a lightweight solution and offers the following abilities:&lt;br /&gt;
#Grouping of scores (for different difficulty levels etc.)&lt;br /&gt;
#Standard fields: Name, Level, Date, Time, Score&lt;br /&gt;
#Custom fields (e.g. number of moves)&lt;br /&gt;
&lt;br /&gt;
==Displaying Scores==&lt;br /&gt;
To display the high score table, it's as simple as two lines of code. &lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void showHighscores()&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will display the highscore table showing, by default, the 'Name' and 'Score' columns.&lt;br /&gt;
&lt;br /&gt;
In order to comply with the kdegames standards, you should use a {{class|KStandardGameAction}} to launch this function. This will set up the icons and toolbars correctly. See the [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction tutorial]] for more information on this.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KStandardGameAction&amp;gt;&lt;br /&gt;
void setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KStandardGameAction::highscores(this, &lt;br /&gt;
                       SLOT(showHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adding Scores==&lt;br /&gt;
===Simplest way to add a score===&lt;br /&gt;
The simplest way to add a new score to the table is as follows:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will add the score &amp;lt;tt&amp;gt;playersScore&amp;lt;/tt&amp;gt; to the high score table and then launch the dialog. If it is the first score to be entered on the table, a blank line-edit will be provided for the player to enter their name, otherwise the line-edit will still be provided but the player's name will be automatically filled in.&lt;br /&gt;
&lt;br /&gt;
However, you will notice that the dialog is shown every time, even if the player didn't manage to get onto the table. If you only want to show the table if the player achieved a high score, place an &amp;lt;tt&amp;gt;if()&amp;lt;/tt&amp;gt; command around the &amp;lt;tt&amp;gt;KScoreDialog::addScore()&amp;lt;/tt&amp;gt; call:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
if(ksdialog.addScore(playersScore))&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Passing name by code===&lt;br /&gt;
If you want to suggest a name programatically you can do so by using the &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; type. It's easy to use, for example:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in this same way you can display other default fields by passing them to the &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; constructor and adding the information to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt;. For example, to display the level the player got to:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int level)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name |&lt;br /&gt;
                        KScoreDialog::Level, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  scoreInfo[KScoreDialog::Level].setNum(level);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Custom fields===&lt;br /&gt;
Since there are only a set number of standatd fields it is possible to add you own custom fields. For example you may want to put the number of moves the player made on the table. This is done through the &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int numMoves)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = &amp;quot;Matt&amp;quot;;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(playersScore);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addField(KScoreDialog::Custom1, &lt;br /&gt;
                    i18n(&amp;quot;Num of Moves&amp;quot;), &amp;quot;moves&amp;quot;);&lt;br /&gt;
  scoreInfo[KScoreDialog::Custom1].setNum(numMoves);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument to &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; must be from &amp;lt;tt&amp;gt;KScoreDialog::Custom1&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;KScoreDialog::Custom5&amp;lt;/tt&amp;gt;, the second is the text that will appear on the high score table at the head of the column (and must therefore be i18n'd) and the last argument is a unique identifier for the field. After that, it is added to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; in the same way as before.&lt;br /&gt;
&lt;br /&gt;
==Grouping Scores==&lt;br /&gt;
Your game may have different levels of difficulty and so you don't want to put the scores for the 'Hard' level on the same table as the 'Easy' table. Grouping scores is easy to achieve using the &amp;lt;tt&amp;gt;KScoreDialog::setConfigGroup()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.setConfigGroup(I18N_NOOP(&amp;quot;Easy&amp;quot;));&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Each group will show up as a tab on the high score table dialog. If you don't specify a group, the score will be added to the generic 'High Score' tab.&lt;br /&gt;
&lt;br /&gt;
A very important point to remember is to pass the untranslated group name through &amp;lt;tt&amp;gt;I18N_NOOP()&amp;lt;/tt&amp;gt; otherwise the group name will not be translated properly and will cause bugs.&lt;br /&gt;
&lt;br /&gt;
==Advanced Features==&lt;br /&gt;
===Hiding Fields===&lt;br /&gt;
In some special cases you won't want to display a score as such but rather just the time the player took to complete the level.&lt;br /&gt;
&lt;br /&gt;
While you're not going to display the 'Score' field in your table you must always submit a value to 'Score' field since it is used for sorting the scores. In fact, the 'Score' field is always present in a &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; object even if you didn't pass it to the constructor. However, ity is possible to hide the 'Score' field (and in fact any field) from display using the &amp;lt;tt&amp;gt;KScoreDialog::hideField()&amp;lt;/tt&amp;gt; function. It takes a Field flag from the same set that the constructor takes.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// timeString is a nicely formatted string&lt;br /&gt;
// e.g. &amp;quot;1:24&amp;quot; used for display&lt;br /&gt;
void newHighscore(const QString&amp;amp; timeString, int seconds)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name | &lt;br /&gt;
                        KScoreDialog::Time, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Time] = timeString;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(seconds);&lt;br /&gt;
  ksdialog.hideField(KScoreDialog::Score);&lt;br /&gt;
  ksdialog.addScore(scoreInfo, KScoreDialog::LessIsMore)&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:Danimo</id>
		<title>User talk:Danimo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:Danimo"/>
				<updated>2008-04-18T12:53:25Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* More readable URLs */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==CAPTCHAs that won't go away==&lt;br /&gt;
Aseigo [[Talk:Main_Page#Something_wrong_with_the_CAPTCHAs|suggested]] that I ask you about this.  Everytime I make an edit, it claims that I am adding a URL, and wants me to do some math.  Is it even supposed to do this to registered users?  In any case, ''most'' times I am not adding a url at all, and I tire of the systems inordinate appetite for elementary arithmetic.  Can this be fixed?  Thanks. --[[User:Axiom|Axiom]] 20:27, 28 March 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
As you asked me, I removed all the occurrences of &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt; with &amp;lt;nowiki&amp;gt;{{path}}&amp;lt;/nowiki&amp;gt;, and removed the obsolete template &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt;. -- [[user:Pino|pino]] 02:16, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:There is also a template called &amp;lt;nowiki&amp;gt;{{module}}&amp;lt;/nowiki&amp;gt; for KDE modules (kdelibs, kdebase), etc. I initially used path here, too, and thought that's enough. It's not widely used, only by 2 articles. Maybe we should replace it by path again? What do you think? --[[User:Dhaumann|Dhaumann]] 09:14, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::I agree. --[[User:Danimo|Danimo]] 09:28, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::Or maybe link it to the module page in the apidocs (e.g [http://api.kde.org/4.0-api/kdelibs-apidocs/ kdelibs])? --[[User:Milliams|milliams]] 14:47, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:::Good idea, &amp;lt;nowiki&amp;gt;{{kdelibs}}, {{kdebase}}&amp;lt;/nowiki&amp;gt; etc... +1 from my side :) --[[User:Dhaumann|Dhaumann]] 15:11, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::::Sounds good. Or how about &amp;lt;nowiki&amp;gt;{{module|foo}}&amp;lt;/nowiki&amp;gt; linking to http://api.kde.org/4.0-api/foo-apidocs/? I don't know how flexible this method is though? --[[User:Milliams|milliams]] 19:41, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:::::+1 on [[User:Milliams|milliams]]' idea --[[user:Pino|pino]] 21:35, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Assistance needed for new contributor to Techbase==&lt;br /&gt;
Hi. My name is Thor, I am a new contributor to KDE and I am looking to provide some help with regard to one of the KDE Games, KTuberling (The Potato dude).  I am a Polyglot, and work in many different languages, and I have noticed on issues of KTuberling that even with correct software in place, certain speech selections do not function (Notably; Serbian and Danish).  I have been working on these for a while and would like to obtain source code for the Tuberling to try and correct the error.  Could you tell me please how I find out who is working on what, and what they are doing to it?  Thanks and Regards.  [[User:ThunderGod|ThunderGod]] 15:40, 30 December 2007 (CET)&lt;br /&gt;
:The best place to find assistance with this is by visiting the #kdegames or #kde-edu channels on irc.freenode.org or by sending an joining the KDE Games mailing list at [https://mail.kde.org/mailman/listinfo/kde-games-devel https://mail.kde.org/mailman/listinfo/kde-games-devel]. I believe tsdgeos (Albert Astals Cid) is the best person to speak to. --[[User:Milliams|milliams]] 17:13, 30 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== More readable URLs ==&lt;br /&gt;
&lt;br /&gt;
At the moment all links on this site are in the form [http://techbase.kde.org/index.php?title=Development/Tutorials http://techbase.kde.org/index.php?title=Development/Tutorials]. I think it would make the site much more readable to convert these links into something like [http://techbase.kde.org/Development/Tutorials http://techbase.kde.org/Development/Tutorials]. Now, as you can see, if you click on that link it does indeed work and takes you to the same page (so you've obviously got mod_rewrite working correctly) so the problem is that mediawiki itself isn't formatting it's links to take advantage of this. I think you basically need to do step 2 from [http://www.mediawiki.org/wiki/Manual:Short_URL#Setup_steps here]. --[[User:Milliams|milliams]] 14:53, 18 April 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan</id>
		<title>Schedules/KDE4/4.1 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan"/>
				<updated>2008-04-14T18:10:37Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* kdegames */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of planned features. The deadline for adding entries here for the 4.1 release is '''20 April 2008'''.&lt;br /&gt;
&lt;br /&gt;
Entries added after that date will be scheduled for the 4.2 release.&lt;br /&gt;
&lt;br /&gt;
Legend:&lt;br /&gt;
* todo =&amp;gt; not started yet&lt;br /&gt;
* in-progress =&amp;gt; started, but not completed yet&lt;br /&gt;
* done =&amp;gt; completed&lt;br /&gt;
__TOC__&lt;br /&gt;
= kdelibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|kdeui|Add KFadeWidgetEffect to easily add fading UI transitions to KDE applications|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureDone|kdeui|Make icon naming spec compliant 3rd party icon themes like Tango or gnome-icon-theme work correctly.|jpetso@gmx.at|Jakob Petsovits}}&lt;br /&gt;
{{FeatureDone|kross|Add QtScript support|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureDone|KHTML|Support CSS3 Media Queries|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureDone|Phonon KCM|More UI feedback|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|VideoWidget snapshot function|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|better integration of pulseaudio|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|make AbstractMediaStream/StreamInterface threadsafe|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|allow backend switching on the fly|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|Phonon|add Port class for fine grained control over data flow between Phonon objects|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|Phonon|subtitle, audio track selection|kretz@kde.org|Matthias Kretz and Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Phonon|&amp;quot;low-level&amp;quot; PCM I/O with at least an ALSA implementation|kretz@kde.org|Matthias Kretz and Ian Monroe}}&lt;br /&gt;
{{FeatureTodo|Phonon|update device preference on the fly|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Goya, a framework for inserting controls into itemviews in a really easy and fast way|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Shortcut schemes for KDE applications|adymo@kdevelop.org|Alexander Dymo}}&lt;br /&gt;
{{FeatureDone|kmimetypetrader/kbuildsycoca|Replace use of profilerc for ordering applications with new mimeapps.list standard|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureInProgress|knewstuff|Support caching, and speed up the interface through use of Models/Views and goya|jeremy@scitools.com|Jeremy Whiting}}&lt;br /&gt;
{{FeatureInProgress|Phonon KCM|Handle advanced devices|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Reintroduce KDEPrint in some form, depending on what Qt4.4 delivers.|john@layt.net|john Layt}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Add CUPS Options tabs to QPrintDialog to support n-up, page borders, banner pages, page labels, mirror pages, job scheduling, and manual CUPS options.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|Add framework for standard actions for 'Send to...' for e-mail, fax, etc by printing to PDF/PS.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|Migrate FilePrinter class from Okular to enable file printing for all apps via QPrinter, modify to utilise new Qt4.4 features.  To be discussed on k-c-d first.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureInProgress|KIO|speed limits on KIO Transfers|nolis71cu@gmail.com|Manolo Valdes}}&lt;br /&gt;
{{FeatureInProgress|kdeui|Printing of shortcuts from the shortcut dialog|apaku@gmx.de|Andreas Pakulat}}&lt;br /&gt;
{{FeatureDone|Kate Part|Annotation framework for the editor|apaku@gmx.de|Andreas Pakulat}}&lt;br /&gt;
{{FeatureInProgress|KJS|Bytecode interpreter and performance improvements|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureInProgress|KHTML|Sync class and file structure with WebKit to prepare merging|porten@kde.org|Harri Porten}}&lt;br /&gt;
{{FeatureInProgress|KHTML|contentEditable/designMode implementation|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KCalenderSystem|Complete migration of Jalali, Hijri, and Hebrew calendars to new code base.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KCalenderSystem|Add new calendar systems: Indian Civil (Saka), Ethiopean, Chinese, Pure Julian, Pure Gregorian. (Note, not all may live in kdelibs or be available as a global calendar system)|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureTodo|KLocale|Implement KLocale based methods to return weekend days and day of religious observance.  Currently KCalendarSystem provides dayOfPray(), but for Gregorian this is not correct in all locales where it is used.  Currently KDatePicker hardcodes Saturday and dayOfPray() as weekend days which may not be correct in all locales.  To be discussed first on k-c-d and with kdepim.|john@layt.net|John Layt}}&lt;br /&gt;
{{FeatureDone|dnssd|Models for service browser and domain browser.|qbast@go2.pl|Jakub Stachowski}}&lt;br /&gt;
{{FeatureTodo|KHTML|Adaptable/Scriptable workarounds for broken websites.|maksim@kde.org|Maks Orlovich}}&lt;br /&gt;
{{FeatureTodo|KHTML|support for borders-* properties from the CSS3 Background and Borders Module|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KHTML|Efficient smooth scrolling|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KHTML|support for Audio/Video tags from the HTML5 draft specification|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KHTML|merge support for speculative preloading of network resources|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KHTML|CSS3 module: Web Fonts|germain@ebooksfrance.org|Germain Garand}}&lt;br /&gt;
{{FeatureTodo|KJS|Public API for extensions. Possibly analog to JavaScriptCore's C API.|porten@kde.org|Harri Porten}}&lt;br /&gt;
{{FeatureTodo|KTextEditor|Several interface extensions (e.g. open/save filter)|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureTodo|KTextEditor|Plugin for basic collaborative editing|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureInProgress|Kate Part|Scripting support for indentation and little helpers|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureTodo|Kate Part|Input modes to allow e.g. vim-like editing|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
{{FeatureDone|KIO|Implement support for inline editing in KFileItemDelegate|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureDone|KIO|Add support for drawing text shadows in KFileItemDelegate|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureTodo|Emoticons lib|An emoticons library so each applications doesn't have to implement the same things over and over again |brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureInProgress|KFile|Implement fd.o desktop-bookmark-spec for KFilePlacesModel|nf2@scheinwelt.at|Norbert Frese}}&lt;br /&gt;
{{FeatureTodo|kdeui| Support for About Data of libs and modules used by a program |kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepimlibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Akonadi|Move the Akonadi development library from kdepim.|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Item size ([[Projects/PIM/Akonadi#Core|details]])|thomas.mcguire@gmx.net|Thomas McGuire}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Payload serialization format versioning ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Item streaming in ItemSync/ResourceBase ([[Projects/PIM/Akonadi#Core|details]])|tomalbers@kde.nl|Tom Albers}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|API for additional item parts ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org,tokoe@kde.org|Volker Krause/Tobias Koenig}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Infrastructure for showing additional dialogs from agents/resources ([[Projects/PIM/Akonadi#Core|details]])|tomalbers@kde.nl|Tom Albers}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Allow to limit ItemFetchJob to current cache content ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureInProgress|Akonadi|Fix API for item/collection modifications ([[Projects/PIM/Akonadi#Core|details]])|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureTodo|Akonadi|Error reporting ([[Projects/PIM/Akonadi#Core|details]])|tokoe@kde.org|Tobias Koenig}}&lt;br /&gt;
{{FeatureTodo|gpgme++2|newly designed gpgme++ (multithreaded, exceptions, less event loop integration: better for Windows)|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Dolphin|Details-view: Allow to open folders as tree (turned off per default).|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureDone|Dolphin|Refactor view-action handling to a DolphinViewActionHandler to share more code with DolphinPart|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureDone|Konqueror|Re-implement Copy To / Move To in the popup menu|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureTodo|Konqueror|Separate konquerorrc and kfmrc (at least useful for home URL and toolbar settings)|faure@kde.org|David Faure and Emanuele Tamponi}}&lt;br /&gt;
{{FeatureDone|Dolphin|Simplify selecting of files in the single-click mode (based on http://aseigo.blogspot.com/2006/04/icons.html).|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Raptor|The KDE4-Application-Menu}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Provide optional tooltips for files and directories.|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Dolphin|Tabs|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Bring back the large tooltip like in kde3|faure@kde.org|David Faure}}&lt;br /&gt;
{{FeatureTodo|Konqueror|Session management (save/restore session/restore from crash).|edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureInProgress|Konqueror|Support for undo closed window.|edulix@gmail.com|Eduardo Robles Elvira}}&lt;br /&gt;
{{FeatureDone|Konqueror|Allow to configure the Dolphin KPart within the Konquerors settings dialog.|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Plasma|Kickoff orientation dependent layout|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureDone|kmenuedit|Restore menu system|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureDone|KCM autostart|Configure autostart desktop file|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureDone|Plasma|improve fail to launch and needs &lt;br /&gt;
config|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Solid|Refactor Solid::Control networking|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|Solid|Backend for NetworkManager 0.7|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|System Settings|Filtering/Lazy load category modules|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureInProgress|KSysGuard|Monitor process I/O|tapsell@kde.org|John Tapsell}}&lt;br /&gt;
{{FeatureInProgress|KDEPrint|Add printer applet for viewing print jobs and printer auto-configuration.|jriddell @ubuntu.com|Jonathan Riddell}}&lt;br /&gt;
{{FeatureTodo|Plasma|Mac-like menu bar plasmoid|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Add 'smart setting' of extended colors|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Add KDE3 scheme import|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|Color KCM|Query kwin for supported colors; add full set of kwin colors|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|KDEPrint|reintroduce KDEPrint Print Management tools, e.g. KCM, kprinter, kjobviewer, etc.  Depends upon progress of kdelibs side of KDEPrint and Qt4.4 feature set.|john@layt.net|john Layt}}&lt;br /&gt;
{{FeatureTodo|System Settings|Administrator mode support|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|krunner|Revamp GUI.|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|ksmserver|UI for selecting WMs|l.lunak@kde.org|Luboš Luňák}}&lt;br /&gt;
{{FeatureDone|Plasma|polish kickoff|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureDone|Plasma|toolbox improvements |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureDone|Plasma|GHNS2 plasma themes|jeremy@scitools.com|Jeremy Whiting}}&lt;br /&gt;
{{FeatureDone|Plasma|Resizable, relocatable panel|binner@kde.org|Stephan Binner}}&lt;br /&gt;
{{FeatureInProgress|Plasma|webkit widget|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|shared timer in engines|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|welcome plasmoid|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|dashboard widget support|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Plasmagik packaging|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Scriptengines|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureInProgress|Plasma|QtScript scriptengine|richmoore44@gmail.com|Richard Moore}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Filebrowser Plasmoid|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Improve QtScript support|richmoore44@gmail.com|Richard Moore}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Zooming User Interface|chanika@gmail.com|Chani Armitage}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Multiple Desktop Containments|chanika@gmail.com|Chani Armitage}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Networkmanager Plasmoid and DataEngine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureTodo|Plasma|Temperature sensing in the device engine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureTodo|Plasma|Video data in the device engine|cblauvelt@gmail.com|Christopher Blauvelt}}&lt;br /&gt;
{{FeatureTodo|Plasma|New plasma theme|nuno@oxygen-icons.org|Nuno Pinheiro}}&lt;br /&gt;
{{FeatureTodo|Plasma|physics-based animator|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|Top-level windows plasmoids|riccardo@kde.org|Riccardo Iaconelli}}&lt;br /&gt;
{{FeatureTodo|Plasma|change showConfigurationInterfaction to createConfigurationInterface|aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|Plasma::Service |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|Keyboard shortcuts |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|panel hiding |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureTodo|Plasma|panel toolbox |aseigo@kde.org|Aaron Seigo}}&lt;br /&gt;
{{FeatureInProgress|KWin|non-linear animations also for KWin|sebas@kde.org|Sebastian Kuegler}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Generic folder view applet/containment, that can also be used as the desktop background (showing the desktop folder).|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureTodo|KDM|Theme KDM (login manager) by default|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureInProgress|Nepomuk|Simple Desktop Search client based on Nepomuk search|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureInProgress|Plasma|Add a dataengine that implements galago-project Notifications DBus interface and a plasmoid which provides cute visualization of notifications along with nice and easy way to interact with them|dimsuz@gmail.com|Dmitry Suzdalev}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|nepomuk|Service that monitors file rename and delete operations and updates the metadata accordingly. kded module already exists in playground. problem: depends on inotify.|trueg@kde.org|Sebastian Trueg}}&lt;br /&gt;
{{FeatureDone|KCM emoticons|Adding/editing/removing emoticons theme|brandon.ml@gmail.com|Carlo Segato}}&lt;br /&gt;
{{FeatureInProgress|phonon-xine|snapshots in video widget|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|try to make VideoWidget work on GraphicsView|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|make states compatible to other backends|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-xine|better support for pulseaudio (most work possibly in kdelibs)|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureTodo|phonon-gstreamer|Make phonon-gstreamer as released with Qt 4.4 fully integrate into KDE and add the features added to libphonon after libphonon 4.1|kretz@kde.org|Matthias Kretz}}&lt;br /&gt;
{{FeatureInProgress|desktop ioslave|Add an ioslave that lists the contents of the desktop folder, and reports the names in the .desktop files instead of the actual file names.|fredrik@kde.org|Fredrik Höglund}}&lt;br /&gt;
{{FeatureInProgress|knotify|Add support for galago desktop notifications spec - if knotify will find a certain DBus service on session bus, it'll forward its popup notification events to this service |dimsuz@gmail.com|Dmitry Suzdalev}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KMagnifier|Add color blindness simulation|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
{{FeatureTodo|KMagnifier|Refactor color menu, re-add invert, add color-shift modes to help people with color blindness|mw_triad@users.sourceforge.net|Matthew Woehlke}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeadmin =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KSystemLog|KSystemLog, a Log Viewer Tool. Move from kde-apps|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Do some refactoring in KCron|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Improve ergonomy and general interface|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Fix all existing bugs in KCron|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureDone|KCron|Convert KCron into a KCM Module, to use it in System Settings|nicolas.ternisien@gmail.com}}&lt;br /&gt;
{{FeatureInProgress|Environment Variables|Create a environment variables KCM Module|nicolas.ternisien@gmail.com}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeartwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebindings =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|Smoke2|Move Smoke2 to kdebindings-trunk.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|PHP-Qt|Move PHP-Qt to kdebindings-trunk.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|kross|Move krossjava to kdebindings-trunk.|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureTodo|General|Wrap some more APIs (at least Akanodi for all languages and Plasma for C#)|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
{{FeatureTodo|Qyoto|Add delegate support for signal/slot connections.|kde-bindings@kde.org|KDE-bindings developers}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeedu =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Kalzium|Clean up the database. I am syncing with the BlueObelisk data repository again. There we decided to remove the density (not a element property but a compound property. I also removed the mean weight. We think it is better to provide correct data than a lot (but partly wrong) data.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Calculator Plasmoid|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureDone|KAlgebra|Vector support|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureDone|Step|A physics simulator, move from playground to kdeedu module |ks.vladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureDone|Kalzium|Update the snapshot of libavogadro to 0.6.1. This introduces a gazillion new possibilities for the 3D renderer and fixes many issues.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Make use of the new libavogadro-version.|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Marble|DGML2 Support|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|KDE-Version settings dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Port authors list from the Qt-About dialog to the KDE-About dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Qt-Version settings dialog|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Improved KML support|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|OpenStreetMap support using original OSM tiles|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Real Time Cloud-Cover|tackat@kde.org|David Roberts / Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Map Contents translation|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Copy position to clipboard|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureTodo|Marble|Create Tiles on compile time|tackat@kde.org|Torsten Rahn}}&lt;br /&gt;
{{FeatureInProgress|Marble|Mercator Projection|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureInProgress|Marble|More generic projection support|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureInProgress|Marble|Usage of Marble in non-widgets|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Export map to MxN pixel bitmap|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Support for MarbleWidget::setEnabled( bool )|inge@lysator.liu.se|Inge Wallin}}&lt;br /&gt;
{{FeatureTodo|Marble|Layer Management Class|tokoe@kde.org|Tobias König}}&lt;br /&gt;
{{FeatureTodo|Marble|Plugin architecture for map layers|tokoe@kde.org|Tobias König}}&lt;br /&gt;
{{FeatureInProgress|KEduca|Rewrite of the classic test writing/taking application|matt@milliams.com|Matt Williams}}&lt;br /&gt;
{{FeatureInProgress|Parley|Redesigned main window|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|Parley|Vocabulary Plasmoid|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureInProgress|KBruch and KPercentage|Merge in 1 app|pete@pmurdoch.com|Peter Murdoch}}&lt;br /&gt;
{{FeatureInProgress|Kalzium|Plasmoid to access Kalzium database|cniehaus@kde.org|Carsten Niehaus}}&lt;br /&gt;
{{FeatureInProgress|Step|Improve GUI for creating gas and softbody|ksvladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
{{FeatureTodo|KAlgebra|Variables share between calculations|aleixpol@gmail.com|Aleix Pol}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Export canvas as image|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Optional rulers/grid for canvas units|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add command line|piacentini@kde.org|Mauricio Piacentini}}&lt;br /&gt;
{{FeatureTodo|KTurtle|Add a color picker|nielsslot@gmail.com|Niels Slot}}&lt;br /&gt;
{{FeatureTodo|Parley|Declensions|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureTodo|Parley|Rewrite of practice|frederik.gladhorn@kdemail.net|Frederik Gladhorn}}&lt;br /&gt;
{{FeatureTodo|KLettres|Number support|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KLettres|Theme manager|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Add a Open File action|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Integrate an editor|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Plasmoid|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KHangMan|Theme manager|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|Kiten|Link radselect with kiten|jkerian@gmail.com|Joe Kerian}}&lt;br /&gt;
{{FeatureInProgress|Kiten|Sort output by dictionary/user selected sorting values|jkerian@gmail.com|Joe Kerian}}&lt;br /&gt;
{{FeatureTodo|Step|Use common constraints handling code for collisions|ksvladimir@gmail.com|Vladimir Kuznetsov}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KDiamond|New game, move to kdegames|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KDiamond|Get themes with KNewStuff|majewsky@gmx.net|Stefan Majewsky}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Better scoring system|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureDone|KNetWalk|Add support for loading new themes|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureDone|Kollision|Move to kdereview/kdegames|p.capriotti@gmail.com|Paolo Capriotti}}&lt;br /&gt;
{{FeatureDone|Kubrick|New game, 3D OpenGL - move to playground|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Polish up the features|ianw}}&lt;br /&gt;
{{FeatureDone|Kubrick|Port to Qt4 and KDE4|ianw}}&lt;br /&gt;
{{FeatureDone|KBlocks|Finish display of points and level|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Implement KNewStuff support|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Implement key/action/shortcut configuration|piacentini@kde.org}}&lt;br /&gt;
{{FeatureDone|KBlocks|Docbook|piacentini@kde.org}}&lt;br /&gt;
{{FeatureInProgress|KGoldRunner|Improved theming and animation|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KGoldRunner|Sound support and theming|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KSquares|Multiplayer support|josef}}&lt;br /&gt;
{{FeatureInProgress|KBattleship|Bring back Zeroconf support for network games|qbast@go2.pl}}&lt;br /&gt;
{{FeatureInProgress|Kubrick|New game, 3D OpenGL - in kdereview|ianw}}&lt;br /&gt;
{{FeatureInProgress|KGGZ|Add kggzcore and kggzdmod libraries|josef}}&lt;br /&gt;
{{FeatureTodo|KBlocks|Add additional themes|piacentini@kde.org}}&lt;br /&gt;
{{FeatureInProgress|KBreakout|Finish it, and move it from playground to kdegames|fela.kde@gmail.com}}&lt;br /&gt;
{{FeatureTodo|KGGZ|Add new Qt4-based core client as successor to the old KDE3-based KGGZ|josef (now SoC proposal)}}&lt;br /&gt;
{{FeatureTodo|KGGZ|Fire-and-forget highscore submission for single-player games and client-to-client multiplayer games|josef)}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Also see kdegames/kgoldrunner/TODO|ianw}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Hot new stuff support for themes and levels|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Startup screen|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KMahjongg|Reimplement the Board Editor|piacentini@kde.org}}&lt;br /&gt;
{{FeatureTodo|KMines|Add pause actions|piacentini@kde.org}}&lt;br /&gt;
{{FeatureTodo|KNetWalk|Configurable keyboard support|fela.kde@gmail.com|Fela Winkelmolen}}&lt;br /&gt;
{{FeatureTodo|KShisen|Port to KScoreDialog|piacentini@kde.org}}&lt;br /&gt;
{{FeatureTodo|Kubrick|See SVN file kubrick/TODO|ianw}}&lt;br /&gt;
{{FeatureTodo|Kubrick|Move to KDE Games for 4.1|ianw}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Gwenview|Undo system|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Gwenview|Fullscreen meta information|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Gwenview|Ability to open an image with another application|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureDone|Okular|Better Text-To-Speech integration: speech the whole document, the current page or the selection.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureDone|Okular|Encryption support for ODF generator|bradh@kde.org}}&lt;br /&gt;
{{FeatureInProgress|Okular|Backward direction for text search.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|Centralized text &amp;amp; graphics antialias configuration.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureDone|Okular|EPub backend.|elylevy@cs.huji.ac.il|Ely Levy}}&lt;br /&gt;
{{FeatureInProgress|Okular|Improved form support (add missing types, handle the fields better).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Support for tagging with Nepomuk|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureInProgress|Gwenview|Thumbnail bar in view and fullscreen modes|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Crop ratio|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|KIPI support|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Gwenview|Red eye correction|aurelien.gateau@free.fr|Aurélien Gâteau}}&lt;br /&gt;
{{FeatureTodo|Okular|JavaScript support (mostly for PDF documents).|pino@kde.org|Pino Toscano}}&lt;br /&gt;
{{FeatureInProgress|Okular|Improved placement and sizing of the presentation mode: choose the screen to use, adapt to screen size changes.|pino@kde.org|Pino Toscano}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Dragon Player|A simple Phonon-based videoplayer application|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|Make Dragon indipendent from Xine|ian.monroe@gmail.com|Ian Monroe}}&lt;br /&gt;
{{FeatureInProgress|Dragon Player|File Manager|David Edmunson}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdenetwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KGet|Group-Settings|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Torrent-Support|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Transfer-Settings|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Webinterface|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|Kopete|AIM offline messages|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureDone|Kopete|OTR Encryption support|michael_zanetti@gmx.net|Michael Zanetti}}&lt;br /&gt;
{{FeatureDone|Kopete|Status manager|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureInProgress|KGet|MultiSource-Downloading|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Bring back chat style and emoticon selection via knewstuff2|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
{{FeatureInProgress|Kopete|ICQ 6 status icons|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureInProgress|Kopete|MSNP15 implementation for MSN|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Non-intrusive notification system|kedgedev@centrum.cz|Roman Jarosz}}&lt;br /&gt;
{{FeatureInProgress|Kopete|UPnp Support|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Updated contact list interface (uses Qt 4 rather than Qt 3)|mattr@kde.org|Matt Rogers}}&lt;br /&gt;
{{FeatureTodo|Kopete|Update Kopete to better support Decibel|kopete-devel@kde.org|Kopete Developers}}&lt;br /&gt;
{{FeatureInProgress|KGet|Nepomuk-Integration|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureInProgress|KGet|Support mms://-protocol, see https://launchpad.net/libmms|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Global Speedlimits|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Setup libbtcore from KTorrent in KGet (to avoid dependency to extragear)|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureInProgress|KGet|Extend the TransferHistory to use SQLite and XML-Backends and display the information inside a kcategorizedview|jgoday@gmail.com|Javier Goday}}&lt;br /&gt;
{{FeatureTodo|Kopete|GroupWise chatroom support|wstephenson@kde.org|Will Stephenson}}&lt;br /&gt;
{{FeatureTodo|[http://decibel.kde.org Decibel]|Decibel, a framework for real time communication services. Move from playground/pim|info@basyskom.de|Tobias Hunger}}&lt;br /&gt;
{{FeatureDone|KRDC|Optional system tray icon (with quick access to bookmarks)|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Improved behavior of entering special keys for better workflow|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Zeroconf support (detecting remote desktop services in local network)|romnes@stud.ntnu.no|Magnus Romnes}}&lt;br /&gt;
{{FeatureInProgress|KRDC|Bookmark dock widget for quick access to bookmars, zero conf detected services and recently used connections|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
{{FeatureDone|KRDC|Support for up- and downscaling VNC remote desktop|uwolfer@kde.org|Urs Wolfer}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepim =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|KAddressbook|Ability to add LDAP search results to distribution lists|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|Indication of which resource folder a contact belongs to|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|Read-only view for contacts in read-only folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KAddressbook|copy/cut/paste context menu items|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to create hyperlinks in HTML messages|steveire@gmail.com|Stephen Kelly}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to easily create todos with reminders from emails|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Ability to open messages from search results when the reader is hidden|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better invitation update emails showing what changed|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better reminder visualization in very small events|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Better, natural language search criteria names|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Clickable status columns|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Client side configurability of warnings in shared folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Colored ribbons for indication of signing and encryption status in the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Configuration option for whether invitation emails are automatically deleted or not when having been acted upon|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Copy/paste and drag and drop from/to the mail composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Decryption on demand in reader window|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Display of quota information in foldertree tooltips|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop and copy and paste support in the search result viewer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop from the mail reader window and mime-tree viewer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Drag and drop of folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Editing of attachments from the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Export and import of filters|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Favorites Folder|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Folder quicksearch|m.koller@surfeu.at|Martin Koller}}&lt;br /&gt;
{{FeatureDone|KMail|Harmonization of actions in main and standalone mail reader windows|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|IMAP Server storage of non-standard flags|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Improved TNEF attachment handling|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Improved quota warnings|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Initialize full search from quicksearch on request|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Override font and fontsize for standalone message viewers|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Per-folder identity configurability|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Recursive IMAP cache troubleshooting|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Resizable recipients area in composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for creating new mails based on received mails (Resend)|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for immediate sync of resource folders|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Support for soft line breaking|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Tab navigation through groups in the address completion|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Text snippets with shortcuts and variable expansion in the composer|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|Warning about active out-of-office scripts|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KMail|lost+found recovery of locally changed folders that lose access rights|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KNotes|Ability to print notes|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Ability to have both distribution lists and addresbook extension visible|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Aggregated reminders view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Better default resource colors|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Drag and drop of attachments|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Faster initial loading of kolab resources|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Forwarding and delegation of invitations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Improved coloring of agenda view items|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Improved event printing|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Merge of the attachment view in into the main page|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Merge of the free-busy and attendee views for easier scheduling|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Month view scrolling, paging, mouse-wheeling|tom_t@gmx.at|Thomas Thrainer}}&lt;br /&gt;
{{FeatureDone|KOrganizer|More readable Kolab resource folder labels|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Redesigned incidence editor UI|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Side-by-side calendar view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Support for by-value attachments|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Timeline calendar view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kleopatra|Ability to search in internal and external certificates at the same time|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kleopatra|General UI Server|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureDone|Kleopatra|New, tabbed, mainwindow design|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureDone|KonsoleKalendar|Support &amp;quot;file&amp;quot; and &amp;quot;localdir&amp;quot; resources|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureDone|Kontact|Config option to close despite system tray|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Harmonization of component naming in sidebar, configuration, summary view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Right-aligned component navigation toolbar|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|Kontact|Ubiquitous sync actions|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Column-specific whatsthis-help| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Combined search and add task widget| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Drag&amp;amp;Drop| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|File management (file-&amp;gt;load)| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Managing history| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Tracking tasks by active applications| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|[http://wiki.kde.org/ktimetracker ktimetracker]|Whatsthis-help dependant on if a task has been created| |Thorsten St&amp;amp;auml;rk}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Rich text incidence editor|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureInProgress|KMail|HTML  Signatures|yez@familieschepers.nl|Edwin Schepers}}&lt;br /&gt;
{{FeatureInProgress|KPilot|Finish Keyring conduit, base conduit code and test cases, category syncing|jkasper@kde.org|Jason 'vanRijn' Kasper}}&lt;br /&gt;
{{FeatureInProgress|Kleopatra|OpenPGP support|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureInProgress|KNotes|Zeroconf support for sending notes on LAN|qbast@go2.pl|Jakub Stachowski}}&lt;br /&gt;
{{FeatureInProgress|Kontact|New Planner summary; combines Appointment+To-do+SpecialDates into 1 pretty summary|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureTodo|KAlarm|New option to specify reminder times in minutes|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Prevent multiple identical error messages accumulating for the same alarm|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Remember main window show/hide options used when KAlarm closed instead of setting them in Preferences dialog|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Remove alarm daemon and do all scheduling in kalarm itself|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Replace simple repetitions by recurrence sub-repetitions to reduce confusion|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Simplification and improvements to alarm edit dialog|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureTodo|KMail|Aggregated attachment view in the mail header area of the reader window|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KMail|Improved error messages and audit log for cryptographic operations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Ability to jump to the right day in the agenda from invitation mails|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Drag and drop in the free-busy view|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Support for comments in replies to invitations|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Support for extended free-busy lists|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|KPilot|Port old conduits to new base conduit architecture and KDE4/Qt4|jkasper@kde.org|Jason 'vanRijn' Kasper}}&lt;br /&gt;
{{FeatureTodo|Kleopatra|Konqueror and Dolphin Kleopatra plugins|marc@kdab.net|Marc Mutz (Gpg4win)}}&lt;br /&gt;
{{FeatureTodo|Kontact|Support for Kontact wide profiles|kdepim@kdab.net|Kolab Konsortium}}&lt;br /&gt;
{{FeatureTodo|[http://kblogger.pwsp.net KBlogger]|KBlogger, a blogging application| christian_weilbach@.web.de|Christian Weilbach}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Blog-styled journal view|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureTodo|KOrganizer|Blogging KResource|mike@mikearthur.co.uk|Mike Arthur}}&lt;br /&gt;
{{FeatureInProgress|KOrganizer|New To-do View (model/view)|tom_t@gmx.at|Thomas Thrainer}}&lt;br /&gt;
{{FeatureInProgress|KOrganizer|New Month View (qgraphicsitem)|bvirlet@kdemail.net|Bruno Virlet}}&lt;br /&gt;
{{FeatureDone|KOrganizer|Hide/Show reminder daemon icon in the systeay|winter@kde.org|Allen Winter}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdesdk =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Cervisia|New context menu entry &amp;quot;Add to Ignore List&amp;quot;|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
{{FeatureDone|Lokalize|Move this application (formerly known as Kaider) from extragear|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Cervisia|A file view based on KDirModel|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
{{FeatureInProgress|Lokalize|various Translation Memory enhancements|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|Lokalize|XLIFF support|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureInProgress|KBugBuster|Make it work|fabiolocati@gmail.com|Fabio Locati}}&lt;br /&gt;
{{FeatureInProgress|KCachegrind|Everything working again|josef.weidendorfer@gmx.de|Josef Weidendorfer}}&lt;br /&gt;
{{FeatureInProgress|Kate|Session plasmoid|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Make a GUI for it - in playground/devtools|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a PyQt4 template|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a Ruby template|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureInProgress|KAppTemplate|Add a Plasmoid template|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KAppTemplate|Add DBUS support in templates|annma@kde.org|Anne-Marie Mahfouf}}&lt;br /&gt;
{{FeatureTodo|KCachegrind|Better handling of huge symbols|josef.weidendorfer@gmx.de|Josef Weidendorfer}}&lt;br /&gt;
{{FeatureTodo|Lokalize|Kross-based scripting|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|Lokalize|QA: glossary checklists|shafff-at-ukr.net|Nick Shaforostoff}}&lt;br /&gt;
{{FeatureTodo|kioslave svn|Add Export/Import feature|montel@kde.org|Laurent Montel}}&lt;br /&gt;
{{FeatureTodo|Kate App|Improved session management|kwrite-devel@kde.org|Kate Developers}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdetoys =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeutils =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Okteta|bytelevel editor (successor to KHexEdit). Move from playground/utils.|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|make printing support only selection|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|ask artists for own icon|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for memory mapping of files|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add &amp;quot;Export as&amp;quot;|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|enable extract-strings tool and add copy|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|more explicit titels for undo/redo actions, also from filters|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|parameter dialog for &amp;quot;Copy as...&amp;quot;|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add support for blocking processes like printing, string search or filter|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureTodo|Okteta|add Kate-like search tool|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
{{FeatureInProgress|KDiskFree|Use Solid API|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
{{FeatureTodo|KwikDisk|Replace it by a Plasmoid (in the desktop bar and on the desktop|nicolas.ternisien@gmail.com|Nicolas Ternisien}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevelop =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevplatform =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdewebdev =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Kommander|Port the executor to KDE4.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureTodo|Kommander|Create Qt Designer plugins for the editor.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Create an upload plugin.| niko.sams@gmail.com|Niko Sams}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Create a new, state machine based parser.| amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|Quanta Plus|Port existing functionality to KDevPlatform plugins. Only text mode is targeted.|amantia@kde.org|Andras Mantia}}&lt;br /&gt;
{{FeatureInProgress|KXslDbg|Port to KDE4.|keith@kdewebdev.org  | &lt;br /&gt;
Keith Isdale}}&lt;br /&gt;
{{FeatureTodo|KLinkStatus|Aided correction of broken links||}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Site check automation|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureInProgress|KLinkStatus|D-Bus/Scripting interfaces|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureInProgress|KLinkStatus|HTML validation|thesquib@gmail.com|Sam Ryan}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Ability to export only broken links|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Ability to do background search which only update the GUI when finished (much faster))|moura@kdewebdev.org|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Tray Icon and KUniqueApplication|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Scripting Plugin|Paulo Moura Guedes}}&lt;br /&gt;
{{FeatureDone|KLinkStatus|Get Hot New Stuff for HTML result stylesheets|Paulo Moura Guedes}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/Saving_and_loading</id>
		<title>Talk:Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/Saving_and_loading"/>
				<updated>2008-04-14T14:02:59Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Solution for &amp;quot;undefined reference to `vtable for MainWindow'&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Compiling failed due to 'undefined reference to vtable ...' ==&lt;br /&gt;
When compiling, cmake failed during the linking process. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
undefined reference to `vtable for MainWindow'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I received this error, after making one tiny mistake: I named my headerfile&lt;br /&gt;
&amp;lt;code&amp;gt;mainwindow.hpp&amp;lt;/code&amp;gt;&lt;br /&gt;
instead of&lt;br /&gt;
&amp;lt;code&amp;gt;mainwindow.h&amp;lt;/code&amp;gt;&lt;br /&gt;
Once renamed, everything should work fine. &lt;br /&gt;
&lt;br /&gt;
Tiny hint: if you quickly want to copy the source displayed in this tutorial, but are as annoyed as I am about the line numbering which is copied as well, use the edit function of this site to access the (barebone) sourcecode.&lt;br /&gt;
: I just tested this with Konq, Firefox and Opera and none of them copied the line numbering. What browser are you using? --[[User:Milliams|milliams]] 15:00, 22 March 2008 (CET)&lt;br /&gt;
&lt;br /&gt;
== Solution for &amp;quot;undefined reference to `vtable for MainWindow'&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
When I tried to compile the code, I got the same error:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;undefined reference to `vtable for MainWindow'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is because you have to change CMakeLists.txt in order to generate .moc files. Just add this line: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;qt4_automoc(${tutorial4_SRCS})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you also have to add this line at the bottom of mainwindow.cpp:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;mainwindow.moc&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This fixed the problem for me. Please try this and post your results so I can correct the tutorial.&lt;br /&gt;
&lt;br /&gt;
: You shouldn't need to use &amp;lt;tt&amp;gt;qt4_automoc()&amp;lt;/tt&amp;gt; at all. With the code copied verbatim from the tutorial it builds just fine. The &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; does all that magic itself. According to Thiago, &amp;quot;If kde4automoc [&amp;lt;em&amp;gt;which is called by kde4_add_executable() I believe&amp;lt;/em&amp;gt;] finds a header with Q_OBJECT whose .moc isn't included anywhere, it'll include that from a .cpp&amp;quot; --[[User:Milliams|milliams]] 16:02, 14 April 2008 (CEST)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Games/Highscores</id>
		<title>Development/Tutorials/Games/Highscores</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Games/Highscores"/>
				<updated>2008-04-12T22:32:40Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Correct include path&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KDE Games|&lt;br /&gt;
&lt;br /&gt;
name=High Scores|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Programming_Tutorial_KDE_4|Introduction to KDE4 programming]], [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction Tutorial]]|&lt;br /&gt;
&lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KScoreDialog}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will explain how to use the high score system built into kdegames in your application.&lt;br /&gt;
&lt;br /&gt;
[[image:Highscore.png|center|thumb|Dialog in KMines]]&lt;br /&gt;
&lt;br /&gt;
==KScoreDialog==&lt;br /&gt;
The high score system is provided through the KScoreDialog class. It is intended to be a lightweight solution and offers the following abilities:&lt;br /&gt;
#Grouping of scores (for different difficulty levels etc.)&lt;br /&gt;
#Standard fields: Name, Level, Date, Time, Score&lt;br /&gt;
#Custom fields (e.g. number of moves)&lt;br /&gt;
&lt;br /&gt;
==Displaying Scores==&lt;br /&gt;
To display the high score table, it's as simple as two lines of code. &lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void showHighscores()&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will display the highscore table showing, by default, the 'Name' and 'Score' columns.&lt;br /&gt;
&lt;br /&gt;
In order to comply with the kdegames standards, you should use a {{class|KStandardGameAction}} to launch this function. This will set up the icons and toolbars correctly. See the [[Development/Tutorials/Games/KStandardGameAction|KStandardGameAction tutorial]] for more information on this.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KStandardGameAction&amp;gt;&lt;br /&gt;
void setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KStandardGameAction::highscores(this, &lt;br /&gt;
                       SLOT(showHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adding Scores==&lt;br /&gt;
===Simplest way to add a score===&lt;br /&gt;
The simplest way to add a new score to the table is as follows:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This will add the score &amp;lt;tt&amp;gt;playersScore&amp;lt;/tt&amp;gt; to the high score table and then launch the dialog. If it is the first score to be entered on the table, a blank line-edit will be provided for the player to enter their name, otherwise the line-edit will still be provided but the player's name will be automatically filled in.&lt;br /&gt;
&lt;br /&gt;
However, you will notice that the dialog is shown every time, even if the player didn't manage to get onto the table. If you only want to show the table if the player achieved a high score, place an &amp;lt;tt&amp;gt;if()&amp;lt;/tt&amp;gt; command around the &amp;lt;tt&amp;gt;KScoreDialog::addScore()&amp;lt;/tt&amp;gt; call:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
if(ksdialog.addScore(playersScore))&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Passing name by code===&lt;br /&gt;
If you want to suggest a name programatically you can do so by using the &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; type. It's easy to use, for example:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in this same way you can display other default fields by passing them to the &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; constructor and adding the information to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt;. For example, to display the level the player got to:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int level)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name |&lt;br /&gt;
                        KScoreDialog::Level, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = name;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(score);&lt;br /&gt;
  scoreInfo[KScoreDialog::Level].setNum(level);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Custom fields===&lt;br /&gt;
Since there are only a set number of standatd fields it is possible to add you own custom fields. For example you may want to put the number of moves the player made on the table. This is done through the &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int score, const QString&amp;amp; name, int numMoves)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Name] = &amp;quot;Matt&amp;quot;;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(playersScore);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addField(KScoreDialog::Custom1, &lt;br /&gt;
                    i18n(&amp;quot;Num of Moves&amp;quot;), &amp;quot;moves&amp;quot;);&lt;br /&gt;
  scoreInfo[KScoreDialog::Custom1].setNum(numMoves);&lt;br /&gt;
  &lt;br /&gt;
  ksdialog.addScore(scoreInfo);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument to &amp;lt;tt&amp;gt;KScoreDialog::addField()&amp;lt;/tt&amp;gt; must be from &amp;lt;tt&amp;gt;KScoreDialog::Custom1&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;KScoreDialog::Custom5&amp;lt;/tt&amp;gt;, the second is the text that will appear on the high score table at the head of the column (and must therefore be i18n'd) and the last argument is a unique identifier for the field. After that, it is added to your &amp;lt;tt&amp;gt;KScoreDialog::FieldInfo&amp;lt;/tt&amp;gt; in the same way as before.&lt;br /&gt;
&lt;br /&gt;
==Grouping Scores==&lt;br /&gt;
Your game may have different levels of difficulty and so you don't want to put the scores for the 'Hard' level on the same table as the 'Easy' table. Grouping scores is easy to achieve using the &amp;lt;tt&amp;gt;KScoreDialog::setConfigGroup()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void newHighscore(int playersScore, const QString&amp;amp; difficulty)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name, this);&lt;br /&gt;
  ksdialog.setConfigGroup(difficulty);&lt;br /&gt;
  ksdialog.addScore(playersScore);&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Each group will show up as a tab on the high score table dialog. If you don't specify a group, the score will be added to the generic 'High Score' tab.&lt;br /&gt;
&lt;br /&gt;
==Advanced Features==&lt;br /&gt;
===Hiding Fields===&lt;br /&gt;
In some special cases you won't want to display a score as such but rather just the time the player took to complete the level.&lt;br /&gt;
&lt;br /&gt;
While you're not going to display the 'Score' field in your table you must always submit a value to 'Score' field since it is used for sorting the scores. In fact, the 'Score' field is always present in a &amp;lt;tt&amp;gt;KScoreDialog&amp;lt;/tt&amp;gt; object even if you didn't pass it to the constructor. However, ity is possible to hide the 'Score' field (and in fact any field) from display using the &amp;lt;tt&amp;gt;KScoreDialog::hideField()&amp;lt;/tt&amp;gt; function. It takes a Field flag from the same set that the constructor takes.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KScoreDialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// timeString is a nicely formatted string&lt;br /&gt;
// e.g. &amp;quot;1:24&amp;quot; used for display&lt;br /&gt;
void newHighscore(const QString&amp;amp; timeString, int seconds)&lt;br /&gt;
{&lt;br /&gt;
  KScoreDialog ksdialog(KScoreDialog::Name | &lt;br /&gt;
                        KScoreDialog::Time, this);&lt;br /&gt;
  &lt;br /&gt;
  KScoreDialog::FieldInfo scoreInfo;&lt;br /&gt;
  scoreInfo[KScoreDialog::Time] = timeString;&lt;br /&gt;
  scoreInfo[KScoreDialog::Score].setNum(seconds);&lt;br /&gt;
  ksdialog.hideField(KScoreDialog::Score);&lt;br /&gt;
  ksdialog.addScore(scoreInfo, KScoreDialog::LessIsMore)&lt;br /&gt;
  ksdialog.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Games/KStandardGameAction</id>
		<title>Development/Tutorials/Games/KStandardGameAction</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Games/KStandardGameAction"/>
				<updated>2008-04-12T22:31:51Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Usage */ Correct include path&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=KDE Games|&lt;br /&gt;
&lt;br /&gt;
name=KStandardGameAction|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Programming_Tutorial_KDE_4|Introduction to KDE4 programming]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Games/Highscores|High Scores Tutorial]]|&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reading={{class|KStandardGameAction}}, {{class|KStandardAction}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial will explain the usage of &amp;lt;tt&amp;gt;KStandardGameAction&amp;lt;/tt&amp;gt;s in libkdegames.&lt;br /&gt;
&lt;br /&gt;
== KStandardGameAction ==&lt;br /&gt;
This class is an extension to the usual &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; class which provides easy access to often used KDE actions.&lt;br /&gt;
&lt;br /&gt;
Using these actions helps maintaining consistency among the games.&lt;br /&gt;
&lt;br /&gt;
Games often use different menu entries than other programs, e.g. games use&lt;br /&gt;
the menu &amp;quot;game&amp;quot; instead of &amp;quot;file&amp;quot;. This class provides the entries which&lt;br /&gt;
differ from the usual KStandardAction entries.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Add some code like this to your action setup code.&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KDE/KStandardGameAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setupActions()&lt;br /&gt;
{&lt;br /&gt;
  // Game&lt;br /&gt;
  KStandardGameAction::gameNew(this, &lt;br /&gt;
                       SLOT(newGame()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::highscores(this, &lt;br /&gt;
                       SLOT(showHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::quit(this, &lt;br /&gt;
                       SLOT(close()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
&lt;br /&gt;
  // Move&lt;br /&gt;
  KStandardGameAction::undo(this, &lt;br /&gt;
                       SLOT(undoMove()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  KStandardGameAction::redo(this, &lt;br /&gt;
                       SLOT(redoMove()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
&lt;br /&gt;
  // Settings&lt;br /&gt;
  KStandardGameAction::configureHighscores(this, &lt;br /&gt;
                       SLOT(configureHighscores()), &lt;br /&gt;
                       actionCollection());&lt;br /&gt;
  &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program</id>
		<title>Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program"/>
				<updated>2008-03-22T14:02:23Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* The Code */ Add bracket&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Hello World|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4|KDE4 development environment]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
Your first program shall greet the world with a friendly &amp;quot;Hello World&amp;quot;, what else? For that, we will use a {{class|KMessageBox}} and customise one of the buttons.&lt;br /&gt;
[[image:introtokdetutorial1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
{{tip|To get more information about any class you come across, Konqueror offers a quick shortcut. So to look for information about KMessageBox, just type &amp;quot;kde:kmessagebox&amp;quot; into Konqueror and you'll be taken to the documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You might want to use KDevelop for your projects, which does many nice things like code completion, easy access to API documentation or debugging support.&lt;br /&gt;
&lt;br /&gt;
Read [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this tutorial]] to set up KDevelop correctly for this task. You probably want to check if the setup is working by testing opening an existing KDE 4 application with KDevelop first.&lt;br /&gt;
&lt;br /&gt;
You still need to edit the CMake files by hand though.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
All the code we need will be in one file, &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;. Create that file with the code below:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    KAboutData aboutData(&lt;br /&gt;
                         // The program name used internally.&lt;br /&gt;
                         &amp;quot;tutorial1&amp;quot;,&lt;br /&gt;
                         // The message catalog name&lt;br /&gt;
                         // If null, program name is used instead.&lt;br /&gt;
                         0,&lt;br /&gt;
                         // A displayable program name string.&lt;br /&gt;
                         ki18n(&amp;quot;Tutorial 1&amp;quot;),&lt;br /&gt;
                         // The program version string.&lt;br /&gt;
                         &amp;quot;1.0&amp;quot;,&lt;br /&gt;
                         // Short description of what the app does.&lt;br /&gt;
                         ki18n(&amp;quot;Displays a KMessageBox popup&amp;quot;),&lt;br /&gt;
                         // The license this code is released under&lt;br /&gt;
                         KAboutData::License_GPL,&lt;br /&gt;
                         // Copyright Statement&lt;br /&gt;
                         ki18n(&amp;quot;(c) 2007&amp;quot;),&lt;br /&gt;
                         // Optional text shown in the About box.&lt;br /&gt;
                         // Can contain any information desired.&lt;br /&gt;
                         ki18n(&amp;quot;Some text...&amp;quot;),&lt;br /&gt;
                         // The program homepage string.&lt;br /&gt;
                         &amp;quot;http://tutorial.com&amp;quot;,&lt;br /&gt;
                         // The bug report email address&lt;br /&gt;
                         &amp;quot;submit@bugs.kde.org&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
    KApplication app;&lt;br /&gt;
    KGuiItem yesButton( i18n( &amp;quot;Hello&amp;quot; ), QString(),&lt;br /&gt;
                        i18n( &amp;quot;This is a tooltip&amp;quot; ),&lt;br /&gt;
                        i18n( &amp;quot;This is a WhatsThis help text.&amp;quot; ) );&lt;br /&gt;
    KMessageBox::questionYesNo( 0, i18n( &amp;quot;Hello World&amp;quot; ),&lt;br /&gt;
                                i18n( &amp;quot;Hello&amp;quot; ), yesButton );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first KDE specific code we come across in this program is {{class|KAboutData}}. This is the class used to store information about the program such as a short description, authors or license information. Pretty much every KDE application should use this class.&lt;br /&gt;
&lt;br /&gt;
Then we come to {{class|KCmdLineArgs}}. This is the class one would use to specify command line switches to, for example, open the program with a specific file. However, in this tutorial, we simply initialise it with the {{class|KAboutData}} object we created so we can use the &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; switches.&lt;br /&gt;
&lt;br /&gt;
Then we create a {{class|KApplication}} object. This needs to be done exactly once in each program since it is needed for things such as [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Now we've done all the necessary KDE setup, we can move on to doing interesting things with our application. We're going to create a popup box but we're going to customise one of the buttons. To do this customisation, we need to use a {{class|KGuiItem}} object. The first argument in the {{class|KGuiItem}} constructor is the text that will appear on the item (in our case, a button). Then we have an option of setting an icon for the button but we don't want one so we just give it &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;. We then set the tooltip (what appears when you hover over an item) and finally the &amp;quot;What's This?&amp;quot; (accessed through right-clicking or Shift-F1) text.&lt;br /&gt;
&lt;br /&gt;
Now we have our item, we can create our popup. We call the &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt; function which, by default, creates a message box with a &amp;quot;Yes&amp;quot; and a &amp;quot;No&amp;quot; button. The second argument is the text that will appear in the message box above the buttons. The third is the caption the window will have and finally we set the KGuiItem for (what would normally be) the &amp;quot;Yes&amp;quot; button to the &amp;lt;tt&amp;gt;KGuiItem guiItem&amp;lt;/tt&amp;gt; we created.&lt;br /&gt;
&lt;br /&gt;
Note that all user-visible text is passed through the i18n() function; this is necessary for the UI to be translatable. More information on localization can be found in the [[Development/Tutorials/Localization/i18n|localization tutorial]].&lt;br /&gt;
&lt;br /&gt;
We're all done as far as the code is concerned. Now to build it and try it out.&lt;br /&gt;
&lt;br /&gt;
==Build==&lt;br /&gt;
If you set up your environment as described in [[Getting Started/Build/KDE4]], you can compile this code with&lt;br /&gt;
 &lt;br /&gt;
 g++ main.cpp -o tutorial1 \&lt;br /&gt;
 -I$QTDIR/include/Qt \&lt;br /&gt;
 -I$QTDIR/include/QtCore \&lt;br /&gt;
 -I$QTDIR/include \&lt;br /&gt;
 -I$KDEDIR/include/KDE \&lt;br /&gt;
 -I$KDEDIR/include \&lt;br /&gt;
 -L$KDEDIR/lib \&lt;br /&gt;
 -L$QTDIR/lib -lQtCore -lQtGui -lkdeui -lkdecore&lt;br /&gt;
and then run it with &lt;br /&gt;
 dbus-launch ./tutorial1&lt;br /&gt;
&lt;br /&gt;
on some platforms the libraries might have to be linked with -lQtCore4 and -lQtGui4.&lt;br /&gt;
&lt;br /&gt;
===Using CMake===&lt;br /&gt;
If that worked, you may want to use [[Development/Tutorials/CMake|CMake]], just like the rest of KDE. This will automatically locate the libraries and headers for KDE, Qt etc. and will allow you to easily build your applications on other computers.&lt;br /&gt;
====CMakeLists.txt====&lt;br /&gt;
Create a file named CMakeLists.txt in the same directory as main.cpp with this content:&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function locates the package that you ask it for (in this case KDE4) and sets some variables describing the location of the package's headers and libraries. In this case we will use the &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt; variable which contains the path to the KDE4 header files.&lt;br /&gt;
&lt;br /&gt;
In order to allow the compiler to find these files, we pass that variable to the &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; function which adds the KDE4 headers to the header search path.&lt;br /&gt;
&lt;br /&gt;
Next we create a variable called &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; using the &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt; function. In this case we simply set it to the name of our only source file.&lt;br /&gt;
&lt;br /&gt;
Then we use &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; to create an executable called &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; from the source files listed in our &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; variable. Finally we link our executable to the KDE4 kdeui library using &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt; variable which was set by the &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
====Make And Run====&lt;br /&gt;
Again, if you set up your environment as described in [[Getting_Started/Build/KDE4|Getting Started/Build/KDE4]], you can compile this code with:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
Or if you did not:&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake ..&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
And launch it with:&lt;br /&gt;
 ./tutorial1&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KXmlGuiWindow|using KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/Saving_and_loading</id>
		<title>Talk:Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/Saving_and_loading"/>
				<updated>2008-03-22T14:00:28Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Compiling failed due to 'undefined reference to vtable ...' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Compiling failed due to 'undefined reference to vtable ...' ==&lt;br /&gt;
When compiling, cmake failed during the linking process. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
undefined reference to `vtable for MainWindow'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I received this error, after making one tiny mistake: I named my headerfile&lt;br /&gt;
&amp;lt;code&amp;gt;mainwindow.hpp&amp;lt;/code&amp;gt;&lt;br /&gt;
instead of&lt;br /&gt;
&amp;lt;code&amp;gt;mainwindow.h&amp;lt;/code&amp;gt;&lt;br /&gt;
Once renamed, everything should work fine. &lt;br /&gt;
&lt;br /&gt;
Tiny hint: if you quickly want to copy the source displayed in this tutorial, but are as annoyed as I am about the line numbering which is copied as well, use the edit function of this site to access the (barebone) sourcecode.&lt;br /&gt;
: I just tested this with Konq, Firefox and Opera and none of them copied the line numbering. What browser are you using? --[[User:Milliams|milliams]] 15:00, 22 March 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan</id>
		<title>Schedules/KDE4/4.1 Feature Plan</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Schedules/KDE4/4.1_Feature_Plan"/>
				<updated>2008-02-02T22:09:56Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* kdeedu */ KEduca&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Instructions =&lt;br /&gt;
&lt;br /&gt;
Deadline for adding entries here for the 4.1 release is '''31 March 2008'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Entries added after that date will be scheduled for the 4.2 release.&lt;br /&gt;
&lt;br /&gt;
todo =&amp;gt; not started yet&amp;lt;br&amp;gt;&lt;br /&gt;
in-progress =&amp;gt; started, but not completed yet&amp;lt;br&amp;gt;&lt;br /&gt;
done =&amp;gt; completed&lt;br /&gt;
&lt;br /&gt;
= kdelibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|kdeui|Goya, a framework for inserting controls into itemviews in a really easy and fast way|ereslibre@kde.org|Rafael Fernández López}}&lt;br /&gt;
{{FeatureDone|kross|Add QtScript support|mail@dipe.org|Sebastian Sauer}}&lt;br /&gt;
{{FeatureInProgress|knewstuff|Support caching, and speed up the interface through use of Models/Views and goya|jeremy@scitools.com|Jeremy Whiting}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepimlibs =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|Akonadi|Move the Akonadi development library from kdepim.|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-apps =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|Dolphin|simplify selecting of files in the single-click mode (based on http://aseigo.blogspot.com/2006/04/icons.html)|peter.penz@gmx.at|Peter Penz}}&lt;br /&gt;
  &lt;br /&gt;
{{FeatureInProgress|Raptor|The KDE4-Application-Menu}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-workspace =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebase-runtime =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeaccessibility =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeadmin =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureInProgress|KSystemLog|KSystemLog, a Log Viewer Tool. Move from kde-apps|nicolas.ternisien@gmail.com}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeartwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdebindings =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeedu =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|KBruch and KPercentage|Merge in 1 app|annma@kde.org}}&lt;br /&gt;
{{FeatureTodo|Step|A physics simulator, move from playground to kdeedu module|ks.vladimir@gmail.com}}&lt;br /&gt;
{{FeatureInProgress|KEduca|Rewrite of the classic test writing/taking application|matt@milliams.com|Matt Williams}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegames =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Startup screen|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Sound support and theming|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureTodo|KGoldRunner|Hot new stuff support for themes and levels|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KGoldRunner|Improved theming and animation|mikelima@cirulla.net}}&lt;br /&gt;
{{FeatureInProgress|KBlocks|Finish display of points and level (waiting for Qt4.4 with WidgetsOnCanvas to land in qt-copy) and move to kdereview/kdegames|piacentini@kde.org}}&lt;br /&gt;
{{FeatureTodo|KNetWalk|Better scoring system|fela.kde@gmail.com}}&lt;br /&gt;
{{FeatureTodo|KNetWalk|New graphic system|fela.kde@gmail.com}}&lt;br /&gt;
{{FeatureTodo|KNetWalk|Add support for loading new themes|fela.kde@gmail.com}}&lt;br /&gt;
{{FeatureTodo|KBreakout|Finish it, and move it from playground to kdegames|fela.kde@gmail.com}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdegraphics =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdemultimedia =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Dragon Player|A simple Phonon-based videoplayer application|ian.monroe@gmail.com}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdenetwork =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|KGet|MultiSource-Downloading|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureInProgress|KGet|Group-Settings|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|KGet|Torrent-Support|l.appelhans@gmx.de|Lukas Appelhans}}&lt;br /&gt;
{{FeatureDone|Kopete|OTR Encryption support|michael_zanetti@gmx.net|Michael Zanetti}}&lt;br /&gt;
{{FeatureInProgress|Kopete|Bring back chat style and emoticon selection via knewstuff2|earthwings@gentoo.org|Dennis Nienhüser}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdepim =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|[http://decibel.kde.org Decibel]|Decibel, a framework for real time communication services. Move from playground/pim|info@basyskom.de|Tobias Hunger}}&lt;br /&gt;
{{FeatureTodo|[http://kblogger.pwsp.net KBlogger]|KBlogger, a blogging application| christian_weilbach@.web.de|Christian Weilbach}}&lt;br /&gt;
{{FeatureInProgress|KMail|HTML  Signatures|yez@familieschepers.nl|Edwin Schepers}}&lt;br /&gt;
{{FeatureDone|KMail|Folder quicksearch|m.koller@surfeu.at|Martin Koller}}&lt;br /&gt;
{{FeatureDone|KMail|Favorites Folder|vkrause@kde.org|Volker Krause}}&lt;br /&gt;
{{FeatureDone|KonsoleKalendar|Support &amp;quot;file&amp;quot; and &amp;quot;localdir&amp;quot; resources|winter@kde.org|Allen Winter}}&lt;br /&gt;
{{FeatureTodo|KAlarm|Remove alarm daemon and do all scheduling in kalarm itself|djarvie@kde.org|David Jarvie}}&lt;br /&gt;
{{FeatureInProgress|Kontact|New Planner summary; combines Appointment+To-do+SpecialDates into 1 pretty summary|winter@kde.org|Allen Winter}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdesdk =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureDone|Lokalize|Move this application (formerly known as Kaider) from extragear|shafff@ukr.net}}&lt;br /&gt;
{{FeatureTodo|Cervisia|A file view based on KDirModel|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
{{FeatureInProgress|Cervisia|New context menu entry &amp;quot;Add to Ignore List&amp;quot;|christian.loose@hamburg.de|Christian Loose}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdetoys =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdeutils =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
{{FeatureTodo|Okteta|bytelevel editor (successor to KHexEdit). Move from playground/utils.|kossebau@kde.org|Friedrich W. H. Kossebau}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevelop =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdevplatform =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= kdewebdev =&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border: gray solid 1px; border-collapse: collapse; text-align: left; width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background: #ececec; white-space:nowrap;&amp;quot;&lt;br /&gt;
! Status !! Project !! Description !! Contact&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2008-01-31T11:15:20Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* IRC */ Update meeting time&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Board Games|Board Games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
*[[/Card Games|Card games]]&lt;br /&gt;
&lt;br /&gt;
===See also===&lt;br /&gt;
* [http://doc.trolltech.com/4.2/qsvgrenderer.html QSvgRenderer Class Reference]&lt;br /&gt;
* [http://developer.kde.org/documentation/library/cvs-api/kdelibs-apidocs/kdecore/html/classKSvgRenderer.html KSvgRenderer Class Reference]&lt;br /&gt;
* [http://websvn.kde.org/trunk/KDE/kdegames/katomic/ KAtomic KDE4 code in websvn]&lt;br /&gt;
* [[Schedules/KDE4/4.0 Release Schedule]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : 2 February 12:00UTC]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/First_program</id>
		<title>Talk:Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/First_program"/>
				<updated>2008-01-25T19:47:21Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Build */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Adding authors to wiki pages seems counterintuitive to me. The wiki is editable by everybody. Why does it matter who the author of a tutorial is? IMHO the only thing that matters is that the tutorial is kept up to date. --[[User:Mattr|Mattr]] 03:31, 4 January 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
: I agree with Matt. I usually add a ''Initial Author:'' at the bottom for pages from the old developer wiki code, because they wrote it with often no explicit copyright information. See also [[Talk:Development/Architecture|this page]] --[[User:Dhaumann|Dhaumann]] 17:36, 4 January 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== ‘ki18n’ was not declared in this scope ==&lt;br /&gt;
&lt;br /&gt;
I don't know if this is the place to post this, but I tried to follow this tutorial and get an &amp;quot;error: ‘ki18n’ was not declared in this scope&amp;quot;, when trying to compile using the big command gcc main.cpp ...&lt;br /&gt;
&lt;br /&gt;
:Well I change a little the code so it now compiles under KDE4, it seems that the constructor of KAboutDate was changed...&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
&lt;br /&gt;
Does the g++ command work for you as described?&lt;br /&gt;
I needed to add -lQtXml, lQtSvg and lQtNetwork.&lt;br /&gt;
&lt;br /&gt;
: I'm getting a 'huge' string of error messages in the underlying include/ files, things like&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
include/KDE/../kmessagebox.h:1128: error: expected constructor, destructor, or type conversion before ‘(’ token&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
but hundreds, possibly thousands of errors apparently affecting nearly every header.&lt;br /&gt;
::I personally haven't tried the g++ method, that was added by someone else. Does linking against those libraries fix the errors? Does it work for you with the cmake method? --[[User:Milliams|milliams]] 20:47, 25 January 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Kate/KTextEditor_Plugins</id>
		<title>Development/Tutorials/Kate/KTextEditor Plugins</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Kate/KTextEditor_Plugins"/>
				<updated>2008-01-18T10:48:38Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* The resource contents file */ XML highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Kate Plugin Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Creating your first Kate Plugin|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4|KDE4 development environment]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Kate/KTextEditor_Plugins_Advanced|Add a configuration dialog for it]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]], [http://websvn.kde.org/trunk/KDE/kdelibs/kate/plugins/timedate The actual plugin code]&lt;br /&gt;
}}&lt;br /&gt;
==Abstract==&lt;br /&gt;
We are going to create a dummy plugin for Kate in this tutorial. Our plugin will be able to insert current Date &amp;amp; Time. For now, our plugin will add on the cursor position on the active document the next information:&lt;br /&gt;
&lt;br /&gt;
* MM-DD-YYYY HH:MM (something like &amp;quot;08-22-2007 23:45&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
On the next chapter we will learn how to customize this output string creating a configuration dialog for this plugin.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
=== The .desktop file ===&lt;br /&gt;
Every plugin needs a .desktop file that describes it.&lt;br /&gt;
&lt;br /&gt;
'''ktexteditor_timedate.desktop'''&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Encoding=UTF-8&lt;br /&gt;
X-KDE-Library=ktexteditor_timedate&lt;br /&gt;
X-KDE-PluginInfo-Author=Konqui the Dragon&lt;br /&gt;
X-KDE-PluginInfo-Email=konqui@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Name=ktexteditortimedate&lt;br /&gt;
X-KDE-PluginInfo-Version=0.1&lt;br /&gt;
X-KDE-PluginInfo-Website=http://kate.kde.org&lt;br /&gt;
X-KDE-PluginInfo-Category=Editor&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=false&lt;br /&gt;
X-KDE-ParentApp=kate&lt;br /&gt;
X-KDE-Version=4.0&lt;br /&gt;
ServiceTypes=KTextEditor/Plugin&lt;br /&gt;
Type=Service&lt;br /&gt;
Icon=korganizer&lt;br /&gt;
Name=Time &amp;amp; Date&lt;br /&gt;
Comment=Insert current Time &amp;amp; Date&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are important parts on this file:&lt;br /&gt;
&lt;br /&gt;
* '''X-KDE-Library''': will define the library that provides this plugin. It is _really_ important that this variable matches exactly the same with the actual name of the library being built. You will understand this better when getting to the finish of this tutorial on the part &amp;quot;Building it all, the CMakeLists.txt&amp;quot;.&lt;br /&gt;
* '''X-KDE-PluginInfo-Name''': no special characters. The name of the plugin.&lt;br /&gt;
* '''X-KDE-PluginInfo-Category''': important when the plugin selector loads it. Usually here you want always to put &amp;quot;Editor&amp;quot;.&lt;br /&gt;
* '''X-KDE-PluginInfo-Depends''': if your plugin depends on another, write here the corresponding X-KDE-PluginInfo-Name that is needed to be loaded too when loading this plugin.&lt;br /&gt;
* '''X-KDE-PluginInfo-EnabledByDefault''': whether the plugin is enabled by default. Applied when clicking on &amp;quot;Defaults&amp;quot; button on the plugin selector.&lt;br /&gt;
* '''X-KDE-ParentApp''': you want here always &amp;quot;kate&amp;quot;.&lt;br /&gt;
* '''X-KDE-Version''': KWrite/Kate does a check for only loading 4 series plugins.&lt;br /&gt;
* '''ServiceTypes''': you will always need here &amp;quot;KTextEditor/Plugin&amp;quot;.&lt;br /&gt;
* '''Type''': in order to load it properly this is needed as &amp;quot;Service&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== The resource contents file ===&lt;br /&gt;
This file is the one that will let our plugin merge with the Kate environment (toolbars and/or menubars). In this case when our plugin is loaded this file tells the KDE XML classes that it will add a separator, and that there is an action named &amp;quot;tools_insert_timedate&amp;quot;. We will need to interact with this action later.&lt;br /&gt;
&lt;br /&gt;
'''timedateui.rc'''&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui&amp;gt;&lt;br /&gt;
&amp;lt;kpartplugin name=&amp;quot;ktexteditor_timedate&amp;quot; library=&amp;quot;ktexteditor_timedate&amp;quot; version=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MenuBar&amp;gt;&lt;br /&gt;
 &amp;lt;Menu name=&amp;quot;tools&amp;quot;&amp;gt;&amp;lt;Text&amp;gt;&amp;amp;amp;Tools&amp;lt;/Text&amp;gt;&lt;br /&gt;
    &amp;lt;separator group=&amp;quot;tools_operations&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;tools_insert_timedate&amp;quot; group=&amp;quot;tools_operations&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/Menu&amp;gt;&lt;br /&gt;
&amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/kpartplugin&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The header file ===&lt;br /&gt;
'''timedate.h'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
// Avoid multiple header inclusion&lt;br /&gt;
#ifndef TIMEDATE_H&lt;br /&gt;
#define TIMEDATE_H&lt;br /&gt;
&lt;br /&gt;
// Include the basics&lt;br /&gt;
#include &amp;lt;ktexteditor/plugin.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ktexteditor/view.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kxmlguiclient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;klocalizedstring.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;QtCore/QEvent&amp;gt;&lt;br /&gt;
#include &amp;lt;QtCore/QObject&amp;gt;&lt;br /&gt;
#include &amp;lt;QtCore/QList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
  * This is the plugin class. There will be only one instance of this class.&lt;br /&gt;
  * We always want to inherit KTextEditor::Plugin here.&lt;br /&gt;
  */&lt;br /&gt;
class TimeDatePlugin&lt;br /&gt;
  : public KTextEditor::Plugin&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    // Constructor&lt;br /&gt;
    explicit TimeDatePlugin(QObject *parent,&lt;br /&gt;
                            const QVariantList &amp;amp;args);&lt;br /&gt;
    // Destructor&lt;br /&gt;
    virtual ~TimeDatePlugin();&lt;br /&gt;
&lt;br /&gt;
    // Overriden methods&lt;br /&gt;
    // This method is called when a plugin has to be added to a view. As there&lt;br /&gt;
    // is only one instance of this plugin, but it is possible for plugins to&lt;br /&gt;
    // behave in different ways in different opened views where it is loaded, in&lt;br /&gt;
    // Kate plugins are added to views. For that reason we have the plugin itself&lt;br /&gt;
    // (this class) and then the plugin view class.&lt;br /&gt;
    // In this methods we have to create/remove TimeDatePluginView classes.&lt;br /&gt;
    void addView (KTextEditor::View *view);&lt;br /&gt;
    void removeView (KTextEditor::View *view);&lt;br /&gt;
&lt;br /&gt;
    void readConfig();&lt;br /&gt;
    void writeConfig();&lt;br /&gt;
&lt;br /&gt;
  private:&lt;br /&gt;
    QList&amp;lt;class TimeDatePluginView*&amp;gt; m_views;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
  * This is the plugin view class. There can be as much instances as views exist.&lt;br /&gt;
  */&lt;br /&gt;
class TimeDatePluginView&lt;br /&gt;
   : public QObject, public KXMLGUIClient&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT&lt;br /&gt;
&lt;br /&gt;
  public:&lt;br /&gt;
    explicit TimeDatePluginView(KTextEditor::View *view = 0);&lt;br /&gt;
    ~TimeDatePluginView();&lt;br /&gt;
&lt;br /&gt;
  private Q_SLOTS:&lt;br /&gt;
    void slotInsertTimeDate();&lt;br /&gt;
&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEditor::View *m_view;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif // TIMEDATE_H&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The source file ===&lt;br /&gt;
'''timedate.cpp'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
// Own includes&lt;br /&gt;
#include &amp;quot;timedate.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Include the basics&lt;br /&gt;
#include &amp;lt;ktexteditor/document.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;kpluginfactory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kpluginloader.h&amp;gt;&lt;br /&gt;
#include &amp;lt;klocale.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kaction.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kactioncollection.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kdatetime.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// This macro defines a KPluginFactory subclass named TimeDatePluginFactory. The second&lt;br /&gt;
// argument to the macro is code that is inserted into the constructor of the class.&lt;br /&gt;
// I our case all we need to do is register one plugin. If you want to have more&lt;br /&gt;
// than one plugin in the same library then you can register multiple plugin classes&lt;br /&gt;
// here. The registerPlugin function takes an optional QString parameter which is a&lt;br /&gt;
// keyword to uniquely identify the plugin then (it maps to X-KDE-PluginKeyword in the&lt;br /&gt;
// .desktop file).&lt;br /&gt;
K_PLUGIN_FACTORY(TimeDatePluginFactory,&lt;br /&gt;
                 registerPlugin&amp;lt;TimeDatePlugin&amp;gt;();&lt;br /&gt;
                )&lt;br /&gt;
&lt;br /&gt;
// With the next macro call, the library exports version information about the&lt;br /&gt;
// Qt and KDE libraries being used and (most important) the entry symbol to get at&lt;br /&gt;
// the factory we defined above.&lt;br /&gt;
// The argument this macro takes is the constructor call of the above factory which&lt;br /&gt;
// provides two constructors. One which takes a KAboutData* and another one&lt;br /&gt;
// that takes two (optional) const char* parameters (Same as for KComponentData&lt;br /&gt;
// constructors).&lt;br /&gt;
// We put there the X-KDE-LibraryName.&lt;br /&gt;
// Is important to provide as last parameter &amp;quot;ktexteditor_plugins&amp;quot;.&lt;br /&gt;
K_EXPORT_PLUGIN(TimeDatePluginFactory(&amp;quot;ktexteditor_timedate&amp;quot;, &amp;quot;ktexteditor_plugins&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
// Constructor&lt;br /&gt;
TimeDatePlugin::TimeDatePlugin(QObject *parent, const QVariantList &amp;amp;args)&lt;br /&gt;
    : KTextEditor::Plugin(parent)&lt;br /&gt;
{&lt;br /&gt;
    // Avoid warning on compile time because of unused argument&lt;br /&gt;
    Q_UNUSED(args);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Destructor&lt;br /&gt;
TimeDatePlugin::~TimeDatePlugin()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Create the plugin view class and add it to the views list&lt;br /&gt;
void TimeDatePlugin::addView(KTextEditor::View *view)&lt;br /&gt;
{&lt;br /&gt;
    TimeDatePluginView *nview = new TimeDatePluginView(view);&lt;br /&gt;
    m_views.append(nview);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Find the view where we want to remove the plugin from, and remove it.&lt;br /&gt;
// Do not forget to free the memory.&lt;br /&gt;
void TimeDatePlugin::removeView(KTextEditor::View *view)&lt;br /&gt;
{&lt;br /&gt;
    for (int z = 0; z &amp;lt; m_views.size(); z++)&lt;br /&gt;
    {&lt;br /&gt;
        if (m_views.at(z)-&amp;gt;parentClient() == view)&lt;br /&gt;
        {&lt;br /&gt;
            TimeDatePluginView *nview = m_views.at(z);&lt;br /&gt;
            m_views.removeAll(nview);&lt;br /&gt;
            delete nview;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// We do nothing on this methods since our plugin is not configurable yet&lt;br /&gt;
void TimeDatePlugin::readConfig()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePlugin::writeConfig()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Plugin view class&lt;br /&gt;
TimeDatePluginView::TimeDatePluginView(KTextEditor::View *view)&lt;br /&gt;
  : QObject(view)&lt;br /&gt;
  , KXMLGUIClient(view)&lt;br /&gt;
  , m_view(view)&lt;br /&gt;
{&lt;br /&gt;
    setComponentData(TimeDatePluginFactory::componentData());&lt;br /&gt;
&lt;br /&gt;
    KAction *action = new KAction(i18n(&amp;quot;Insert Time &amp;amp;&amp;amp; Date&amp;quot;), this);&lt;br /&gt;
    // Here we need as first parameter the same we declared at the resource&lt;br /&gt;
    // contents file (timedateui.rc). We named the action &amp;quot;tools_insert_timedate&amp;quot;.&lt;br /&gt;
    // Here is where we connect it to an actual KDE action.&lt;br /&gt;
    actionCollection()-&amp;gt;addAction(&amp;quot;tools_insert_timedate&amp;quot;, action);&lt;br /&gt;
    action-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_D);&lt;br /&gt;
    // As usual, we connect the signal triggered() to a slot here. When the menu&lt;br /&gt;
    // element is clicked, we go to the slot slotInsertTimeDate().&lt;br /&gt;
    connect(action, SIGNAL(triggered()), this, SLOT(slotInsertTimeDate()));&lt;br /&gt;
&lt;br /&gt;
    // This is always needed, tell the KDE XML GUI client that we are using&lt;br /&gt;
    // that file for reading actions from.&lt;br /&gt;
    setXMLFile(&amp;quot;timedateui.rc&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Destructor&lt;br /&gt;
TimeDatePluginView::~TimeDatePluginView()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// The slot that will be called when the menu element &amp;quot;Insert Time &amp;amp; Date&amp;quot; is&lt;br /&gt;
// clicked.&lt;br /&gt;
void TimeDatePluginView::slotInsertTimeDate()&lt;br /&gt;
{&lt;br /&gt;
    QString localizedTimeDate = i18nc(&amp;quot;This is a localized string for default time &amp;amp; date printing on kate document.&amp;quot;&lt;br /&gt;
                                      &amp;quot;%e means day in XX format.&amp;quot;&lt;br /&gt;
                                      &amp;quot;%m means month in XX format.&amp;quot;&lt;br /&gt;
                                      &amp;quot;%Y means year in XXXX format.&amp;quot;&lt;br /&gt;
                                      &amp;quot;%H means hours in XX format.&amp;quot;&lt;br /&gt;
                                      &amp;quot;%M means minutes in XX format.&amp;quot;&lt;br /&gt;
                                      &amp;quot;Please, if in your language time or date is written in a different order, change it here&amp;quot;,&lt;br /&gt;
                                      &amp;quot;%m-%e-%Y %H:%M&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // We create a KDateTime object with the current time &amp;amp; date.&lt;br /&gt;
    KDateTime dt(QDateTime::currentDateTime());&lt;br /&gt;
    // We insert the information in the document at the current cursor position&lt;br /&gt;
    // with the default string declared on the header.&lt;br /&gt;
    m_view-&amp;gt;document()-&amp;gt;insertText(m_view-&amp;gt;cursorPosition(), dt.toString(localizedTimeDate));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// We need to include the moc file since we have declared slots and we are using&lt;br /&gt;
// the Q_OBJECT macro on the TimeDatePluginView class.&lt;br /&gt;
#include &amp;quot;timedate.moc&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building it all, the CMakeLists.txt ===&lt;br /&gt;
Finally, to put everything together you need to build everything, to tell cmake what needs to go where there is the CMakeLists.txt file.&lt;br /&gt;
&lt;br /&gt;
For more details on CMake please read [[Development/Tutorials/CMake]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
# We are calling our plugin &amp;quot;ktexteditor_timedate&amp;quot;, and it contains only&lt;br /&gt;
# one source file: timedate.cpp.&lt;br /&gt;
kde4_add_plugin(ktexteditor_timedate timedate.cpp)&lt;br /&gt;
&lt;br /&gt;
# We need to link our plugin against kdecore libs, as well as ktexteditor&lt;br /&gt;
target_link_libraries(ktexteditor_timedate ${KDE4_KDECORE_LIBS} ktexteditor)&lt;br /&gt;
&lt;br /&gt;
# Well, we want to install our plugin on the plugin directory&lt;br /&gt;
install(TARGETS ktexteditor_timedate DESTINATION ${PLUGIN_INSTALL_DIR})&lt;br /&gt;
&lt;br /&gt;
# We also want to install the resource contents file on the data directory, at&lt;br /&gt;
# the subdirectory of our plugin name, so it does not mix up with other resource&lt;br /&gt;
# contents files.&lt;br /&gt;
install(FILES timedateui.rc DESTINATION ${DATA_INSTALL_DIR}/ktexteditor_timedate)&lt;br /&gt;
&lt;br /&gt;
# We want to install the desktop file that describes our plugin too. It will go&lt;br /&gt;
# on the services directory.&lt;br /&gt;
install(FILES ktexteditor_timedate.desktop DESTINATION ${SERVICES_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The next part ===&lt;br /&gt;
Now you are ready for adding to this plugin a configuration dialog that lets the user customize the way the string is printed out on the screen.&lt;br /&gt;
&lt;br /&gt;
[[Development/Tutorials/Kate/KTextEditor_Plugins_Advanced|Take me to the next part of this tutorial !!]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Kate/KTextEditor_Plugins_Advanced</id>
		<title>Development/Tutorials/Kate/KTextEditor Plugins Advanced</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Kate/KTextEditor_Plugins_Advanced"/>
				<updated>2008-01-18T10:48:34Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* The resource contents file */ XML highlighting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Kate Plugin Tutorial (2nd part)|&lt;br /&gt;
&lt;br /&gt;
name=Creating your first Kate Plugin with configuration dialog|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4|KDE4 development environment]]|&lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]], [http://websvn.kde.org/trunk/KDE/kdelibs/kate/plugins/timedate The actual plugin code]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
The plugin that we developed on the previous part of this tutorial was nice, but probably not enough. We also need it to be configurable, because the user might want to only add to his/her document the date or the time, not both. We are going to create a configuration dialog for the plugin, and make the output form of our time &amp;amp; date configurable by the user.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
=== The .desktop files ===&lt;br /&gt;
Every plugin needs a .desktop file that describes it. Same for each configuration page/widget. As we only need a page/widget for this plugin, we will only have two desktop files: one for the plugin itself, and another one for configuration the page/widget.&lt;br /&gt;
&lt;br /&gt;
'''ktexteditor_timedate.desktop'''&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Encoding=UTF-8&lt;br /&gt;
X-KDE-Library=ktexteditor_timedate&lt;br /&gt;
X-KDE-PluginKeyword=ktexteditor_timedate&lt;br /&gt;
X-KDE-PluginInfo-Author=Konqui the Dragon&lt;br /&gt;
X-KDE-PluginInfo-Email=konqui@kde.org&lt;br /&gt;
X-KDE-PluginInfo-Name=ktexteditortimedate&lt;br /&gt;
X-KDE-PluginInfo-Version=0.1&lt;br /&gt;
X-KDE-PluginInfo-Website=http://kate.kde.org&lt;br /&gt;
X-KDE-PluginInfo-Category=Editor&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=false&lt;br /&gt;
X-KDE-ParentApp=kate&lt;br /&gt;
X-KDE-Version=4.0&lt;br /&gt;
ServiceTypes=KTextEditor/Plugin&lt;br /&gt;
Type=Service&lt;br /&gt;
Icon=korganizer&lt;br /&gt;
Name=Time &amp;amp; Date&lt;br /&gt;
Comment=Insert current Time &amp;amp; Date&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ktexteditor_timedate_config.desktop'''&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Type=Service&lt;br /&gt;
X-KDE-ServiceTypes=KCModule&lt;br /&gt;
X-KDE-Library=ktexteditor_timedate&lt;br /&gt;
X-KDE-PluginKeyword=ktexteditor_timedate_config&lt;br /&gt;
X-KDE-FactoryName=ktexteditor_timedate_config&lt;br /&gt;
X-KDE-ParentComponents=ktexteditortimedate&lt;br /&gt;
Name=Format of Time &amp;amp; Date insertion&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''X-KDE-ServiceTypes''': configuration widgets are always KCModule's.&lt;br /&gt;
* '''X-KDE-Library''': you need to specify which library provides this configuration dialog. In this case we are shipping on the same library &amp;quot;ktexteditor_timedate.so&amp;quot; both the plugin itself and its configuration dialog.&lt;br /&gt;
* '''X-KDE-PluginKeyword''': since we have two entry points on the library at this time: one for the plugin and another one for the configuration dialog we need to specify which keyword has each one. As you can see I also added this entry to the ktexteditor_timedate.desktop file. Of course they have to be different if we want to see it working.&lt;br /&gt;
&lt;br /&gt;
=== The resource contents file ===&lt;br /&gt;
This file is the one that will let our plugin merge with the Kate environment (toolbars and/or menubars). In this case when our plugin is loaded this file tells the KDE XML classes that it will add a separator, and that there is an action named &amp;quot;tools_insert_timedate&amp;quot;. We will need to interact with this action later.&lt;br /&gt;
&lt;br /&gt;
'''timedateui.rc'''&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui&amp;gt;&lt;br /&gt;
&amp;lt;kpartplugin name=&amp;quot;ktexteditor_timedate&amp;quot; library=&amp;quot;ktexteditor_timedate&amp;quot; version=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MenuBar&amp;gt;&lt;br /&gt;
 &amp;lt;Menu name=&amp;quot;tools&amp;quot;&amp;gt;&amp;lt;Text&amp;gt;&amp;amp;amp;Tools&amp;lt;/Text&amp;gt;&lt;br /&gt;
    &amp;lt;separator group=&amp;quot;tools_operations&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;tools_insert_timedate&amp;quot; group=&amp;quot;tools_operations&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/Menu&amp;gt;&lt;br /&gt;
&amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/kpartplugin&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The header file of the plugin ===&lt;br /&gt;
'''timedate.h'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#ifndef TIMEDATE_H&lt;br /&gt;
#define TIMEDATE_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ktexteditor/plugin.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ktexteditor/view.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kxmlguiclient.h&amp;gt;&lt;br /&gt;
#include &amp;lt;klocalizedstring.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kpluginfactory.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;QtCore/QEvent&amp;gt;&lt;br /&gt;
#include &amp;lt;QtCore/QObject&amp;gt;&lt;br /&gt;
#include &amp;lt;QtCore/QList&amp;gt;&lt;br /&gt;
#include &amp;lt;QtCore/QVariantList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static QString localizedTimeDate = QString();&lt;br /&gt;
&lt;br /&gt;
class TimeDatePlugin&lt;br /&gt;
  : public KTextEditor::Plugin&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    explicit TimeDatePlugin(QObject *parent = 0,&lt;br /&gt;
                            const QVariantList &amp;amp;args = QVariantList());&lt;br /&gt;
    virtual ~TimeDatePlugin();&lt;br /&gt;
&lt;br /&gt;
    static TimeDatePlugin *self() { return plugin; }&lt;br /&gt;
&lt;br /&gt;
    void addView (KTextEditor::View *view);&lt;br /&gt;
    void removeView (KTextEditor::View *view);&lt;br /&gt;
&lt;br /&gt;
    void readConfig();&lt;br /&gt;
    void writeConfig();&lt;br /&gt;
&lt;br /&gt;
    virtual void readConfig (KConfig *) {}&lt;br /&gt;
    virtual void writeConfig (KConfig *) {}&lt;br /&gt;
&lt;br /&gt;
    void setFormat(const QString &amp;amp;format);&lt;br /&gt;
    QString format() const;&lt;br /&gt;
&lt;br /&gt;
  private:&lt;br /&gt;
    static TimeDatePlugin *plugin;&lt;br /&gt;
    QList&amp;lt;class TimeDatePluginView*&amp;gt; m_views;&lt;br /&gt;
    QString m_string;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class TimeDatePluginView&lt;br /&gt;
   : public QObject, public KXMLGUIClient&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT&lt;br /&gt;
&lt;br /&gt;
  public:&lt;br /&gt;
    explicit TimeDatePluginView(const QString &amp;amp;string,&lt;br /&gt;
                                KTextEditor::View *view = 0);&lt;br /&gt;
    ~TimeDatePluginView();&lt;br /&gt;
&lt;br /&gt;
    void setFormat(const QString &amp;amp;format);&lt;br /&gt;
    QString format() const;&lt;br /&gt;
&lt;br /&gt;
  private Q_SLOTS:&lt;br /&gt;
    void slotInsertTimeDate();&lt;br /&gt;
&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEditor::View *m_view;&lt;br /&gt;
    QString m_string;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
K_PLUGIN_FACTORY_DECLARATION(TimeDatePluginFactory)&lt;br /&gt;
&lt;br /&gt;
#endif // TIMEDATE_H&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The source file of the plugin ===&lt;br /&gt;
'''timedate.cpp'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;quot;timedate.h&amp;quot;&lt;br /&gt;
#include &amp;quot;timedate_config.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ktexteditor/document.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;kpluginfactory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kpluginloader.h&amp;gt;&lt;br /&gt;
#include &amp;lt;klocale.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kaction.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kactioncollection.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kdatetime.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kconfiggroup.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TimeDatePlugin *TimeDatePlugin::plugin = 0;&lt;br /&gt;
&lt;br /&gt;
K_PLUGIN_FACTORY_DEFINITION(TimeDatePluginFactory,&lt;br /&gt;
        registerPlugin&amp;lt;TimeDatePlugin&amp;gt;(&amp;quot;ktexteditor_timedate&amp;quot;);&lt;br /&gt;
        registerPlugin&amp;lt;TimeDateConfig&amp;gt;(&amp;quot;ktexteditor_timedate_config&amp;quot;);&lt;br /&gt;
        )&lt;br /&gt;
K_EXPORT_PLUGIN(TimeDatePluginFactory(&amp;quot;ktexteditor_timedate&amp;quot;, &amp;quot;ktexteditor_plugins&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
TimeDatePlugin::TimeDatePlugin(QObject *parent, const QVariantList &amp;amp;args)&lt;br /&gt;
    : KTextEditor::Plugin(parent)&lt;br /&gt;
{&lt;br /&gt;
    Q_UNUSED(args);&lt;br /&gt;
&lt;br /&gt;
    if (localizedTimeDate.isNull())&lt;br /&gt;
    {&lt;br /&gt;
        localizedTimeDate = i18nc(&amp;quot;This is a localized string for default time &amp;amp; date printing on kate document.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%d means day in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%m means month in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%Y means year in XXXX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%H means hours in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%M means minutes in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;Please, if in your language time or date is written in a different order, change it here&amp;quot;,&lt;br /&gt;
                                  &amp;quot;%d-%m-%Y %H:%M&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    plugin = this;&lt;br /&gt;
    readConfig();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TimeDatePlugin::~TimeDatePlugin()&lt;br /&gt;
{&lt;br /&gt;
    plugin = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePlugin::addView(KTextEditor::View *view)&lt;br /&gt;
{&lt;br /&gt;
    TimeDatePluginView *nview = new TimeDatePluginView(m_string, view);&lt;br /&gt;
    m_views.append(nview);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePlugin::removeView(KTextEditor::View *view)&lt;br /&gt;
{&lt;br /&gt;
    for (int z = 0; z &amp;lt; m_views.size(); z++)&lt;br /&gt;
    {&lt;br /&gt;
        if (m_views.at(z)-&amp;gt;parentClient() == view)&lt;br /&gt;
        {&lt;br /&gt;
            TimeDatePluginView *nview = m_views.at(z);&lt;br /&gt;
            m_views.removeAll(nview);&lt;br /&gt;
            delete nview;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePlugin::readConfig()&lt;br /&gt;
{&lt;br /&gt;
    KConfigGroup cg(KGlobal::config(), &amp;quot;TimeDate Plugin&amp;quot;);&lt;br /&gt;
    m_string = cg.readEntry(&amp;quot;string&amp;quot;, localizedTimeDate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePlugin::writeConfig()&lt;br /&gt;
{&lt;br /&gt;
    KConfigGroup cg(KGlobal::config(), &amp;quot;TimeDate Plugin&amp;quot; );&lt;br /&gt;
    cg.writeEntry(&amp;quot;string&amp;quot;, m_string );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePlugin::setFormat(const QString &amp;amp;format)&lt;br /&gt;
{&lt;br /&gt;
    m_string = format;&lt;br /&gt;
&lt;br /&gt;
    // If the property has been set for the plugin in general, let's set that&lt;br /&gt;
    // property to that value on all views where the plugin has been loaded.&lt;br /&gt;
    foreach (TimeDatePluginView *pluginView, m_views)&lt;br /&gt;
    {&lt;br /&gt;
        pluginView-&amp;gt;setFormat(format);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
QString TimeDatePlugin::format() const&lt;br /&gt;
{&lt;br /&gt;
    return m_string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TimeDatePluginView::TimeDatePluginView(const QString &amp;amp;string,&lt;br /&gt;
                                       KTextEditor::View *view)&lt;br /&gt;
  : QObject(view)&lt;br /&gt;
  , KXMLGUIClient(view)&lt;br /&gt;
  , m_view(view)&lt;br /&gt;
  , m_string(string)&lt;br /&gt;
{&lt;br /&gt;
    setComponentData(TimeDatePluginFactory::componentData());&lt;br /&gt;
&lt;br /&gt;
    KAction *action = new KAction(i18n(&amp;quot;Insert Time &amp;amp;&amp;amp; Date&amp;quot;), this);&lt;br /&gt;
    actionCollection()-&amp;gt;addAction(&amp;quot;tools_insert_timedate&amp;quot;, action);&lt;br /&gt;
    action-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_D);&lt;br /&gt;
    connect(action, SIGNAL(triggered()), this, SLOT(slotInsertTimeDate()));&lt;br /&gt;
&lt;br /&gt;
    setXMLFile(&amp;quot;timedateui.rc&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TimeDatePluginView::~TimeDatePluginView()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePluginView::setFormat(const QString &amp;amp;format)&lt;br /&gt;
{&lt;br /&gt;
    m_string = format;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
QString TimeDatePluginView::format() const&lt;br /&gt;
{&lt;br /&gt;
    return m_string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDatePluginView::slotInsertTimeDate()&lt;br /&gt;
{&lt;br /&gt;
    KDateTime dt(QDateTime::currentDateTime());&lt;br /&gt;
    m_view-&amp;gt;document()-&amp;gt;insertText(m_view-&amp;gt;cursorPosition(), dt.toString(m_string));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;timedate.moc&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The header file of the configuration dialog ===&lt;br /&gt;
'''timedate_config.h'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#ifndef TIMEDATE_CONFIG_H&lt;br /&gt;
#define TIMEDATE_CONFIG_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;kcmodule.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class KLineEdit;&lt;br /&gt;
&lt;br /&gt;
class TimeDateConfig&lt;br /&gt;
    : public KCModule&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    explicit TimeDateConfig(QWidget *parent = 0, const QVariantList &amp;amp;args = QVariantList());&lt;br /&gt;
    virtual ~TimeDateConfig();&lt;br /&gt;
&lt;br /&gt;
    virtual void save();&lt;br /&gt;
    virtual void load();&lt;br /&gt;
    virtual void defaults();&lt;br /&gt;
&lt;br /&gt;
private Q_SLOTS:&lt;br /&gt;
    void slotChanged();&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
    KLineEdit *format;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif // TIMEDATE_CONFIG_H&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The source file of the configuration dialog ===&lt;br /&gt;
'''timedate_config.cpp'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;quot;timedate_config.h&amp;quot;&lt;br /&gt;
#include &amp;quot;timedate.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;QtGui/QLabel&amp;gt;&lt;br /&gt;
#include &amp;lt;QtGui/QBoxLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;klocale.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kpluginfactory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kpluginloader.h&amp;gt;&lt;br /&gt;
#include &amp;lt;klineedit.h&amp;gt;&lt;br /&gt;
#include &amp;lt;kconfiggroup.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TimeDateConfig::TimeDateConfig(QWidget *parent, const QVariantList &amp;amp;args)&lt;br /&gt;
    : KCModule(TimeDatePluginFactory::componentData(), parent, args)&lt;br /&gt;
{&lt;br /&gt;
    QVBoxLayout *layout = new QVBoxLayout(this);&lt;br /&gt;
&lt;br /&gt;
    QLabel *info = new QLabel(i18n(&lt;br /&gt;
     &amp;quot;%y\t2-digit year excluding century (00 - 99)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%Y\tfull year number\n&amp;quot;&lt;br /&gt;
     &amp;quot;%:m\tmonth number, without leading zero (1 - 12)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%m\tmonth number, 2 digits (01 - 12)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%b\tabbreviated month name\n&amp;quot;&lt;br /&gt;
     &amp;quot;%B\tfull month name\n&amp;quot;&lt;br /&gt;
     &amp;quot;%e\tday of the month (1 - 31)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%d\tday of the month, 2 digits (01 - 31)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%a\tabbreviated weekday name\n&amp;quot;&lt;br /&gt;
     &amp;quot;%A\tfull weekday name\n&amp;quot;&lt;br /&gt;
     &amp;quot;\n&amp;quot;&lt;br /&gt;
     &amp;quot;%H\thour in the 24 hour clock, 2 digits (00 - 23)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%k\thour in the 24 hour clock, without leading zero (0 - 23)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%I\thour in the 12 hour clock, 2 digits (01 - 12)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%l\thour in the 12 hour clock, without leading zero (1 - 12)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%M\tminute, 2 digits (00 - 59)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%S\tseconds (00 - 59)\n&amp;quot;&lt;br /&gt;
     &amp;quot;%P\t\&amp;quot;am\&amp;quot; or \&amp;quot;pm\&amp;quot;\n&amp;quot;&lt;br /&gt;
     &amp;quot;%p\t\&amp;quot;AM\&amp;quot; or \&amp;quot;PM\&amp;quot;\n&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    // It is possible that the plugin has not been loaded yet, and the&lt;br /&gt;
    // configuration dialog has been asked to be shown. In that case, it is our&lt;br /&gt;
    // turn to set the static string to the correct value.&lt;br /&gt;
    if (localizedTimeDate.isNull())&lt;br /&gt;
    {&lt;br /&gt;
        localizedTimeDate = i18nc(&amp;quot;This is a localized string for default time &amp;amp; date printing on kate document.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%d means day in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%m means month in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%Y means year in XXXX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%H means hours in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;%M means minutes in XX format.&amp;quot;&lt;br /&gt;
                                  &amp;quot;Please, if in your language time or date is written in a different order, change it here&amp;quot;,&lt;br /&gt;
                                  &amp;quot;%d-%m-%Y %H:%M&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    QHBoxLayout *hlayout = new QHBoxLayout(this);&lt;br /&gt;
    QLabel *lformat = new QLabel(i18n(&amp;quot;Format&amp;quot;));&lt;br /&gt;
    format = new KLineEdit(this);&lt;br /&gt;
    hlayout-&amp;gt;addWidget(lformat);&lt;br /&gt;
    hlayout-&amp;gt;addWidget(format);&lt;br /&gt;
&lt;br /&gt;
    layout-&amp;gt;addWidget(info);&lt;br /&gt;
    layout-&amp;gt;addLayout(hlayout);&lt;br /&gt;
&lt;br /&gt;
    setLayout(layout);&lt;br /&gt;
&lt;br /&gt;
    load();&lt;br /&gt;
&lt;br /&gt;
    QObject::connect(format, SIGNAL(textChanged(QString)), this, SLOT(slotChanged()));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TimeDateConfig::~TimeDateConfig()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDateConfig::save()&lt;br /&gt;
{&lt;br /&gt;
    if (TimeDatePlugin::self())&lt;br /&gt;
    {&lt;br /&gt;
        TimeDatePlugin::self()-&amp;gt;setFormat(format-&amp;gt;text());&lt;br /&gt;
        TimeDatePlugin::self()-&amp;gt;writeConfig();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        KConfigGroup cg(KGlobal::config(), &amp;quot;TimeDate Plugin&amp;quot;);&lt;br /&gt;
        cg.writeEntry(&amp;quot;string&amp;quot;, format-&amp;gt;text());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    emit changed(false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDateConfig::load()&lt;br /&gt;
{&lt;br /&gt;
    if (TimeDatePlugin::self())&lt;br /&gt;
    {&lt;br /&gt;
        TimeDatePlugin::self()-&amp;gt;readConfig();&lt;br /&gt;
        format-&amp;gt;setText(TimeDatePlugin::self()-&amp;gt;format());&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        KConfigGroup cg(KGlobal::config(), &amp;quot;TimeDate Plugin&amp;quot; );&lt;br /&gt;
        format-&amp;gt;setText(cg.readEntry(&amp;quot;string&amp;quot;, localizedTimeDate));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    emit changed(false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDateConfig::defaults()&lt;br /&gt;
{&lt;br /&gt;
    format-&amp;gt;setText(localizedTimeDate);&lt;br /&gt;
&lt;br /&gt;
    emit changed(true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void TimeDateConfig::slotChanged()&lt;br /&gt;
{&lt;br /&gt;
    emit changed(true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;timedate_config.moc&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building it all, the CMakeLists.txt ===&lt;br /&gt;
Finally, to put everything together you need to build everything, to tell cmake what needs to go where there is the CMakeLists.txt file.&lt;br /&gt;
&lt;br /&gt;
For more details on CMake please read [[Development/Tutorials/CMake]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
set(ktexteditor_timedate_PART_SRCS timedate.cpp timedate_config.cpp )&lt;br /&gt;
&lt;br /&gt;
kde4_add_plugin(ktexteditor_timedate ${ktexteditor_timedate_PART_SRCS} )&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(ktexteditor_timedate ${KDE4_KDECORE_LIBS} ktexteditor )&lt;br /&gt;
&lt;br /&gt;
install(TARGETS ktexteditor_timedate DESTINATION ${PLUGIN_INSTALL_DIR} )&lt;br /&gt;
&lt;br /&gt;
install(FILES timedateui.rc DESTINATION ${DATA_INSTALL_DIR}/ktexteditor_timedate )&lt;br /&gt;
&lt;br /&gt;
install(FILES ktexteditor_timedate.desktop&lt;br /&gt;
              ktexteditor_timedate_config.desktop DESTINATION ${SERVICES_INSTALL_DIR} )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2008-01-16T16:13:09Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* IRC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Board Games|Board Games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
*[[/Card Games|Card games]]&lt;br /&gt;
&lt;br /&gt;
===See also===&lt;br /&gt;
* [http://doc.trolltech.com/4.2/qsvgrenderer.html QSvgRenderer Class Reference]&lt;br /&gt;
* [http://developer.kde.org/documentation/library/cvs-api/kdelibs-apidocs/kdecore/html/classKSvgRenderer.html KSvgRenderer Class Reference]&lt;br /&gt;
* [http://websvn.kde.org/trunk/KDE/kdegames/katomic/ KAtomic KDE4 code in websvn]&lt;br /&gt;
* [[Schedules/KDE4/4.0 Release Schedule]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
* [[/Ideas| KDEGames Ideas and Proposals]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : 1 February 20:00UTC]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials</id>
		<title>Development/Tutorials</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials"/>
				<updated>2008-01-15T18:35:41Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Basics */ Page is deleted&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Tutorials are the fastest way of finding out what KDE will do for you, and how to do it. Here is a list of currently available tutorials '''for KDE4'''. Material for KDE3 and KDE2 is available on the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
== Introduction To KDE 4 Programming ==&lt;br /&gt;
Are you interested in writing applications with KDE 4? This tutorial series is aimed at those completely new to KDE programming.&lt;br /&gt;
;[[Development/Tutorials/First program|Hello World]]&lt;br /&gt;
:''A preliminary introduction to the very basics of KDE4 programming''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow|Creating the Main Window]]&lt;br /&gt;
:''This tutorial shows you the magic of an application's most important thing: The main window.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions|Using KActions]]&lt;br /&gt;
:''How to add actions to the menus and toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Saving and Loading]]&lt;br /&gt;
:''Introduces the KIO library while adding loading and saving support to our application.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Command line arguments]]&lt;br /&gt;
:''Adds the ability to specify which file to open from the command line to our text editor.''&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Porting Your Application]]&lt;br /&gt;
:''Help Porting Applications from Qt3/KDE3 to Qt4/KDE4''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introduction to CMake]]&lt;br /&gt;
:''How to use the CMake build system used by KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Common Programming Mistakes]]&lt;br /&gt;
:''Various common mistakes made while developing Qt and KDE applications and how to avoid them.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Using Qt Designer to build user interfaces]]&lt;br /&gt;
:''How to create UI files with designer, and how to integrate them into a KDE program.''&lt;br /&gt;
&lt;br /&gt;
== Testing And Debugging ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Debugging your application]]&lt;br /&gt;
:''Tips, tools and techniques to apply when debugging your KDE application''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Writing Unittests for Qt4 and KDE4 with QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html Original link])&lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to write unit tests using the QTestLib framework. It is presented as an example based tutorial, and is still under development.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Semi-automatic ways to detect code errors]]&lt;br /&gt;
:''Techniques you can use to detect errors in KDE code''&lt;br /&gt;
&lt;br /&gt;
== Managing Configuration Data With KConfig ==&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introduction To KConfig]]&lt;br /&gt;
:''An overview of the KConfig classes and how to use them in your application code''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Using KConfig XT]]&lt;br /&gt;
:''Tutorial on how to efficiently use the KConfig XT framework.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Updating KConfig Files]]&lt;br /&gt;
:''Tutorial on how to write an update script to keep changes in your application's config file format in sync with the user's already existing config file''&lt;br /&gt;
&lt;br /&gt;
== Services: Applications and Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introduction to the Services Framework]]&lt;br /&gt;
:''An overview of the services framework in KDE and what it provides the application developer. Covers the system configuration cache (SyCoCa), the source data files and what the indexed information can be used for.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Finding Services Using Trader Queries]]&lt;br /&gt;
:''How to find services, such as plugins or mimetypes, that are indexed in the SyCoCa using Trader Query Syntax''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Creating and Loading Plugins Using KService]]&lt;br /&gt;
:''Learn how to define custom plugin types, find installed plugins (including 3rd party plugins) and load them in an easy and portable fashion using KService.''&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introduction To Unicode]]&lt;br /&gt;
:''An introduction to what Unicode is as well as how to handle Unicode data in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n|Writing Applications With Localization In Mind]]&lt;br /&gt;
:''This tutorial covers what localization is, why it's important and how to ensure your application is ready to be localized. A must read for all application developers.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Mistakes|Avoiding Common Localization Pitfalls]]&lt;br /&gt;
:''There are several common mistakes that prevent applications from being properly localized. Find out what they are and how to easily avoid them in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Building KDE's Localization Module]]&lt;br /&gt;
:''Building and installing language support from KDE's localization (l10n) module is a good idea for those working on applications in the main KDE repository. Doing so will allow you to test your application in another language and spot problem areas. Learn how to do just that in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporating i18n Into the Build System]]&lt;br /&gt;
:''Once your application is ready to be localized, the next step is to ensure that translation files are built automatically and kept up to date. This tutorial covers the necessary CMakeFiles.txt additions as well the process of distributing the resulting message catalogs with your application.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Common i18n Challenges and Solutions]]&lt;br /&gt;
:''This tutorial covers challenges that you may eventually run into such as translating handbooks and other data that exists outside of the source code, merging and handling obsolete .po files, dealing with freezes, coding in languages other than English and creating independent releases of or moving applications between KDE modules.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n_Semantics|Semantic Markup of Messages]]&lt;br /&gt;
:''To ensure consistent presentation and more meaningful representations of messages in applications, semantic markup can be applied to messages marked for translation using the KUIT system. This tutorial describes how this system works.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Automated i18n Code Checking]]&lt;br /&gt;
:''The Krazy code checker scans KDE's code and reports common i18n mistakes.''&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/API_Documentation|API Documentation]]&lt;br /&gt;
:''This tutorial explains how to document your APIs properly.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Man_Pages|Man Pages]]&lt;br /&gt;
:''Writing and Generating Reference Manual Pages.''&lt;br /&gt;
&lt;br /&gt;
== Application Automation and Scripting ==&lt;br /&gt;
&lt;br /&gt;
=== D-Bus ===&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Introduction|Introduction to D-Bus]]&lt;br /&gt;
:''A straight-forward introduction to the core concepts in D-Bus from an application developer's perspective, this tutorial covers what D-Bus is and how it can be used by applications.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Accessing Interfaces|Accessing D-Bus Interfaces]]&lt;br /&gt;
:''A step-by-step guide to calling D-Bus methods and connecting to D-Bus signals using QtDBus.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Intermediate_D-Bus|Intermediate D-Bus]]&lt;br /&gt;
:''Tips to make use of QtDBus when faced with problematic real-world interfaces.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Creating Interfaces|Creating D-Bus Interfaces]]&lt;br /&gt;
:''Learn how to expose functionality in your application by creating and using custom D-Bus interfaces. Covers generating the XML descriptions, instantiating interfaces at run time and setting up the build system with CMake.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Autostart Services|D-Bus Autostart Services]]&lt;br /&gt;
:''Turn your application into a D-Bus autostart service with this tutorial. This D-Bus feature, also known as &amp;quot;D-Bus service activation&amp;quot;, will ensure that even when your application isn't running that D-Bus calls made to it will work by relying on the D-Bus daemon itself to start your app if and when needed.''&lt;br /&gt;
; [[Development/Tutorials/Porting_to_D-Bus|Porting from DCOP to D-Bus]]&lt;br /&gt;
: ''Port your applications from DCOP to D-Bus with this handy guide.''&lt;br /&gt;
&lt;br /&gt;
=== Konqueror ===&lt;br /&gt;
; [[Development/Tutorials/Creating Konqueror Service Menus|Creating Konqueror Service Menus]]&lt;br /&gt;
:''This tutorial shows you how to create mimetype-specific actions in Konqueror's context menu (aka &amp;quot;servicemenus&amp;quot;).''&lt;br /&gt;
&lt;br /&gt;
=== Kross ===&lt;br /&gt;
; [[Development/Tutorials/Kross/Introduction|Introduction to Kross]]&lt;br /&gt;
:''An introduction to the Kross Scripting Framework.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Hello_World|Hello World]]&lt;br /&gt;
:''A first application with working kross code.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Connecting_Signals_and_slots_in_Kross|Connecting Signals and Slots in Kross]]&lt;br /&gt;
:''Simple demonstration of connecting object signals with script slots''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Scripts-as-Plugins|Scripts as Plugins with Kross]]&lt;br /&gt;
:''This tutorial provides a step-by-step introduction how to integrate scripts as plugins into a KDE application.''&lt;br /&gt;
&lt;br /&gt;
=== KOffice ===&lt;br /&gt;
; [[Development/Tutorials/KOffice Overview|KOffice Overview]]&lt;br /&gt;
:''This document shows an overview of the different KOffice plugin types and tells you what each of their purpose and strengths are.''  If you are new with KOffice plugins, this is the place to start.&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Write a Flake Plugin|Creating KOffice Flake Plugins]]&lt;br /&gt;
:''This tutorial shows you how you can build a plugin for KOffice applications to allow you embed content in ODF documents using Flake.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/KWord Scripting|KWord Scripting]]&lt;br /&gt;
:''This tutorial shows how to script KWord with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/KSpread Scripting|KSpread Scripting]]&lt;br /&gt;
:''This tutorial shows how to script KSpread with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Krita Scripting|Krita Scripting]]&lt;br /&gt;
:''This tutorial shows how to script Krita with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
=== SuperKaramba ===&lt;br /&gt;
; [[Development/Tutorials/SuperKaramba|SuperKaramba Tutorial]]&lt;br /&gt;
:''This tutorial provides an overview of SuperKaramba, theme files and scripting with Python, Ruby and JavaScript.''&lt;br /&gt;
&lt;br /&gt;
== Search and Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== Strigi ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Writing file analyzers|Writing file analyzers]]&lt;br /&gt;
:''File analyzers extract data from files to display in the file dialogs and file managers. The data gathered this way is also used to search for files. KDE4 allows the use of multiple analyzers per file type. This tutorial describes how you can write new analyzers.''&lt;br /&gt;
&lt;br /&gt;
=== Nepomuk ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/KMetaData first steps|Nepomuk first steps]]&lt;br /&gt;
:''Nepomuk is the KDE library which provides easy access to metadata in the [http://nepomuk-kde.semanticdesktop.org Nepomuk-KDE] system. Learn how to make your application create and read metadata using the Nepomuk system.''&lt;br /&gt;
&lt;br /&gt;
== Hardware Awareness (Solid) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Tutorials|Introduction to Solid]]&lt;br /&gt;
:''An introduction to using the Solid hardware discovery and interaction system in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Network_Tutorial|Accessing Network Information]]&lt;br /&gt;
:''How to use the Solid system to get information about the network''&lt;br /&gt;
&lt;br /&gt;
== Multimedia (Phonon) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Phonon/Introduction|Phonon]]&lt;br /&gt;
:''How to start with the multimedia API''&lt;br /&gt;
&lt;br /&gt;
:''How to compile and use Phonon and its GStreamer backend on Linux using Qt 4.3.x''&lt;br /&gt;
::''This article gives you a quick brief of how you can use checkout, compile Phonon and its GStreamer backend on GNU/Linux with just Qt 4.3.x. Towards the end, the article also describes how a developer can make use of Phonon to create simple audio and video players. You can read the article [http://www.vcreatelogic.com/oss/docs/CompilingPhononOnLinux.pdf here]. You can download the editable OpenDocumentText file from [http://www.prashanthudupa.com/phonon/CompilingPhononOnLinux.odt here].''&lt;br /&gt;
&lt;br /&gt;
== Plasma ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first Plasma widget, or Plasmoid, in C++ with an SVG background, an icon and some text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing A DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Using DataEngines in Plasmoids]]&lt;br /&gt;
:''With a DataEngine, it is possible to retrieve data for display in a simple and standard way. This tutorial covers the topic of how to use DataEngines for this purpose in Plasmoids.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
== Kate / Kwrite ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Kate/KTextEditor Plugins|Getting Started With KTextEditor Plugins]]&lt;br /&gt;
:''Creating your first KTextEditor plugin''&lt;br /&gt;
&lt;br /&gt;
==Printing==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Hello World|Hello World]]&lt;br /&gt;
:''Introduction to the KDE printing system''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Print Dialog|Print Dialog]]&lt;br /&gt;
:''Using the KDE print dialog''&lt;br /&gt;
&lt;br /&gt;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/Introduction to Get Hot New Stuff|Introduction to Get Hot New Stuff]]&lt;br /&gt;
:''An introduction to the developer-friendly network update system that allows KDE applications to fetch new application data at runtime in a user friendly manner.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KNewStuffSecure|KNewStuff Secure]] ([http://developer.kde.org/documentation/tutorials/knewstuffsecure/index.html Original Link])&lt;br /&gt;
:''Tutorial showing how to share resources in a secured way (KDE 3.4 and later).''  By Andr&amp;amp;#225;s Mantia &amp;amp;lt;amantia@kde.org&amp;amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rapid Application Development ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Python introduction to signals and slots|101 Introduction to signals and slots]]&lt;br /&gt;
:''A simple introduction to Qt's signal and slot architecture.''&lt;br /&gt;
&lt;br /&gt;
=== Ruby ===&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/language-bindings/ruby/kde3tutorial/index.html KDE Ruby Korundum tutorial]&lt;br /&gt;
:''A ruby version of Antonio Larrosa Jim&amp;amp;eacute;nez's KDE tutorial by Richard Dale. See the [http://developer.kde.org/language-bindings/ruby/index.html Ruby Developers Corner] for Qt tutorials and other info.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Qt4_Ruby_Tutorial|Qt4 Ruby Tutorial]]&lt;br /&gt;
:''Trolltech's fabulous introductory tutorial to Qt, translated to Ruby.''&lt;br /&gt;
&lt;br /&gt;
=== Shell ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Shell_Scripting_with_KDE_Dialogs|Shell Scripting with KDE dialogs]] ([http://developer.kde.org/documentation/tutorials/kdialog/t1.html Original Link]) &lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to use KDE dialogs in shell scripts with kdialog. It is presented as an example based tutorial.''&lt;br /&gt;
&lt;br /&gt;
== Other tutorials ==&lt;br /&gt;
&lt;br /&gt;
=== Using the KDE Games Library ===&lt;br /&gt;
;[[Development/Tutorials/Games/KStandardGameAction| KStandardGameAction]]&lt;br /&gt;
:''Using libkdegames to make your game fit the kdegames standard''&lt;br /&gt;
;[[Development/Tutorials/Games/Highscores| Highscores]]&lt;br /&gt;
:''Implementing a simple highscore table into your game''&lt;br /&gt;
;[[Development/Tutorials/Games/Theme Selector| Theme Selector]]&lt;br /&gt;
:''Using the libkdegames theme selection dialog''&lt;br /&gt;
&lt;br /&gt;
=== 2D Plotting (KPlotWidget) ===&lt;br /&gt;
;[[Development/Tutorials/KPlotWidget|Using the KDE data-plotting widget]]&lt;br /&gt;
:''This tutorial introduces KPlotWidget, which is used for 2-D data plotting.  It includes information on simple usage of the widget (including adding and modifying data sets, and customizing the plot axes and labels), and advanced customization (including extending the widget through sub-classing).''&lt;br /&gt;
&lt;br /&gt;
=== Spelling and Grammar Checking (Sonnet) ===&lt;br /&gt;
;[[Development/Tutorials/Sonnet/SonnetTutorial|Adding spell-checking or grammar-checking to KDE applications]]&lt;br /&gt;
:''This tutorial introduces Sonnet and how one may use it to add language correction to your KDE application. Sonnet's auxiliary features shall be described in a separate tutorial.''&lt;br /&gt;
&lt;br /&gt;
=== Pixmap cache (KPixmapCache) ===&lt;br /&gt;
;[[Development/Tutorials/KPixmapCache|Using the KDE pixmap cache]]&lt;br /&gt;
:''This tutorial shows how to use KPixmapCache to cache e.g. pixmaps generated from SVGs or some data.''&lt;br /&gt;
&lt;br /&gt;
== KDE2 and KDE3 Materials ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE3|KDE3 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE3.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE2|KDE2 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE2.''&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User_talk:Danimo</id>
		<title>User talk:Danimo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User_talk:Danimo"/>
				<updated>2007-12-30T16:13:04Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Assistance needed for new contributor to Techbase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==CAPTCHAs that won't go away==&lt;br /&gt;
Aseigo [[Talk:Main_Page#Something_wrong_with_the_CAPTCHAs|suggested]] that I ask you about this.  Everytime I make an edit, it claims that I am adding a URL, and wants me to do some math.  Is it even supposed to do this to registered users?  In any case, ''most'' times I am not adding a url at all, and I tire of the systems inordinate appetite for elementary arithmetic.  Can this be fixed?  Thanks. --[[User:Axiom|Axiom]] 20:27, 28 March 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
As you asked me, I removed all the occurrences of &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt; with &amp;lt;nowiki&amp;gt;{{path}}&amp;lt;/nowiki&amp;gt;, and removed the obsolete template &amp;lt;nowiki&amp;gt;{{file}}&amp;lt;/nowiki&amp;gt;. -- [[user:Pino|pino]] 02:16, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:There is also a template called &amp;lt;nowiki&amp;gt;{{module}}&amp;lt;/nowiki&amp;gt; for KDE modules (kdelibs, kdebase), etc. I initially used path here, too, and thought that's enough. It's not widely used, only by 2 articles. Maybe we should replace it by path again? What do you think? --[[User:Dhaumann|Dhaumann]] 09:14, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::I agree. --[[User:Danimo|Danimo]] 09:28, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::Or maybe link it to the module page in the apidocs (e.g [http://api.kde.org/4.0-api/kdelibs-apidocs/ kdelibs])? --[[User:Milliams|milliams]] 14:47, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:::Good idea, &amp;lt;nowiki&amp;gt;{{kdelibs}}, {{kdebase}}&amp;lt;/nowiki&amp;gt; etc... +1 from my side :) --[[User:Dhaumann|Dhaumann]] 15:11, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
::::Sounds good. Or how about &amp;lt;nowiki&amp;gt;{{module|foo}}&amp;lt;/nowiki&amp;gt; linking to http://api.kde.org/4.0-api/foo-apidocs/? I don't know how flexible this method is though? --[[User:Milliams|milliams]] 19:41, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:::::+1 on [[User:Milliams|milliams]]' idea --[[user:Pino|pino]] 21:35, 29 May 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Assistance needed for new contributor to Techbase==&lt;br /&gt;
Hi. My name is Thor, I am a new contributor to KDE and I am looking to provide some help with regard to one of the KDE Games, KTuberling (The Potato dude).  I am a Polyglot, and work in many different languages, and I have noticed on issues of KTuberling that even with correct software in place, certain speech selections do not function (Notably; Serbian and Danish).  I have been working on these for a while and would like to obtain source code for the Tuberling to try and correct the error.  Could you tell me please how I find out who is working on what, and what they are doing to it?  Thanks and Regards.  [[User:ThunderGod|ThunderGod]] 15:40, 30 December 2007 (CET)&lt;br /&gt;
:The best place to find assistance with this is by visiting the #kdegames or #kde-edu channels on irc.freenode.org or by sending an joining the KDE Games mailing list at [https://mail.kde.org/mailman/listinfo/kde-games-devel https://mail.kde.org/mailman/listinfo/kde-games-devel]. I believe tsdgeos (Albert Astals Cid) is the best person to speak to. --[[User:Milliams|milliams]] 17:13, 30 December 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions</id>
		<title>Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions"/>
				<updated>2007-12-27T22:07:49Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* KStandardAction */ Don't use classmapper&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KActions and XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]], Basic XML knowledge|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Saving and loading]]| &lt;br /&gt;
&lt;br /&gt;
reading=None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.&lt;br /&gt;
&lt;br /&gt;
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 {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
A {{class|KAction}} 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 [http://doc.trolltech.com/latest/signalsandslots.html slot] which carries out the work of your action.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial3&amp;quot;, &amp;quot;tutorial3&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 3&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area using KAction etc.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This time, very little has changed in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, only the KAboutData constructor has been updated to show that we are now on tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
	&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Only a function &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt; has been added which will do all the work setting up the KActions.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
&lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
&lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
This builds upon the KXmlGuiWindow code from [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2]]. Most of the changes are to &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, an important structural change being that the constructor for MainWindow now calls &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; is where the new KAction code goes before finally calling &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
===Creating the KAction object===&lt;br /&gt;
The KAction is built up in a number of steps. The first is including the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; library and then creating the KAction:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
KAction* clearAction = new KAction(this);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a new KAction called &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Setting KAction Properties===&lt;br /&gt;
====Text====&lt;br /&gt;
Now we have our KAction object, we can start setting its properties. The following code sets the text that will be displayed in the menu and under the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt;'s icon in the toolbar.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that the text is passed through the i18n() function; this is necessary for the UI to be translatable (more information on this can be found in the [[Development/Tutorials/Localization/i18n|i18n tutorial]]).&lt;br /&gt;
&lt;br /&gt;
====Icon====&lt;br /&gt;
If the action is going to be displayed in a toolbar, it's nice to have an icon depicting the action. The following code sets the icon to the standard KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; icon through the use of the &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Keyboard Shortcut====&lt;br /&gt;
Setting a keyboard shortcut to perform our action is equally simple:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&amp;lt;/code&amp;gt;&lt;br /&gt;
This associates Ctrl+W with the KAction.&lt;br /&gt;
&lt;br /&gt;
===Adding to the Collection===&lt;br /&gt;
In order for the action to be accessed by the XMLGUI framework (explained in depth later) it must be added to the application's ''action collection''. The action collection is accessed via the &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt; function like this: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Here, the &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; KAction is added to the collection and given a name of ''clear''. This name (''clear'') is used by the XMLGUI framework to refer to the action.&lt;br /&gt;
&lt;br /&gt;
====Connecting the action====&lt;br /&gt;
Now that the action is fully set up, it needs to be connected to something useful. In this case (because we want to clear the text area), we connect our action to the &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; action belonging to a KTextEdit (which, unsurprisingly, clears the KTextEdit)&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
connect( clearAction, SIGNAL( triggered(bool) ), &lt;br /&gt;
         textArea, SLOT( clear() ) );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is the same as it would be done in Qt with a {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
&lt;br /&gt;
For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].&lt;br /&gt;
&lt;br /&gt;
They are very simple to use. Once the library has been included (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simply supply it with what you want the function to do and which KActionCollection to add it to. For example:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a KAction with the correct icon, text and shortcut and even adds it to the File menu.&lt;br /&gt;
&lt;br /&gt;
==Adding the action to menus and toolbars==&lt;br /&gt;
At the moment, the new &amp;quot;Clear&amp;quot; action has been created but it hasn't been associated with any menus or toolbars. This is done with a KDE technology called XMLGUI, which does nice things like movable toolbars for you.&lt;br /&gt;
&lt;br /&gt;
{{note|In a later version of KDE4, XMLGUI, may be replaced with a new framework called liveui. For now, XMLGUI, is the only and correct way to set up the UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; function in {{class|KXmlGuiWindow}} depends on the XMLGUI system to construct the GUI, which XMLGUI does by parsing an XML file description of the interface.&lt;br /&gt;
&lt;br /&gt;
The rule for naming this XML file is &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; is the name you set in {{class|KAboutData}} (in this case, ''tutorial3''). So in our example, the file is called &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, and is located in the build directory. Where the file will ultimately be placed is handled by CMake.&lt;br /&gt;
&lt;br /&gt;
==''appname''ui.rc File==&lt;br /&gt;
&lt;br /&gt;
Since the description of the UI is defined with XML, the layout must follow strict rules. This tutorial will not go into great depth on this topic, but for more information, see the [[Development/Architecture/KDE4/XMLGUI_Technology|detailed XMLGUI page]].&lt;br /&gt;
&lt;br /&gt;
===tutorial3ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial3&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; tag allows you to describe the toolbar, which is the bar across the top of the window normally with icons. Here it is given the unique name ''mainToolBar'' and its user visible name set to ''Main Toolbar'' using the &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt; tag. The clear action is added to the toolbar using the &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt; tag, the name parameter in this tag being the string that was passed to the KActionCollection with &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Besides having the action in the toolbar, it can also be added to the menubar. Here the action is being added to the ''File'' menu of the &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; the same way it was added to the toolbar.&lt;br /&gt;
&lt;br /&gt;
Change the 'version' attribute of the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;gui&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; tag if you changed .rc file since the last install to force a system cache update.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Finally, the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; needs to go somewhere where KDE can find it (can't just leave it in the source directory!). '''This means the project needs to be installed somewhere.'''&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial3)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial3_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial3 ${tutorial3_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial3ui.rc &lt;br /&gt;
        DESTINATION  ${DATA_INSTALL_DIR}/tutorial3)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file is almost identical to the one for tutorial2, but with two extra lines at the end that describe where the files are to be installed. Firstly, the &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; target is installed to the &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt; then the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; file that describes the layout of the user interface is installed to the application's data directory.&lt;br /&gt;
&lt;br /&gt;
===Make, Install And Run===&lt;br /&gt;
If you don't have write access to where your KDE4 installation directory, you can install it to a folder in your home directory.&lt;br /&gt;
&lt;br /&gt;
To tell CMake where to install the program, set the &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt; switch. You probably just want to install it somewhere local for testing (it's probably a bit silly to go to the effort of installing these tutorials to your KDE directory), so the following might be appropriate:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial3&lt;br /&gt;
which will create a KDE-like directory structure in your user's home directory directory and will install the executable to {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Saving_and_loading|saving and loading]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Talk:Development/Tutorials/Using_KActions</id>
		<title>Talk:Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Talk:Development/Tutorials/Using_KActions"/>
				<updated>2007-12-27T22:07:30Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Broken tutorial (kdelibs have changed) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2007/3/18:&lt;br /&gt;
The .ui file isn't working with trunk from svn&lt;br /&gt;
&lt;br /&gt;
I fixed it by using this instead:&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;kpartgui version=&amp;quot;2&amp;quot; name=&amp;quot;tutorial3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;text&amp;gt;&amp;amp;amp;File&amp;lt;/text&amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/kpartgui&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
I'm not shure why.&lt;br /&gt;
Should this be added to the tutorial?&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
Jonarne&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Let's wait, to my experience this is repaired quickly --[[User:Tstaerk|Tstaerk]] 21:12, 18 March 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
after creating the files i get this error message after starting the tutorial 3 application (through dbus-launch ./tutorial3):&lt;br /&gt;
&lt;br /&gt;
tutorial3: WARNING: KXMLGUIClient::setXMLFile: cannot find .rc file tutorial3ui.rc&lt;br /&gt;
&lt;br /&gt;
but this file exists in the current directory... any hint? thx --[[User:Stefon|Stefon]] 21:41, 16 April 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
:It tells you in the CMake section that you must install the application in order to get it to work. --[[User:Milliams|milliams]] 22:38, 16 April 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
sorry. you are right. maybe we can stress this difference out a little more?&lt;br /&gt;
&lt;br /&gt;
--[[User:Stefon|Stefon]] 00:31, 18 April 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Broken tutorial (kdelibs have changed) ==&lt;br /&gt;
&lt;br /&gt;
KAction has no constructor which takes a KActionCollection and a QString as stated in the tutorial. Also, moments later in the &amp;quot;final&amp;quot; code section, this constructor is not used.&lt;br /&gt;
&lt;br /&gt;
A QAction is also being used! :@&lt;br /&gt;
&lt;br /&gt;
--[[User:Gavinbeatty|Gavinbeatty]] 22:50, 19 June 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
Well it seems that KActionCollection extends QAction, so I doubt it's even possible or sane to use a KAction here. Not to mention that if you use QAction you depend a little less on the kdelibs. The problem is that knowing that, you learn basically nothing about KAction in this Tutorial.&lt;br /&gt;
&lt;br /&gt;
--fabiank2&lt;br /&gt;
&lt;br /&gt;
:Where possible, K* classes should be used in place of Q* classes. I've fixed the tutorial to correctly use KAction. --[[User:Milliams|milliams]] 17:26, 28 June 2007 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The link on KStandardAction is dead, it should lead to http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html but leads to classmapper, which doesn't find it. 12/27/07&lt;br /&gt;
&lt;br /&gt;
--shaga&lt;br /&gt;
:It's really a problem with classmapper that it doesn't search for namespace matches. Nonetheless, I've changed it now to hard-link to the url. Thanks for pointing this out. --[[User:Milliams|milliams]] 23:07, 27 December 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCmdLineArgs</id>
		<title>Development/Tutorials/KCmdLineArgs</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCmdLineArgs"/>
				<updated>2007-12-27T16:16:39Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: mainwindow.h/cpp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Command line arguments (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Saving and loading|Tutorial 4 - Loading and saving]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/###|Tutorial 6 - ###]] (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KCmdLineArgs}} {{class|KCmdLineOptions}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a text editor which can open and save files. We will now make the editor act more like a desktop application by enabling it to open files from command line arguments or even using ''Open with'' from within Dolphin.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial5.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KUrl&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial5&amp;quot;, &amp;quot;tutorial5&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 5&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
&lt;br /&gt;
  KCmdLineOptions options; //new&lt;br /&gt;
  options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Document to open&amp;quot;)); //new&lt;br /&gt;
  KCmdLineArgs::addCmdLineOptions(options); //new&lt;br /&gt;
&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); //new&lt;br /&gt;
  if(args-&amp;gt;count()) //new&lt;br /&gt;
  {&lt;br /&gt;
    window-&amp;gt;openFile(args-&amp;gt;url(0).url()); //new&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
    void openFile(const QString &amp;amp;inputFileName); //new&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName;&lt;br /&gt;
 &lt;br /&gt;
  private slots:&lt;br /&gt;
    void newFile();&lt;br /&gt;
    void openFile();&lt;br /&gt;
    void saveFile();&lt;br /&gt;
    void saveFileAs();&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt;&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt;&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString())&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::openFile() //changed&lt;br /&gt;
{&lt;br /&gt;
  openFile(KFileDialog::getOpenFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile(const QString &amp;amp;inputFileName) //new&lt;br /&gt;
{&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(inputFileName, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = inputFileName;&lt;br /&gt;
 &lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial5&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to the &amp;lt;tt&amp;gt;tutorial''x''ui.rc&amp;lt;/tt&amp;gt; from the last two tutorials except &amp;lt;tt&amp;gt;tutorial''x''&amp;lt;/tt&amp;gt; is now &amp;lt;tt&amp;gt;tutorial5&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&lt;br /&gt;
Here we have done nothing but add a new &amp;lt;tt&amp;gt;openFile&amp;lt;/tt&amp;gt; function which takes a &amp;lt;tt&amp;gt;QString&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void openFile(const QString &amp;amp;inputFileName);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&lt;br /&gt;
There's no new code here, only rearranging. Everything from &amp;lt;tt&amp;gt;void openFile()&amp;lt;/tt&amp;gt; has been moved into &amp;lt;tt&amp;gt;void openFile(const QString &amp;amp;inputFileName)&amp;lt;/tt&amp;gt; except the call to &amp;lt;tt&amp;gt;KFileDialog::getOpenFileName()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This way, we can call &amp;lt;tt&amp;gt;openFile()&amp;lt;/tt&amp;gt; if we want to display a dialog, or we can call &amp;lt;tt&amp;gt;openFile(QString)&amp;lt;/tt&amp;gt; if we know the name of the file already.&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&lt;br /&gt;
This is where all the {{class|KCmdLineArgs}} magic happens.&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial5)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
 &lt;br /&gt;
set(tutorial5_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial5 ${tutorial5_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial5 ${KDE4_KDEUI_LIBS}&lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial5 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install( FILES tutorial5ui.rc &lt;br /&gt;
         DESTINATION  ${DATA_INSTALL_DIR}/tutorial5 )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3 and 4. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial5&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to the ### (TODO [[User:milliams]]) tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial5.png</id>
		<title>File:Introtokdetutorial5.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial5.png"/>
				<updated>2007-12-27T15:00:13Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: uploaded a new version of &amp;quot;Image:Introtokdetutorial5.png&amp;quot;: Let's put it in a Konsole window&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial5.png</id>
		<title>File:Introtokdetutorial5.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial5.png"/>
				<updated>2007-12-27T14:54:11Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial4.png</id>
		<title>File:Introtokdetutorial4.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial4.png"/>
				<updated>2007-12-27T14:54:02Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial3.png</id>
		<title>File:Introtokdetutorial3.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial3.png"/>
				<updated>2007-12-27T14:53:03Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: uploaded a new version of &amp;quot;Image:Introtokdetutorial3.png&amp;quot;: Use Oxygen theme and windec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial2.png</id>
		<title>File:Introtokdetutorial2.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial2.png"/>
				<updated>2007-12-27T14:52:44Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: uploaded a new version of &amp;quot;Image:Introtokdetutorial2.png&amp;quot;: Use Oxygen theme and windec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial1.png</id>
		<title>File:Introtokdetutorial1.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial1.png"/>
				<updated>2007-12-27T14:52:21Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: uploaded a new version of &amp;quot;Image:Introtokdetutorial1.png&amp;quot;: Use Oxygen theme and windec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is what you should get once the program is done.&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials</id>
		<title>Development/Tutorials</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials"/>
				<updated>2007-12-27T14:34:41Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Introduction To KDE 4 Programming */ Add link to latest tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Tutorials are the fastest way of finding out what KDE will do for you, and how to do it. Here is a list of currently available tutorials '''for KDE4'''. Material for KDE3 and KDE2 is available on the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
== Introduction To KDE 4 Programming ==&lt;br /&gt;
Are you interested in writing applications with KDE 4? This tutorial series is aimed at those completely new to KDE programming.&lt;br /&gt;
;[[Development/Tutorials/First program|Hello World]]&lt;br /&gt;
:''A preliminary introduction to the very basics of KDE4 programming''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow|Creating the Main Window]]&lt;br /&gt;
:''This tutorial shows you the magic of an application's most important thing: The main window.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions|Using KActions]]&lt;br /&gt;
:''How to add actions to the menus and toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Saving and Loading]]&lt;br /&gt;
:''Introduces the KIO library while adding loading and saving support to our application.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Command line arguments]]&lt;br /&gt;
:''Adds the ability to specify which file to open from the command line to our text editor.''&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Porting Your Application]]&lt;br /&gt;
:''Help Porting Applications from Qt3/KDE3 to Qt4/KDE4''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introduction to CMake]]&lt;br /&gt;
:''How to use the CMake build system used by KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Common Programming Mistakes]]&lt;br /&gt;
:''Various common mistakes made while developing Qt and KDE applications and how to avoid them.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Using Qt Designer to build user interfaces]]&lt;br /&gt;
:''How to create UI files with designer, and how to integrate them into a KDE program.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Command-Line Options|Using Command-line Options]]&lt;br /&gt;
:''Processing and accessing command-line arguments the easy way with KDE's command line arguments classes.''&lt;br /&gt;
&lt;br /&gt;
== Testing And Debugging ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Debugging your application]]&lt;br /&gt;
:''Tips, tools and techniques to apply when debugging your KDE application''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Writing Unittests for Qt4 and KDE4 with QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html Original link])&lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to write unit tests using the QTestLib framework. It is presented as an example based tutorial, and is still under development.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Semi-automatic ways to detect code errors]]&lt;br /&gt;
:''Techniques you can use to detect errors in KDE code''&lt;br /&gt;
&lt;br /&gt;
== Managing Configuration Data With KConfig ==&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introduction To KConfig]]&lt;br /&gt;
:''An overview of the KConfig classes and how to use them in your application code''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Using KConfig XT]]&lt;br /&gt;
:''Tutorial on how to efficiently use the KConfig XT framework.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Updating KConfig Files]]&lt;br /&gt;
:''Tutorial on how to write an update script to keep changes in your application's config file format in sync with the user's already existing config file''&lt;br /&gt;
&lt;br /&gt;
== Services: Applications and Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introduction to the Services Framework]]&lt;br /&gt;
:''An overview of the services framework in KDE and what it provides the application developer. Covers the system configuration cache (SyCoCa), the source data files and what the indexed information can be used for.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Finding Services Using Trader Queries]]&lt;br /&gt;
:''How to find services, such as plugins or mimetypes, that are indexed in the SyCoCa using Trader Query Syntax''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Creating and Loading Plugins Using KService]]&lt;br /&gt;
:''Learn how to define custom plugin types, find installed plugins (including 3rd party plugins) and load them in an easy and portable fashion using KService.''&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introduction To Unicode]]&lt;br /&gt;
:''An introduction to what Unicode is as well as how to handle Unicode data in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n|Writing Applications With Localization In Mind]]&lt;br /&gt;
:''This tutorial covers what localization is, why it's important and how to ensure your application is ready to be localized. A must read for all application developers.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Mistakes|Avoiding Common Localization Pitfalls]]&lt;br /&gt;
:''There are several common mistakes that prevent applications from being properly localized. Find out what they are and how to easily avoid them in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Building KDE's Localization Module]]&lt;br /&gt;
:''Building and installing language support from KDE's localization (l10n) module is a good idea for those working on applications in the main KDE repository. Doing so will allow you to test your application in another language and spot problem areas. Learn how to do just that in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporating i18n Into the Build System]]&lt;br /&gt;
:''Once your application is ready to be localized, the next step is to ensure that translation files are built automatically and kept up to date. This tutorial covers the necessary CMakeFiles.txt additions as well the process of distributing the resulting message catalogs with your application.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Common i18n Challenges and Solutions]]&lt;br /&gt;
:''This tutorial covers challenges that you may eventually run into such as translating handbooks and other data that exists outside of the source code, merging and handling obsolete .po files, dealing with freezes, coding in languages other than English and creating independent releases of or moving applications between KDE modules.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n_Semantics|Semantic Markup of Messages]]&lt;br /&gt;
:''To ensure consistent presentation and more meaningful representations of messages in applications, semantic markup can be applied to messages marked for translation using the KUIT system. This tutorial describes how this system works.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Automated i18n Code Checking]]&lt;br /&gt;
:''The Krazy code checker scans KDE's code and reports common i18n mistakes.''&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/API_Documentation|API Documentation]]&lt;br /&gt;
:''This tutorial explains how to document your APIs properly.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Man_Pages|Man Pages]]&lt;br /&gt;
:''Writing and Generating Reference Manual Pages.''&lt;br /&gt;
&lt;br /&gt;
== Application Automation and Scripting ==&lt;br /&gt;
&lt;br /&gt;
=== D-Bus ===&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Introduction|Introduction to D-Bus]]&lt;br /&gt;
:''A straight-forward introduction to the core concepts in D-Bus from an application developer's perspective, this tutorial covers what D-Bus is and how it can be used by applications.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Accessing Interfaces|Accessing D-Bus Interfaces]]&lt;br /&gt;
:''A step-by-step guide to calling D-Bus methods and connecting to D-Bus signals using QtDBus.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Intermediate_D-Bus|Intermediate D-Bus]]&lt;br /&gt;
:''Tips to make use of QtDBus when faced with problematic real-world interfaces.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Creating Interfaces|Creating D-Bus Interfaces]]&lt;br /&gt;
:''Learn how to expose functionality in your application by creating and using custom D-Bus interfaces. Covers generating the XML descriptions, instantiating interfaces at run time and setting up the build system with CMake.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Autostart Services|D-Bus Autostart Services]]&lt;br /&gt;
:''Turn your application into a D-Bus autostart service with this tutorial. This D-Bus feature, also known as &amp;quot;D-Bus service activation&amp;quot;, will ensure that even when your application isn't running that D-Bus calls made to it will work by relying on the D-Bus daemon itself to start your app if and when needed.''&lt;br /&gt;
; [[Development/Tutorials/Porting_to_D-Bus|Porting from DCOP to D-Bus]]&lt;br /&gt;
: ''Port your applications from DCOP to D-Bus with this handy guide.''&lt;br /&gt;
&lt;br /&gt;
=== Konqueror ===&lt;br /&gt;
; [[Development/Tutorials/Creating Konqueror Service Menus|Creating Konqueror Service Menus]]&lt;br /&gt;
:''This tutorial shows you how to create mimetype-specific actions in Konqueror's context menu (aka &amp;quot;servicemenus&amp;quot;).''&lt;br /&gt;
&lt;br /&gt;
=== Kross ===&lt;br /&gt;
; [[Development/Tutorials/Kross/Introduction|Introduction to Kross]]&lt;br /&gt;
:''An introduction to the Kross Scripting Framework.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Hello_World|Hello World]]&lt;br /&gt;
:''A first application with working kross code.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Connecting_Signals_and_slots_in_Kross|Connecting Signals and Slots in Kross]]&lt;br /&gt;
:''Simple demonstration of connecting object signals with script slots''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Scripts-as-Plugins|Scripts as Plugins with Kross]]&lt;br /&gt;
:''This tutorial provides a step-by-step introduction how to integrate scripts as plugins into a KDE application.''&lt;br /&gt;
&lt;br /&gt;
=== KOffice ===&lt;br /&gt;
; [[Development/Tutorials/KOffice Overview|KOffice Overview]]&lt;br /&gt;
:''This document shows an overview of the different KOffice plugin types and tells you what each of their purpose and strengths are.''  If you are new with KOffice plugins, this is the place to start.&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Write a Flake Plugin|Creating KOffice Flake Plugins]]&lt;br /&gt;
:''This tutorial shows you how you can build a plugin for KOffice applications to allow you embed content in ODF documents using Flake.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/KWord Scripting|KWord Scripting]]&lt;br /&gt;
:''This tutorial shows how to script KWord with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/KSpread Scripting|KSpread Scripting]]&lt;br /&gt;
:''This tutorial shows how to script KSpread with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Krita Scripting|Krita Scripting]]&lt;br /&gt;
:''This tutorial shows how to script Krita with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
=== SuperKaramba ===&lt;br /&gt;
; [[Development/Tutorials/SuperKaramba|SuperKaramba Tutorial]]&lt;br /&gt;
:''This tutorial provides an overview of SuperKaramba, theme files and scripting with Python, Ruby and JavaScript.''&lt;br /&gt;
&lt;br /&gt;
== Search and Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== Strigi ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Writing file analyzers|Writing file analyzers]]&lt;br /&gt;
:''File analyzers extract data from files to display in the file dialogs and file managers. The data gathered this way is also used to search for files. KDE4 allows the use of multiple analyzers per file type. This tutorial describes how you can write new analyzers.''&lt;br /&gt;
&lt;br /&gt;
=== Nepomuk ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/KMetaData first steps|Nepomuk first steps]]&lt;br /&gt;
:''Nepomuk is the KDE library which provides easy access to metadata in the [http://nepomuk-kde.semanticdesktop.org Nepomuk-KDE] system. Learn how to make your application create and read metadata using the Nepomuk system.''&lt;br /&gt;
&lt;br /&gt;
== Hardware Awareness (Solid) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Tutorials|Introduction to Solid]]&lt;br /&gt;
:''An introduction to using the Solid hardware discovery and interaction system in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Network_Tutorial|Accessing Network Information]]&lt;br /&gt;
:''How to use the Solid system to get information about the network''&lt;br /&gt;
&lt;br /&gt;
== Multimedia (Phonon) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Phonon/Introduction|Phonon]]&lt;br /&gt;
:''How to start with the multimedia API''&lt;br /&gt;
&lt;br /&gt;
:''How to compile and use Phonon and its GStreamer backend on Linux using Qt 4.3.x''&lt;br /&gt;
::''This article gives you a quick brief of how you can use checkout, compile Phonon and its GStreamer backend on GNU/Linux with just Qt 4.3.x. Towards the end, the article also describes how a developer can make use of Phonon to create simple audio and video players. You can read the article [http://www.vcreatelogic.com/oss/docs/CompilingPhononOnLinux.pdf here]. You can download the editable OpenDocumentText file from [http://www.prashanthudupa.com/phonon/CompilingPhononOnLinux.odt here].''&lt;br /&gt;
&lt;br /&gt;
== Plasma ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first Plasma widget, or Plasmoid, in C++ with an SVG background, an icon and some text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing A DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Using DataEngines in Plasmoids]]&lt;br /&gt;
:''With a DataEngine, it is possible to retrieve data for display in a simple and standard way. This tutorial covers the topic of how to use DataEngines for this purpose in Plasmoids.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
== Kate / Kwrite ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Kate/KTextEditor Plugins|Getting Started With KTextEditor Plugins]]&lt;br /&gt;
:''Creating your first KTextEditor plugin''&lt;br /&gt;
&lt;br /&gt;
==Printing==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Hello World|Hello World]]&lt;br /&gt;
:''Introduction to the KDE printing system''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Print Dialog|Print Dialog]]&lt;br /&gt;
:''Using the KDE print dialog''&lt;br /&gt;
&lt;br /&gt;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/Introduction to Get Hot New Stuff|Introduction to Get Hot New Stuff]]&lt;br /&gt;
:''An introduction to the developer-friendly network update system that allows KDE applications to fetch new application data at runtime in a user friendly manner.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KNewStuffSecure|KNewStuff Secure]] ([http://developer.kde.org/documentation/tutorials/knewstuffsecure/index.html Original Link])&lt;br /&gt;
:''Tutorial showing how to share resources in a secured way (KDE 3.4 and later).''  By Andr&amp;amp;#225;s Mantia &amp;amp;lt;amantia@kde.org&amp;amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rapid Application Development ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Python introduction to signals and slots|101 Introduction to signals and slots]]&lt;br /&gt;
:''A simple introduction to Qt's signal and slot architecture.''&lt;br /&gt;
&lt;br /&gt;
=== Ruby ===&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/language-bindings/ruby/kde3tutorial/index.html KDE Ruby Korundum tutorial]&lt;br /&gt;
:''A ruby version of Antonio Larrosa Jim&amp;amp;eacute;nez's KDE tutorial by Richard Dale. See the [http://developer.kde.org/language-bindings/ruby/index.html Ruby Developers Corner] for Qt tutorials and other info.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Qt4_Ruby_Tutorial|Qt4 Ruby Tutorial]]&lt;br /&gt;
:''Trolltech's fabulous introductory tutorial to Qt, translated to Ruby.''&lt;br /&gt;
&lt;br /&gt;
=== Shell ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Shell_Scripting_with_KDE_Dialogs|Shell Scripting with KDE dialogs]] ([http://developer.kde.org/documentation/tutorials/kdialog/t1.html Original Link]) &lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to use KDE dialogs in shell scripts with kdialog. It is presented as an example based tutorial.''&lt;br /&gt;
&lt;br /&gt;
== Other tutorials ==&lt;br /&gt;
&lt;br /&gt;
=== Using the KDE Games Library ===&lt;br /&gt;
;[[Development/Tutorials/Games/KStandardGameAction| KStandardGameAction]]&lt;br /&gt;
:''Using libkdegames to make your game fit the kdegames standard''&lt;br /&gt;
;[[Development/Tutorials/Games/Highscores| Highscores]]&lt;br /&gt;
:''Implementing a simple highscore table into your game''&lt;br /&gt;
;[[Development/Tutorials/Games/Theme Selector| Theme Selector]]&lt;br /&gt;
:''Using the libkdegames theme selection dialog''&lt;br /&gt;
&lt;br /&gt;
=== 2D Plotting (KPlotWidget) ===&lt;br /&gt;
;[[Development/Tutorials/KPlotWidget|Using the KDE data-plotting widget]]&lt;br /&gt;
:''This tutorial introduces KPlotWidget, which is used for 2-D data plotting.  It includes information on simple usage of the widget (including adding and modifying data sets, and customizing the plot axes and labels), and advanced customization (including extending the widget through sub-classing).''&lt;br /&gt;
&lt;br /&gt;
=== Spelling and Grammar Checking (Sonnet) ===&lt;br /&gt;
;[[Development/Tutorials/Sonnet/SonnetTutorial|Adding spell-checking or grammar-checking to KDE applications]]&lt;br /&gt;
:''This tutorial introduces Sonnet and how one may use it to add language correction to your KDE application. Sonnet's auxiliary features shall be described in a separate tutorial.''&lt;br /&gt;
&lt;br /&gt;
=== Pixmap cache (KPixmapCache) ===&lt;br /&gt;
;[[Development/Tutorials/KPixmapCache|Using the KDE pixmap cache]]&lt;br /&gt;
:''This tutorial shows how to use KPixmapCache to cache e.g. pixmaps generated from SVGs or some data.''&lt;br /&gt;
&lt;br /&gt;
== KDE2 and KDE3 Materials ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE3|KDE3 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE3.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE2|KDE2 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE2.''&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCmdLineArgs</id>
		<title>Development/Tutorials/KCmdLineArgs</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCmdLineArgs"/>
				<updated>2007-12-27T14:25:43Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Abstract */ ++&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Command line arguments (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Saving and loading|Tutorial 4 - Loading and saving]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/###|Tutorial 6 - ###]] (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KCmdLineArgs}} {{class|KCmdLineOptions}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a text editor which can open and save files. We will now make the editor act more like a desktop application by enabling it to open files from command line arguments or even using ''Open with'' from within Dolphin.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial5.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KUrl&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial5&amp;quot;, &amp;quot;tutorial5&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 5&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
&lt;br /&gt;
  KCmdLineOptions options; //new&lt;br /&gt;
  options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Document to open&amp;quot;)); //new&lt;br /&gt;
  KCmdLineArgs::addCmdLineOptions(options); //new&lt;br /&gt;
&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); //new&lt;br /&gt;
  if(args-&amp;gt;count()) //new&lt;br /&gt;
  {&lt;br /&gt;
    window-&amp;gt;openFile(args-&amp;gt;url(0).url()); //new&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
    void openFile(const QString &amp;amp;inputFileName); //new&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName;&lt;br /&gt;
 &lt;br /&gt;
  private slots:&lt;br /&gt;
    void newFile();&lt;br /&gt;
    void openFile();&lt;br /&gt;
    void saveFile();&lt;br /&gt;
    void saveFileAs();&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt;&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt;&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString())&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::openFile() //changed&lt;br /&gt;
{&lt;br /&gt;
  openFile(KFileDialog::getOpenFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile(const QString &amp;amp;inputFileName) //new&lt;br /&gt;
{&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(inputFileName, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = inputFileName;&lt;br /&gt;
 &lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial5&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to the &amp;lt;tt&amp;gt;tutorial''x''ui.rc&amp;lt;/tt&amp;gt; from the last two tutorials except &amp;lt;tt&amp;gt;tutorial''x''&amp;lt;/tt&amp;gt; is now &amp;lt;tt&amp;gt;tutorial5&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial5)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
 &lt;br /&gt;
set(tutorial5_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial5 ${tutorial5_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial5 ${KDE4_KDEUI_LIBS}&lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial5 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install( FILES tutorial5ui.rc &lt;br /&gt;
         DESTINATION  ${DATA_INSTALL_DIR}/tutorial5 )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3 and 4. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial5&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to the ### (TODO [[User:milliams]]) tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program</id>
		<title>Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program"/>
				<updated>2007-12-27T14:16:45Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* The Code */ Remove unncecessary headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Hello World|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4|KDE4 development environment]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
Your first program shall greet the world with a friendly &amp;quot;Hello World&amp;quot;, what else? For that, we will use a {{class|KMessageBox}} and customise one of the buttons.&lt;br /&gt;
[[image:introtokdetutorial1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
{{tip|To get more information about any class you come across, Konqueror offers a quick shortcut. So to look for information about KMessageBox, just type &amp;quot;kde:kmessagebox&amp;quot; into Konqueror and you'll be taken to the documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You might want to use KDevelop for your projects, which does many nice things like code completion, easy access to API documentation or debugging support.&lt;br /&gt;
&lt;br /&gt;
Read [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this tutorial]] to set up KDevelop correctly for this task. You probably want to check if the setup is working by testing opening an existing KDE 4 application with KDevelop first.&lt;br /&gt;
&lt;br /&gt;
You still need to edit the CMake files by hand though.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
All the code we need will be in one file, &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;. Create that file with the code below:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    KAboutData aboutData(&amp;quot;tutorial1&amp;quot;,                  // The program name used internally.&lt;br /&gt;
                         0,                            // The message catalog name, use program name if null.&lt;br /&gt;
                         ki18n(&amp;quot;Tutorial 1&amp;quot;),          // A displayable program name string.&lt;br /&gt;
                         &amp;quot;1.0&amp;quot;,                        // The program version string.&lt;br /&gt;
                         ki18n(&amp;quot;KMessageBox popup&amp;quot;),   // A short description of what the program does.&lt;br /&gt;
                         KAboutData::License_GPL,      // License identifier&lt;br /&gt;
                         ki18n(&amp;quot;(c) 2007&amp;quot;),            // Copyright Statement&lt;br /&gt;
                         ki18n(&amp;quot;Some text...&amp;quot;),        // Some free form text, that can contain any kind of information.&lt;br /&gt;
                         &amp;quot;http://tutorial.com&amp;quot;,        // The program homepage string.&lt;br /&gt;
                         &amp;quot;submit@bugs.kde.org&amp;quot;);       // The bug report email address string.&lt;br /&gt;
&lt;br /&gt;
    KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
    KApplication app;&lt;br /&gt;
    KGuiItem guiItem( QString( &amp;quot;Hello&amp;quot; ), QString(),&lt;br /&gt;
                      QString( &amp;quot;this is a tooltip&amp;quot; ),&lt;br /&gt;
                      QString( &amp;quot;this is a whatsthis&amp;quot; ) );&lt;br /&gt;
    KMessageBox::questionYesNo( 0, &amp;quot;Hello World&amp;quot;, &amp;quot;Hello&amp;quot;, guiItem );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first KDE specific code we come across in this program is {{class|KAboutData}}. This is the class used to store information about the program such as a short description, authors or license information. Pretty much every KDE application should use this class.&lt;br /&gt;
&lt;br /&gt;
Then we come to {{class|KCmdLineArgs}}. This is the class one would use to specify command line switches to, for example, open the program with a specific file. However, in this tutorial, we simply initialise it with the {{class|KAboutData}} object we created so we can use the &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; switches.&lt;br /&gt;
&lt;br /&gt;
Then we create a {{class|KApplication}} object. This needs to be done exactly once in each program since it is needed for things such as [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Now we've done all the necessary KDE setup, we can move on to doing interesting things with our application. We're going to create a popup box but we're going to customise one of the buttons. To do this customisation, we need to use a {{class|KGuiItem}} object. The first argument in the {{class|KGuiItem}} constructor is the text that will appear on the item (in our case, a button). Then we have an option of setting an icon for the button but we don't want one so we just give it &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;. Finally we set the tooltip (what appears when you hover over an item) and finally the &amp;quot;What's This?&amp;quot; (accessed through right-clicking or Shift-F1) text.&lt;br /&gt;
&lt;br /&gt;
Now we have our item, we can create our popup. We call the &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt; function which, by default, creates a message box with a &amp;quot;Yes&amp;quot; and a &amp;quot;No&amp;quot; button. The second argument is the text that will appear in the middle of the popup box. The third is the caption the window will have and finally we set the KGuiItem for (what would normally be) the &amp;quot;Yes&amp;quot; button to the &amp;lt;tt&amp;gt;KGuiItem guiItem&amp;lt;/tt&amp;gt; we created.&lt;br /&gt;
&lt;br /&gt;
We're all done as far as the code is concerned. Now to build it and try it out.&lt;br /&gt;
&lt;br /&gt;
==Build==&lt;br /&gt;
If you set up your environment as described in [[Getting Started/Build/KDE4]], you can compile this code with&lt;br /&gt;
 &lt;br /&gt;
 g++ main.cpp -o tutorial1 \&lt;br /&gt;
 -I$QTDIR/include/Qt \&lt;br /&gt;
 -I$QTDIR/include/QtCore \&lt;br /&gt;
 -I$QTDIR/include \&lt;br /&gt;
 -I$KDEDIR/include/KDE \&lt;br /&gt;
 -I$KDEDIR/include \&lt;br /&gt;
 -L$KDEDIR/lib \&lt;br /&gt;
 -L$QTDIR/lib -lQtCore -lQtGui -lkdeui -lkdecore&lt;br /&gt;
and then run it with &lt;br /&gt;
 dbus-launch ./tutorial1&lt;br /&gt;
&lt;br /&gt;
===Using CMake===&lt;br /&gt;
If that worked, you may want to use [[Development/Tutorials/CMake|CMake]], just like the rest of KDE. This will automatically locate the libraries and headers for KDE, Qt etc. and will allow you to easily build your applications on other computers.&lt;br /&gt;
====CMakeLists.txt====&lt;br /&gt;
Create a file named CMakeLists.txt in the same directory as main.cpp with this content:&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function locates the package that you ask it for (in this case KDE4) and sets some variables describing the location of the package's headers and libraries. In this case we will use the &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt; variable which contains the path to the KDE4 header files.&lt;br /&gt;
&lt;br /&gt;
In order to allow the compiler to find these files, we pass that variable to the &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; function which adds the KDE4 headers to the header search path.&lt;br /&gt;
&lt;br /&gt;
Next we create a variable called &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; using the &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt; function. In this case we simply set it to the name of our only source file.&lt;br /&gt;
&lt;br /&gt;
Then we use &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; to create an executable called &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; from the source files listed in our &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; variable. Finally we link our executable to the KDE4 kdeui library using &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt; variable which was set by the &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
====Make And Run====&lt;br /&gt;
Again, if you set up your environment as described in [[Getting_Started/Build/KDE4|Getting Started/Build/KDE4]], you can compile this code with:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
Or if you did not:&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake ..&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
And launch it with:&lt;br /&gt;
 ./tutorial1&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KXmlGuiWindow|using KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-27T14:08:31Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Remove TODOs for the navigation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/KCmdLineArgs|Tutorial 5 - Using KCmdLineArgs]]| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful. At the most basic, a text editor needs to be able to load files from disc, save files that you've created/edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we declare a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving. This will all be happening in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have our file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = outputFileName;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====saveFileAs()====&lt;br /&gt;
&lt;br /&gt;
This is the function that the &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt; slot is connected to. It simply calls the generic &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; function and passes the file name returned by &amp;lt;tt&amp;gt;{{class|KFileDialog}}::[http://api.kde.org/4.0-api/kdelibs-apidocs/kio/html/classKFileDialog.html#8891356c249c5911e1ab15cc2739a89b getSaveFileName()]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This our first actual use of the KIO library. {{class|KFileDialog}} provides a number of static functions for displaying the common file dialog that is used by all KDE applications. Calling &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; will display a dialog where the user can select the name of the file to save to or choose a new name. The function returns the full file name, which we then pass to &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====saveFile()====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's nothing exciting or new in this function, just the logic to decide whether or not to show the save dialog. If &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is not empty, then the file is saved to &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. But if it is, then the dialog is shown to allow the user to select a file name.&lt;br /&gt;
&lt;br /&gt;
===Loading a file===&lt;br /&gt;
&lt;br /&gt;
Finally, we get round to being able to load a file from disc. The code for this is all contained in &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First we must ask the user for the name of the file they wish to open. We do this using another one of the &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt; functions, this time &amp;lt;tt&amp;gt;getOpenFileName()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we use the KIO library to retrieve our file. This allows us to open the file with QFile even if it's stored in a remote location like an FTP site. We make the following call to {{class|NetAccess}}'s &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; function&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::download(fileNameFromDialog, tmpFile, this)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument is the name of the file you wish to download. The second is a QString which, after the download is complete, will contain the location of the temporary copy of the file. It is this &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; we will work with from now on.&lt;br /&gt;
&lt;br /&gt;
The function returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; depending on whether the transfer was successful. If it failed, we display a message box giving the error:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KMessageBox::error(this, KIO::NetAccess::lastErrorString());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, we continue with opening the file.&lt;br /&gt;
&lt;br /&gt;
We create a QFile by passing the temporary file created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; to its constructor and then open it in read-only mode&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QFile file(tmpFile);&lt;br /&gt;
file.open(QIODevice::ReadOnly);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to display the contents of the file, we must use a {{class|QTextStream}}. We create one by passing the contents of our file to its constructor and then call QFile's &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; function to get the text from the file. This is then passed to the &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; function of our text area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then store the path of the file we just opened:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = fileNameFromDialog;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
and finally, we remove the temporary file that was created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to the [[Development/Tutorials/KCmdLineArgs|KCmdLineArgs]] tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCmdLineArgs</id>
		<title>Development/Tutorials/KCmdLineArgs</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCmdLineArgs"/>
				<updated>2007-12-27T14:06:52Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: All the code's in. This should be shorter than the last tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Command line arguments (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Saving and loading|Tutorial 4 - Loading and saving]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/###|Tutorial 6 - ###]] (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KCmdLineArgs}} {{class|KCmdLineOptions}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial5.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KUrl&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial5&amp;quot;, &amp;quot;tutorial5&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 5&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
&lt;br /&gt;
  KCmdLineOptions options; //new&lt;br /&gt;
  options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Document to open&amp;quot;)); //new&lt;br /&gt;
  KCmdLineArgs::addCmdLineOptions(options); //new&lt;br /&gt;
&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); //new&lt;br /&gt;
  if(args-&amp;gt;count()) //new&lt;br /&gt;
  {&lt;br /&gt;
    window-&amp;gt;openFile(args-&amp;gt;url(0).url()); //new&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
    void openFile(const QString &amp;amp;inputFileName); //new&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName;&lt;br /&gt;
 &lt;br /&gt;
  private slots:&lt;br /&gt;
    void newFile();&lt;br /&gt;
    void openFile();&lt;br /&gt;
    void saveFile();&lt;br /&gt;
    void saveFileAs();&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName);&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt;&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt;&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString())&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::openFile() //changed&lt;br /&gt;
{&lt;br /&gt;
  openFile(KFileDialog::getOpenFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile(const QString &amp;amp;inputFileName) //new&lt;br /&gt;
{&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(inputFileName, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = inputFileName;&lt;br /&gt;
 &lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial5&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to the &amp;lt;tt&amp;gt;tutorial''x''ui.rc&amp;lt;/tt&amp;gt; from the last two tutorials except &amp;lt;tt&amp;gt;tutorial''x''&amp;lt;/tt&amp;gt; is now &amp;lt;tt&amp;gt;tutorial5&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial5)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
 &lt;br /&gt;
set(tutorial5_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial5 ${tutorial5_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial5 ${KDE4_KDEUI_LIBS}&lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial5 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install( FILES tutorial5ui.rc &lt;br /&gt;
         DESTINATION  ${DATA_INSTALL_DIR}/tutorial5 )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3 and 4. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial5&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to the ### (TODO [[User:milliams]]) tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-27T01:11:42Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Add links to the next (as yet unwritten tutorial)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/KCmdLineArgs|Tutorial 5 - Using KCmdLineArgs]] (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful. At the most basic, a text editor needs to be able to load files from disc, save files that you've created/edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we declare a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving. This will all be happening in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have our file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = outputFileName;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====saveFileAs()====&lt;br /&gt;
&lt;br /&gt;
This is the function that the &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt; slot is connected to. It simply calls the generic &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; function and passes the file name returned by &amp;lt;tt&amp;gt;{{class|KFileDialog}}::[http://api.kde.org/4.0-api/kdelibs-apidocs/kio/html/classKFileDialog.html#8891356c249c5911e1ab15cc2739a89b getSaveFileName()]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This our first actual use of the KIO library. {{class|KFileDialog}} provides a number of static functions for displaying the common file dialog that is used by all KDE applications. Calling &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; will display a dialog where the user can select the name of the file to save to or choose a new name. The function returns the full file name, which we then pass to &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====saveFile()====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's nothing exciting or new in this function, just the logic to decide whether or not to show the save dialog. If &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is not empty, then the file is saved to &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. But if it is, then the dialog is shown to allow the user to select a file name.&lt;br /&gt;
&lt;br /&gt;
===Loading a file===&lt;br /&gt;
&lt;br /&gt;
Finally, we get round to being able to load a file from disc. The code for this is all contained in &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First we must ask the user for the name of the file they wish to open. We do this using another one of the &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt; functions, this time &amp;lt;tt&amp;gt;getOpenFileName()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we use the KIO library to retrieve our file. This allows us to open the file with QFile even if it's stored in a remote location like an FTP site. We make the following call to {{class|NetAccess}}'s &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; function&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::download(fileNameFromDialog, tmpFile, this)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument is the name of the file you wish to download. The second is a QString which, after the download is complete, will contain the location of the temporary copy of the file. It is this &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; we will work with from now on.&lt;br /&gt;
&lt;br /&gt;
The function returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; depending on whether the transfer was successful. If it failed, we display a message box giving the error:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KMessageBox::error(this, KIO::NetAccess::lastErrorString());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, we continue with opening the file.&lt;br /&gt;
&lt;br /&gt;
We create a QFile by passing the temporary file created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; to its constructor and then open it in read-only mode&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QFile file(tmpFile);&lt;br /&gt;
file.open(QIODevice::ReadOnly);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to display the contents of the file, we must use a {{class|QTextStream}}. We create one by passing the contents of our file to its constructor and then call QFile's &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; function to get the text from the file. This is then passed to the &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; function of our text area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then store the path of the file we just opened:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = fileNameFromDialog;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
and finally, we remove the temporary file that was created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to the [[Development/Tutorials/KCmdLineArgs|KCmdLineArgs]] (TODO [[User:milliams]]) tutorial.&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-27T01:00:47Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Remove 'under construction' signs since it's mostly complete&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=KCmdLineArgs (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful. At the most basic, a text editor needs to be able to load files from disc, save files that you've created/edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we declare a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving. This will all be happening in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have our file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = outputFileName;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====saveFileAs()====&lt;br /&gt;
&lt;br /&gt;
This is the function that the &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt; slot is connected to. It simply calls the generic &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; function and passes the file name returned by &amp;lt;tt&amp;gt;{{class|KFileDialog}}::[http://api.kde.org/4.0-api/kdelibs-apidocs/kio/html/classKFileDialog.html#8891356c249c5911e1ab15cc2739a89b getSaveFileName()]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This our first actual use of the KIO library. {{class|KFileDialog}} provides a number of static functions for displaying the common file dialog that is used by all KDE applications. Calling &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; will display a dialog where the user can select the name of the file to save to or choose a new name. The function returns the full file name, which we then pass to &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====saveFile()====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's nothing exciting or new in this function, just the logic to decide whether or not to show the save dialog. If &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is not empty, then the file is saved to &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. But if it is, then the dialog is shown to allow the user to select a file name.&lt;br /&gt;
&lt;br /&gt;
===Loading a file===&lt;br /&gt;
&lt;br /&gt;
Finally, we get round to being able to load a file from disc. The code for this is all contained in &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First we must ask the user for the name of the file they wish to open. We do this using another one of the &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt; functions, this time &amp;lt;tt&amp;gt;getOpenFileName()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we use the KIO library to retrieve our file. This allows us to open the file with QFile even if it's stored in a remote location like an FTP site. We make the following call to {{class|NetAccess}}'s &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; function&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::download(fileNameFromDialog, tmpFile, this)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument is the name of the file you wish to download. The second is a QString which, after the download is complete, will contain the location of the temporary copy of the file. It is this &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; we will work with from now on.&lt;br /&gt;
&lt;br /&gt;
The function returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; depending on whether the transfer was successful. If it failed, we display a message box giving the error:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KMessageBox::error(this, KIO::NetAccess::lastErrorString());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, we continue with opening the file.&lt;br /&gt;
&lt;br /&gt;
We create a QFile by passing the temporary file created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; to its constructor and then open it in read-only mode&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QFile file(tmpFile);&lt;br /&gt;
file.open(QIODevice::ReadOnly);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to display the contents of the file, we must use a {{class|QTextStream}}. We create one by passing the contents of our file to its constructor and then call QFile's &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; function to get the text from the file. This is then passed to the &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; function of our text area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then store the path of the file we just opened:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = fileNameFromDialog;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
and finally, we remove the temporary file that was created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to KCmdLineArgs (TODO [[User:milliams]]).&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-27T00:49:35Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: How to open files. This tutorial is structurally complete now!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=KCmdLineArgs (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful. At the most basic, a text editor needs to be able to load files from disc, save files that you've created/edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we declare a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving. This will all be happening in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have our file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = outputFileName;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====saveFileAs()====&lt;br /&gt;
&lt;br /&gt;
This is the function that the &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt; slot is connected to. It simply calls the generic &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; function and passes the file name returned by &amp;lt;tt&amp;gt;{{class|KFileDialog}}::[http://api.kde.org/4.0-api/kdelibs-apidocs/kio/html/classKFileDialog.html#8891356c249c5911e1ab15cc2739a89b getSaveFileName()]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This our first actual use of the KIO library. {{class|KFileDialog}} provides a number of static functions for displaying the common file dialog that is used by all KDE applications. Calling &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; will display a dialog where the user can select the name of the file to save to or choose a new name. The function returns the full file name, which we then pass to &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====saveFile()====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's nothing exciting or new in this function, just the logic to decide whether or not to show the save dialog. If &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is not empty, then the file is saved to &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. But if it is, then the dialog is shown to allow the user to select a file name.&lt;br /&gt;
&lt;br /&gt;
===Loading a file===&lt;br /&gt;
&lt;br /&gt;
Finally, we get round to being able to load a file from disc. The code for this is all contained in &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
First we must ask the user for the name of the file they wish to open. We do this using another one of the &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt; functions, this time &amp;lt;tt&amp;gt;getOpenFileName()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then we use the KIO library to retrieve our file. This allows us to open the file with QFile even if it's stored in a remote location like an FTP site. We make the following call to {{class|NetAccess}}'s &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; function&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::download(fileNameFromDialog, tmpFile, this)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first argument is the name of the file you wish to download. The second is a QString which, after the download is complete, will contain the location of the temporary copy of the file. It is this &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; we will work with from now on.&lt;br /&gt;
&lt;br /&gt;
The function returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; depending on whether the transfer was successful. If it failed, we display a message box giving the error:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KMessageBox::error(this, KIO::NetAccess::lastErrorString());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, we continue with opening the file.&lt;br /&gt;
&lt;br /&gt;
We create a QFile by passing the temporary file created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; to its constructor and then open it in read-only mode&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QFile file(tmpFile);&lt;br /&gt;
file.open(QIODevice::ReadOnly);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to display the contents of the file, we must use a {{class|QTextStream}}. We create one by passing the contents of our file to its constructor and then call QFile's &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; function to get the text from the file. This is then passed to the &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; function of our text area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then store the path of the file we just opened:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = fileNameFromDialog;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
and finally, we remove the temporary file that was created by &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KIO::NetAccess::removeTempFile(tmpFile);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to KCmdLineArgs (TODO [[User:milliams]]).&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Template_talk:Module</id>
		<title>Template talk:Module</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Template_talk:Module"/>
				<updated>2007-12-26T23:56:15Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Should this template link to API docs?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Should this template link to API docs? ==&lt;br /&gt;
&lt;br /&gt;
Should this be linking to http://api.kde.org/4.0-api/{{{1}}}-apidocs/ as discussed at [[User_talk:Danimo]]?&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Contribute/Bugsquad/KrushDays</id>
		<title>Contribute/Bugsquad/KrushDays</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Contribute/Bugsquad/KrushDays"/>
				<updated>2007-12-26T23:26:53Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: A link is more visible than just text.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Box|KDE4 Krush Days|Join us Saturdays on irc in the #kde4-krush channel to work out release critical issues for KDE 4.0. Testers, artists, documenters and programmers are all welcome and encouraged to join in on the fun. Issues that are identified and being worked on will be added to this community scratchpad page.}}{{note|&lt;br /&gt;
* Please attach you nickname in irc when you add a bug to this page.&lt;br /&gt;
* Move fixed bugs to KrushDaysFixed and mention the revision number(s) of this fix.&lt;br /&gt;
* Please use &amp;lt;nowiki&amp;gt;{{bug|xxxxx}}&amp;lt;/nowiki&amp;gt; to give links to bugs.&lt;br /&gt;
* Please always file new bugs noticed to '''[http://bugs.kde.org/ bugs.kde.org]'''. Many subprojects will &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; look at this page. Include all relevant information there. Do not link bug reports to external files. &lt;br /&gt;
* Do not report wishes here, use bugs.kde.org.}}{{Box|Crash Backtraces|&lt;br /&gt;
Do &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; use &amp;lt;nowiki&amp;gt;http://rafb.net/paste/&amp;lt;/nowiki&amp;gt; for your crash backtraces, because those paste URLs there will expire after 24 hours.&lt;br /&gt;
&lt;br /&gt;
Please use &amp;lt;b&amp;gt;[http://pastebin.ca/ http://pastebin.ca/]&amp;lt;/b&amp;gt; for crash backtraces and add a link to your paste when you add the crash to the list below. &lt;br /&gt;
&lt;br /&gt;
A backtrace is generally &amp;lt;b&amp;gt;very&amp;lt;/b&amp;gt; helpful for developers to identify the reason for the crash. To get good backtraces, read [[Development/Tutorials/Debugging/How_to_create_useful_crash_reports|this article]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Build issues ==&lt;br /&gt;
* In kdebase on OS X 10.5 the build WITH_XKB = OFF variable is not respected resulting in failure of the build. (build process info found at http://techbase.kde.org/Getting_Started/Build/KDE4/Mac_OS_X_10.5_issues) Sorry it's so wordy, but I initially wrote it up for personal use.&lt;br /&gt;
* Kdepim don't build,error at 11% http://pastebin.com/mbfd8870 (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
== kdeaccessibility ==&lt;br /&gt;
&lt;br /&gt;
==== General things ====&lt;br /&gt;
* The 'Do you really want to activate &amp;quot;Slow keys&amp;quot;?' dialog is not obvious. You have a combobox down there where you can deactivate all accessx features &amp;amp; gestures, but it's a bit unclear should I press yes or no to deactivate the features... (teprrr)&lt;br /&gt;
&lt;br /&gt;
==== KMag ====&lt;br /&gt;
* There is no magnification shown but some garbage fractal-like patterns ([[User:Icwiener|Icwiener]] 03:34, 10 November 2007 (CET))&lt;br /&gt;
&lt;br /&gt;
== kdebase ==&lt;br /&gt;
==== Screen Locker (krunner_lock) ====&lt;br /&gt;
* running krunner_lock as a command seems to garble the screen but not actually lock it. (frank95com, jstubbs and mutlu_inek (rev. 743425 and 745228))&lt;br /&gt;
* A 'Leave Message' function like GNOME introduced it recently would be very handy. Patch for KDE 3.5.x: http://www.kde-apps.org/content/show.php/Leave+Message+clone+from+gnome-2.20?content=66631 GNOME implementation:  http://www.gnome.org/start/2.20/notes/C/index.html#rnusers-login-and-screensaver (eliasp)&lt;br /&gt;
&lt;br /&gt;
==== KRunner ====&lt;br /&gt;
* When clicking &amp;quot;options&amp;quot; on the krunner dialog (the alt-f2 dialog), all of the text is invisible (black on black I'm assuming).  (level1)&lt;br /&gt;
** Opened a bug report with a patch: {{bug|154457}} (azuriel)&lt;br /&gt;
&lt;br /&gt;
==== Konsole ====&lt;br /&gt;
&lt;br /&gt;
* With compositing enabled, a 100% transparent background at is always black. KWin bug? (jstubbs) (confirmed by annma) (confirmed by TunaTom)&lt;br /&gt;
** Yes, the ARGB visual code is disabled in Konsole. Because ARGB and QWidget::scroll don't like each other. Here's a patch I'm using to enable ARGB and work around the bug QWidget::scroll hits: http://pastebin.ca/794952 (Vir)&lt;br /&gt;
* With compositing enabled, the selection foreground is the configured background color with no transparency and the selection background is the configured foreground with configured background transparency. Transparancy should switch with the colors or be disabled altogether for selections. (jstubbs)&lt;br /&gt;
* None of the Top-Level Alt+&amp;lt;letter&amp;gt; menu shortcuts work when the terminal has focus. When a menu is opened, the shortcuts inside work. (TunaTom)&lt;br /&gt;
** I can confirm it (FiNeX)&lt;br /&gt;
* Wish: can the New Tab icon be back?&lt;br /&gt;
** Please add your nick if you want it back! (annma, SSJ_GZ, frank95com, Tyl3r, yuriy, yojoe, winterz, FiNeX, tmcguire, JohnFlux, csh, gmartyn, eliasp)&lt;br /&gt;
** Add your nick here if you don't want it because it's wasting precious space for the tabs (and if you think that double clicking the empty space, shortcut and menu are enough options). (Vir, mutlu_inek)&lt;br /&gt;
** How about let the user decide by him/herself. (Carutsu)&lt;br /&gt;
* Wish: Make a right-clickable context menu so that tabs can be closed other than by shortcut or the main menu. (mutlu_inek)&lt;br /&gt;
* &amp;lt;s&amp;gt;Clicking on a split URL will cut off everything after the split(SSJ_GZ).  See&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;Confirmed by mutlu_inek (rev. 743425 and 745228)&amp;lt;/s&amp;gt; Fixed in revision 751696 (mutlu_inek)&lt;br /&gt;
*** However, not all of the link will be underlined. mutlu_inek (rev. 751696)&lt;br /&gt;
* If you delselect the &amp;quot;show menu bar in new windows&amp;quot; option from the &amp;quot;edit profile&amp;quot; dialog and you click &amp;quot;Apply&amp;quot; (or &amp;quot;ok&amp;quot;) the menubar will be hidden even in the current konsole window. The result is the opposite in the contrary situation (you have the menubar not visible and you select &amp;quot;show menu bar...&amp;quot;). When you hide the menubar in this way, the popup menu with the right click doesn't show the menuitem for show the menubar. If you hide the menubar with the option on the menu (EDIT-&amp;gt;HIDE MENU BAR), the popup will have the option &amp;quot;SHOW MENU BAR&amp;quot;. See {{bug|152253}} (FiNeX)&lt;br /&gt;
* &amp;lt;s&amp;gt;When copying several lines of text and pasteing into another application, all newlines in the copied text are missing (jstubbs)&amp;lt;/s&amp;gt;&lt;br /&gt;
** Works fine for me (mutlu_inek (rev. 743425))&lt;br /&gt;
* When several tabs are open and I attempt to close the app, it offers me to close the app altogether or just the active tab. Selecting &amp;quot;Close Current Tab&amp;quot; sometimes closes the current tab and sometimes crashes Konsole. (mutlu_inek, rev. 743425 and 745228)&lt;br /&gt;
** I added a backtrace (non-KDE debugging symbols are missing, though):  http://pastebin.ca/831868 (mutlu_inek, rev. 752605)&lt;br /&gt;
* If i launch a shell script with an application cli(for example vdr) all new konsole session launched start vdr,this happen only if shell script is launched from plasma desktop (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
==== Dolphin ====&lt;br /&gt;
* &amp;lt;s&amp;gt;The &amp;quot;Desktop&amp;quot; and &amp;quot;Root&amp;quot; icons in dolphin have a completely different style than the usual folder icon. (mbiebl)&amp;lt;/s&amp;gt; (can't reproduce with r745359 at kdebase [ereslibre])&lt;br /&gt;
* Select icon in folder/file properties doesn't show the icons of the selected categories at first. Only after changing the combobox the icons are loaded. (bbroeksema)(I can confirmed that [TunaTom r732119])&lt;br /&gt;
* &amp;quot;Empty Trash&amp;quot; does not show up in the file menu when viewing the trash (yuriy)&lt;br /&gt;
** Application menus should never be changed dynamically. So an option would be showing &amp;quot;Empty Trash&amp;quot; always. From my point of view using the context menu is enough (at least I'm not aware about any file manager that has &amp;quot;Empty Trash&amp;quot; as part of the file-menu). For further discussions please mail me directly (peter.penz@gmx.at) or just use the kfm-devel mailing list. Thanks! (Peter Penz)&lt;br /&gt;
** How about showing a colored bar on the top of the filelist with button &amp;quot;empty trash&amp;quot;, like OS X has? Imho it would make it clearer that you're in a special folder and it'd make it easier to empty your trash from there. (teprrr)&lt;br /&gt;
** May just be me but I don't see the point of a move to trash entry when I'm in the trash. I don't see why that can't be changed to Remove Item. And if we are then going to change we might as well have a Empty trash option underneath it :) (DaSkreech)&lt;br /&gt;
* Several of the F1-F11 do not show up in the &amp;quot;Configure Shortcuts&amp;quot; dialog (e.g. F4) (gissi)&lt;br /&gt;
* &amp;lt;s&amp;gt;Inconsistency (IMHO): F4 in dolphin behaves different than in Konqueror (terminal panel vs. terminal in new window) (gissi)&amp;lt;/s&amp;gt;&lt;br /&gt;
** I've moved this entry to the Konqi-issue-list, as the Konqi behavior should be fixed (Peter Penz)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;It can only configure mimetype associations individually via properties on a file, and later clicking on a small settings button. To configure mimetypes globally, and not file related, it has to be done with Konqueror settings, as there is no such entry in SystemSettings. IMHO Dolphin or SystemSettings should also get the Konqueror's File association settings panel.&amp;lt;/b&amp;gt; (q3xr2).&lt;br /&gt;
** I Completely agree! This settings should be accesible even from the systemsettings! (FiNeX)&lt;br /&gt;
** {{bug|151781}} -- [[user:Pino|pino]]&lt;br /&gt;
&lt;br /&gt;
* Dolphin don't exec the shell scripts,of course syntax is good and those scripts has correct perms,double click and open scripts with kwrite instead of exec it.(Meskalamdug)&lt;br /&gt;
* Dolphin don't open the asc files,kgpg &amp;quot;small icon&amp;quot; appear but kpgp don't run for ask pass and decrypt the file,same thing on konqueror (Meskalamdug)&lt;br /&gt;
* Dolphin does not show (unless you manually refresh the view) changes to a files:&lt;br /&gt;
- Modification time&amp;lt;br&amp;gt;&lt;br /&gt;
- Permissions&amp;lt;br&amp;gt;&lt;br /&gt;
- Size (e.g. when watching a folder where a file is being downloaded)&amp;lt;br&amp;gt;&lt;br /&gt;
(and obviously, neither does Konqueror), leading to stale information being presented as current.  This is a feature that used to work way back in KDE3.3.  I think we have all the infrastructure now, so it would be nice to see this regression fixed for KDE4 :)&lt;br /&gt;
** Yes, this is even the case if you leave a folder and enter it again. All those values seem to be cached and are therefore displayed incorrectly. I don't think that this is acceptable for KDE's default file manager. (mutlu_inek, rev. 752605)&lt;br /&gt;
* Cannot edit Volume names in &amp;quot;Places&amp;quot; sidebar in Dolphin, while it's possible for folders. (Tyl3r)&lt;br /&gt;
* &amp;lt;s&amp;gt;When you rename any file or directory to something _really_ long (I tested with &amp;gt;70 letters), dolphin behaves weird directly after renaming. When you leave and re-enter the directory in which the file/directory is, it is painted correctly. (gissi, confirmed by jstubbs and teprrr)&amp;lt;/s&amp;gt;&lt;br /&gt;
** Works fine for me. (mutlu_inek, rev. 743425) I think this is a very old bug. If you still have it, please undo the strikethrough format. mutlu_inek (rev. 751696)&lt;br /&gt;
* Trash icon should change between trash is empty or full, so we know if the trash folder have some file or not inside it. (teddy)&lt;br /&gt;
* In konqueror 3.5.x you can navigate files using the keyboard arrows. In dolphin you can do it too, but when you reach the last icon of a row, pressing &amp;quot;right&amp;quot; button doesn't select the first icon of the next row instead. In konqueror you can do it (in the 3.5.x). See {{bug|152985}} (FiNeX)&lt;br /&gt;
* &amp;lt;s&amp;gt;File names in Dolphin don't use the global KDE colour settings and can be hard to read. Upon further testing I found that the right colour was used after Dolphin re-starts. Still I don't see why everything else in Dolphin changes immediately according to colour changes and not the file names. (open_)&amp;lt;/s&amp;gt; (has been fixed [ereslibre]) (image removed to save space as the description is detailed enough [open_])&lt;br /&gt;
&lt;br /&gt;
==== Plasma ====&lt;br /&gt;
&lt;br /&gt;
Critical issues:&lt;br /&gt;
&lt;br /&gt;
* can't move panel plasmoids. (logixoul)&lt;br /&gt;
* &amp;lt;s&amp;gt;MinimizeAnimation doesn't animates correctly to the taskbar, with Kicker it   works fine (Plasma should tell KWin where the taskbar-entry is) (boom1992)&amp;lt;/s&amp;gt; Fixed. (mutlu_inek, rev. 746964)&lt;br /&gt;
* &amp;lt;strike&amp;gt;&amp;lt;s&amp;gt;Colorpicker and Kickoff plasmoid don't have context menu, so they can't be removed. (TunaTom)&amp;lt;/s&amp;gt;&amp;lt;/strike&amp;gt;&lt;br /&gt;
** context menus are going to be replaced by hover-action-icons (ivan)&lt;br /&gt;
*** It's very anoying (and ugly), that the hover-action-icons show up whenever you hover a plasmoid, they should only show up when a button is hold too, e.g. ALT (yojoe)&lt;br /&gt;
**** Right-click on the desktop and select &amp;quot;lock widgets&amp;quot; so you won't have this problem anymore (Tyl3r)&lt;br /&gt;
** Lancelot now has context menu and is (re)movable (emilsedgh) patch already being reviewed on panel-devel&lt;br /&gt;
* If you move the mouse too quickly over a large plasmoid, it happens that the plasmoid doesn't receive or process the mouse-out event, which causes the hover-options frame + buttons to stay there for ever. Unless you hover the plasmoid again, wait some seconds and move the mouse pointer off the plasmoid. (yojoe)&lt;br /&gt;
** I can confirm this. (mutlu_inek, rev. 743425 and 745228)&lt;br /&gt;
* The date format is not affected by the settings in KControl.&amp;lt;JRT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Configuration dialogs do not appear on the current desktop, they only do in the desktop where plasma has been started on. (ruphy)&lt;br /&gt;
*When selecting a background image the file dialog blocks all of plasma (fregl)&lt;br /&gt;
** I can confirm this. This includes even plasma applets on the panel. (mutlu_inek, rev. 743425)&lt;br /&gt;
* &amp;lt;s&amp;gt;When one drags a file/folder from dolphin to the desktop, and tries to resize it _a lot_, the plasmoid disappears.&amp;lt;/s&amp;gt;&lt;br /&gt;
** It seems to work fine for me. Maybe you dropped the plasmoid off the screen? (mutlu_inek, rev. 743425) I simply can't reproduce this. (mutlu_inek, rev. 746964)&lt;br /&gt;
* Plasma crash when dragging a file icon onto the desktop. First time this happened the background and KickOff disappeared. I deleted the .kde4/config/plasma* files and caused the same crash, but second time the background and KickOff survived. Backtrace from crash - http://www.pastebin.ca/797047 (open_)&lt;br /&gt;
* Plasma crash upon closing 3D Earth Model (with no direct rendering) backtrace: http://pastebin.ca/797306 (scroll down for crash handle info) (kakalto)&lt;br /&gt;
** Another plasma crash upon closing the 3D Earth Model, or rather closing the widget that told me I didn't have the necessary OpenGL shaders. I had rotated the widget before closing it. Backtrace: http://pastebin.ca/799330 (open_)&lt;br /&gt;
* Plasma crashed and didn't return when trying to close the Lancelot applet. Also the Lancelot applet wasn't wide enough when it appeared to show the whole applet's contents. Unfortunately there was no crash dialog window for a backtrace. (open_)&lt;br /&gt;
** I can confirm this. Plasma crashes and leaves me in a white, empty and unusable screen. (mutlu_inek, rev. 743425)&lt;br /&gt;
* Sometime the digital clock in the panel disappear but it reappear when i move the mouse over it&lt;br /&gt;
http://img122.imageshack.us/img122/9417/plasmaclockhu3.png&lt;br /&gt;
* Panel is half hidden on certain xinerama setups. http://images.smileaf.org/img:b1abe8ded856571ed771c105c977dc8d.png (smileaf)&lt;br /&gt;
* Plasma crashes when clicking on a taskbar element while the window's info popup is being displayed. (lucianolev, using Kde4Daily, rev. 752454)&lt;br /&gt;
&lt;br /&gt;
Unprioritized:&lt;br /&gt;
* The network plasmoid does not automatically select the active network connection (It uses eth0 by default, but I use wlan0 mostly) (mbiebl)&lt;br /&gt;
** A list of physical devices (Solid?) would be nice here, but it should be also possible to select a userdefined virtual interface (like tunnel devices). (eliasp)&lt;br /&gt;
** Even when I change the device to eth1 manually (eth1 is my net interface), it reports &amp;quot;not connected&amp;quot; after applying (kakalto)&lt;br /&gt;
** &amp;lt;s&amp;gt;It simply does not work for me at all. I use eth0 (and it is correctly set to it), but it reports &amp;quot;disconnected&amp;quot;. (mutlu_inek, rev. 743425)&amp;lt;/s&amp;gt;&lt;br /&gt;
**** It works for me if I use the new Intel wireless iwl3945 driver. This driver assigns a wlan0 interface. If I use the old ipw3945 driver, then I get either eth0 or eth1 as my wireless interface and the plasmoid does not work at all.  (mutlu_inek, rev. 745228 and 746964)&lt;br /&gt;
***** Still doesn't work here (eliasp, rev. 746127)&lt;br /&gt;
* The Lock/Logout Widget has rectangular buttons -- should have square? &amp;lt;strike&amp;gt;IAC, icons should be centered on buttons.&amp;lt;/strike&amp;gt; &amp;lt;JRT&amp;gt;&lt;br /&gt;
* notes applet should be resized when the text is bigger that current size (emilsedgh)&lt;br /&gt;
* Further to the above: the &amp;quot;Note size&amp;quot; configuration option for notes appears to be non-functional.&lt;br /&gt;
* The dictionary plasmoid doesn't show the results. (Mogger)&lt;br /&gt;
** Looks like fixed in r732655, shows the result, but first changes the box with animation, then changes the result text, also its a bit slow (emilsedgh)&lt;br /&gt;
*** The plasmoid works really well for me. emilsedgh, are you sure it is not a network connection issue for you? Everything in reasonably quick here. (mutlu_inek, rev. 743425)&lt;br /&gt;
**** My connection is slow.this is why this looked slow to me.but the problem is still there, when i hit enter, the animation executes, but after a few seconds the text inside it gets changes&lt;br /&gt;
*Is there a way to reset the orientation of a plasma applet I have rotated? Would be nice if you could rotate an applet in predefined steps (e.g. 45°) by holding a key (e.g. Shift) like it is common in graphic editing applications. (yojoe)&lt;br /&gt;
* &amp;lt;s&amp;gt;It should not be possible to move plasma applets off the screen. There's no way to ever get them back! This might result in active applets consuming resources, the user is not aware off, because they were moved off-screen by accident. (yojoe)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;I second this. Alternatively, they could be at least accessible via a list or smth. (mutlu_inek)&amp;lt;/s&amp;gt; This is resolved by Chani. The &amp;quot;Add Widget&amp;quot; dialog now shows running plasmoids which can be summoned back to the center of the screen. :) (mutlu_inek, rev. 746964)&lt;br /&gt;
*The &amp;quot;Widgets I Have Used Before&amp;quot; filter does not work (in the Add Widget dialog box). (yojoe)&lt;br /&gt;
&amp;lt;strike&amp;gt;*Weather applet, configure --&amp;gt; search for auckland, comes up with empty &amp;quot;found places&amp;quot; dialogue for BBC weather service. Other weather services come up with &amp;quot;the place auckland is not valid. The data source is not able to find this place&amp;quot; (kakalto)&amp;lt;/strike&amp;gt; You should see two places for Auckland now. The other behavour is not a bug. he other data sources do not know about Auckland :-) (spstarr)&lt;br /&gt;
*The &amp;quot;show desktop&amp;quot; applet don't work (Meskalamdug)&lt;br /&gt;
Glitches in playground:&lt;br /&gt;
*Welcome to KDE widget causes graphical glitches [http://mrk.homelinux.net/krush/welcome.png] and crashes plasma when removed[http://mrk.homelinux.net/krush/welcome.backtrace] with kDebug output &amp;quot;Plasma::LayoutItem::setLayout: layout removed from under us. expect crashes&amp;quot;. (All other widgets behave normally)&lt;br /&gt;
* When an app has a show/hide tray icon (like Amarok, KMix etc.) and their window is not-maximized, each time you hide/show the app by clicking the tray icon, it's window is drawn about 20px lower, this stops when the panel finally gets in it's way. (dkarlovi)&lt;br /&gt;
*If you right click on a task in the taskbar, there is a paint issue if you hover over &amp;quot;Advanced&amp;quot; or &amp;quot;To Desktop&amp;quot;.&lt;br /&gt;
**Can't see that here. Seems to be fixed. Can someone confirm? (amp)&lt;br /&gt;
* In the Taskbar, the window icons for many non-KDE apps such as YaST, acroread are corrupted.&lt;br /&gt;
* Hardware info plasmoid shouldn't use lspci to get GPU info as this is located in /usr/sbin on some systems. (smileaf)&lt;br /&gt;
&lt;br /&gt;
Silly:&lt;br /&gt;
&lt;br /&gt;
* Analog Clock: add text &amp;amp; seconds indicator. Change size to 400. Is so SLOW that it easily skips 3 seconds per redraw! (Core2 Duo 2.20GHz, Quadro FX 570M, nvidia binary drivers, Thinkpad T61p) (BCoppens)&lt;br /&gt;
** is this the equivalent of &amp;quot;it hurts when i do this, doctor?&amp;quot; ;)&lt;br /&gt;
* &amp;lt;strike&amp;gt;Time Zone list should be redundant in configuration since the TZ should be set in KControl.  All that is needed is an option to display it.  Note, I think that this is the standard timezone list.  If what is wanted is an option to display a TZ other than the user's TZ, this should be a separate context menu item. &amp;lt;JRT&amp;gt;&amp;lt;/strike&amp;gt;&lt;br /&gt;
** of course you need a list of timezones what if you want to show timezones other than the one you are in or extra ones set elsewhere in kde?&lt;br /&gt;
**What about UTC+ and UTC- Regions avaliable in the timezones to pick from, i hate to search for a &amp;quot;close&amp;quot; city if I know perfectly what UTC zone I want.&lt;br /&gt;
**Why not adding a 'quick filter' line to the TZ select dialog like it's available in the dialog for adding plasma applets. Would make it much more faster and easier finding the needed city/location. (eliasp)&lt;br /&gt;
*When I logout of a KDE4 session and relogin again, all plasmoids I had ever added are instantiated again, even the ones that I closed in the previous session. (yojoe)&lt;br /&gt;
*When I logout and relogin to a KDE4 session my plasmoids are not scaled and rotated like I left them in the previous session. (yojoe)&lt;br /&gt;
*If i change the plasmoid size as soon as i leave the plasmoid area the size gets back to its &amp;quot;normal&amp;quot; size, and the position change dramatically (I can't really say how the position change). (Carutsu)&lt;br /&gt;
* The 'Disk Monitor' applet seems to have some serious problems retrieving the free disk space. Isn't it possible retrieving the free disk space from solid (eliasp)?&lt;br /&gt;
http://eliasprobst.eu/~elias/stuff/screenshots/kde4-issues/dolphin-plasma-free-diskspace.png&lt;br /&gt;
** On mine I have a partition with an unknown name and 16,777,216,0TiB All other partitions have the correct size. (smileaf)&lt;br /&gt;
* When the Fifteen Puzzle is resized the pieces inside remain the same size and the puzzle itself remains it's original size inside the larger widget rendering resizing pointless (open_)&lt;br /&gt;
* The settings buttions: Add Widget, Zoom in, Zoom out.. is too willing to hide. If you put your cursor between the buttons, it'll go to hide, then open up over and over and over... (smileaf)&lt;br /&gt;
&lt;br /&gt;
==== Plasma - Kickoff 'Start Menu' ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;leave -&amp;gt; logout opens a dialog with several options, instead of logging out or asking for confirmation - ({{bug|152486}}) (fred)&amp;lt;/s&amp;gt;&lt;br /&gt;
** You can change this behaviour in systemsettings. Should be default in 4.0 (amp)&lt;br /&gt;
* &amp;lt;s&amp;gt;Unable to resize the kickoff menu. (mbiebl)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;I confirm it. (FiNeX)&amp;lt;/s&amp;gt; Right click opens a context menu now. (mutlu_inek, rev. 752605)&lt;br /&gt;
* &amp;lt;s&amp;gt;Kickoff opens konqueror when clicking on an entry under &amp;quot;My Computer&amp;quot;. (mbiebl)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;Seems to be fixed... Can anyone confirm that, please? (r 735451). (frank95com)&amp;lt;/s&amp;gt;&lt;br /&gt;
*** &amp;lt;s&amp;gt;confirmed. (r 740861) (kakalto)&amp;lt;/s&amp;gt;&lt;br /&gt;
*** I still get konqueror open when clicked storage device under &amp;quot;My Computer&amp;quot;, building KDE from SVN November 28.&lt;br /&gt;
**** I still get konqueror, too. (mutlu_inek, rev. 743425 and 745228)&lt;br /&gt;
* When opened by clicking on a link in &amp;quot;Storage&amp;quot; for example, Konqueror shows the contents of &amp;quot;/&amp;quot; in an unnamed tab. Right of that tab is another one showing the correct location. If you click that tab, konqeuror crashes. (goliath23)&lt;br /&gt;
* Kickoff: Clicking the applications tab, when the tab is open should return it to top-level.Current catalog-memory is a good feature however, so keep that aswell. (eirik_)&lt;br /&gt;
* Kickoff crash plasma desktop after open application/desktop(Meskalamdug)&lt;br /&gt;
** If this is referring to the crash upon opening utilities-&amp;gt;desktop, it is a qt bug which has been fixed in qt-copy and presumably upstream as well (jstubbs)&lt;br /&gt;
*** No problems with new qt-4.3.3 (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
*German umlauts (&amp;quot;&amp;amp;Uuml;&amp;quot; and such) are not properly displayed in menu items if they occour at the beginning of a word. This is the case in Development-&amp;gt;Translation (Entwicklung-&amp;gt;&amp;amp;Uuml;bersetzung) which is &amp;quot;Ubersetzung&amp;quot; then. If the menu item is chosen, the title of the next page is correctly written as &amp;quot;&amp;amp;Uuml;bersetzung&amp;quot; but the menu items again are &amp;quot;Ubersetzungswerkzeug&amp;quot; and such. {{bug|153995}} ([[User:Icwiener|Icwiener]] 13:51, 17 November 2007 (CET))&lt;br /&gt;
&lt;br /&gt;
*Plasma crash when clicking on a recently used item from kickoff - attached backtrace here: http://pastey.net/77802 (null__)&lt;br /&gt;
&lt;br /&gt;
*Switch user from kickoff exec &amp;quot;launch application&amp;quot; (Meskalamdug)&lt;br /&gt;
** Confirmed (kakalto)&lt;br /&gt;
** Confirmed (mikkoc)&lt;br /&gt;
&lt;br /&gt;
* Handling of storage devices needs some loving:&lt;br /&gt;
** When clicking on an unmounted storage device, nothing happens (eliasp)&lt;br /&gt;
** When right-clicking -&amp;gt; eject on a device that is mounted by another user nothing happens - KDE3.5/Dolphin4 displays at least the HAL error message about being unable to umount it due to missing privileges.  (eliasp)&lt;br /&gt;
** The bars representing the disk usage should have a little more space on the right side. They currently seem to be cropped: http://eliasprobst.eu/~elias/stuff/screenshots/kde4-issues/kick-off-storage-devices.png  (eliasp)&lt;br /&gt;
* When scrolling, the category name should stay on top instead of scrolling together with the content:&lt;br /&gt;
http://eliasprobst.eu/~elias/stuff/screenshots/kde4-issues/plasma-kickoff-category-name.png (eliasp)&lt;br /&gt;
* &amp;lt;s&amp;gt;The Kickoff button does a hover animation the first time I hover it, but then the new picture stays. (amp)&amp;lt;/s&amp;gt;&lt;br /&gt;
** Not reproducible any more. (amp)&lt;br /&gt;
* I had an issue where the menu would always switch to the Leave section almost immediately after my mouse rolled over any of the other icons for different sections. When I logged back in it was back to normal (open_)&lt;br /&gt;
** Does &amp;quot;I had an issue&amp;quot; mean it is not reproducible? (mutlu_inek)&lt;br /&gt;
* Kickoff : clicking &amp;quot;LEAVE&amp;quot; tab -&amp;gt; Shutdown and restart menu item no have icons (teddy_)&lt;br /&gt;
&lt;br /&gt;
==== System Settings ====&lt;br /&gt;
* Missing &amp;quot;get root rights&amp;quot; button on pages like Date/Time, thus its impossible to change such settings (apaku) (#151669)&lt;br /&gt;
** Confirmed by FiNeX, Tyl3r and mutlu_inek (rev. 743425 and 745228)&lt;br /&gt;
* &amp;lt;s&amp;gt;no settings to be changed for keyboard shortcuts - everything is empty (nixternal, mactalla) (#135282)&amp;lt;/s&amp;gt; Fixed. (mutlu_inek, rev. 752265)&lt;br /&gt;
* &amp;lt;s&amp;gt;When clicking e.g. &amp;quot;Appearance&amp;quot;, the System Settings window doesn't get resized. This causes very ugly (horizontal and vertical) scrollbars (gissi) (#153283)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;Layouts are awful in general, Regional &amp;amp; Language for example is unusable. (annma) Improved Language tab svn r738336 (annma)&amp;lt;/s&amp;gt; This is much better now and going to be polished a bit more thanks to Aurelien. (mutlu_inek, rev. 752265)&lt;br /&gt;
* &amp;lt;s&amp;gt;Default size for the text beneath the icons is too small. I see stuff like 'ppearanc' instead of 'Appearance' and 'ccesibilit'. Some other texts are wide enough, like 'Splash Screen'. (BCoppens) (#153285)&amp;lt;/s&amp;gt; Fixed. (mutlu_inek, rev. 752265)&lt;br /&gt;
* Changing the style to Oxygen changes all windows, EXCEPT the System Settings (BCoppens) (seems to be every other style change takes effect: #135287)&lt;br /&gt;
** I have the oxygen style also in systemsettings. Try to check again, please. (frank95com)&lt;br /&gt;
*** Hmmm, now that the default style is oxygen and I try to switch to good old plastik, I have the same issue: everything switches to plastik except the system settings. Strange (BCoppens)&lt;br /&gt;
*** I can confirm it: when you change the style and click to &amp;quot;apply&amp;quot; the style is not applied to the system settings window. (FiNeX)&lt;br /&gt;
* systemsettings has no menu - there is no way (for normal users) to start the help for it. (fregl)&lt;br /&gt;
* The systemsettings toolbar can be hidden but there is no way to get it back. (fregl) (#151667)&lt;br /&gt;
* I  don't find where to set the default Spelling dictionary (annma)&lt;br /&gt;
** Missing Spelling module [[User:Bille]]&lt;br /&gt;
* Need a real fix for [http://websvn.kde.org/trunk/KDE/kdebase/workspace/systemsettings/kcmultiwidget.cpp?r1=709212&amp;amp;r2=737094 http://websvn.kde.org/trunk/.../kcmultiwidget.cpp?r1=709212&amp;amp;r2=737094] which is only a workaround. Uncomment the Q_ASSERT to see the problem.&lt;br /&gt;
* The string on the &amp;quot;Accessibility&amp;quot; Info tab is too long. It cause the window be too wide. (FiNeX)&lt;br /&gt;
* The &amp;quot;Search&amp;quot; LineEdit is malplaced if the toolbar is moved to the sides.&lt;br /&gt;
* Every time i log in,kde create in $HOME/.kde4/share/config a gtkrc-2.0 file wich overwrite my gtk settings(colors,theme),text file said &amp;quot; If you do not want KDE to override your GTK settings, select Appearance &amp;amp; Themes -&amp;gt; Colors in the Control Center and disable the checkbox &amp;quot;Apply colors to non-KDE applications&amp;quot; &amp;quot;.But this checkbox is already disabled. (Meskalamdug)&lt;br /&gt;
* &amp;lt;s&amp;gt;If you click on Notifications and then System Notifications there will be no events listed within the table, though the event source is Kopete leading a user to believe that Kopete has no events. If you click on the drop down Event source list and click on Kopete the events will be shown. Either start with a 'None' event source option or list the sources of the application when System Notifications is clicked. I prefer the None option as it will load faster and chances of a user editing the event sources of the first application in the list are slim (open_)&amp;lt;/s&amp;gt;&lt;br /&gt;
** Fixed in System Settings (r746614 by me), cannot reproduce with Kopete. -- [[user:Pino|pino]] 18:21, 9 December 2007 (CET); Yes, this is fixed. (mutlu_inek, rev. 752265)&lt;br /&gt;
* Regional &amp;amp; Language doesn't use kde color scheme &lt;br /&gt;
http://www.uploadgeek.com/uploads456/1/ss.png&lt;br /&gt;
* &amp;lt;s&amp;gt;The &amp;quot;general&amp;quot; tab should precede (be left of) the &amp;quot;advanced&amp;quot; tab. It also should have the focus be default. (mutlu_inek, rev. 752605)&amp;lt;/s&amp;gt; Wow! Someone is doing an amazing job: fixed in SVN commit 752816 by ereslibre. (mutlu_inek)&lt;br /&gt;
* &amp;lt;s&amp;gt;I guess this is more of a question to think about: should the system settings gui should honor its own settings, i.e. whether to open programs (that is, KCMs) with single or double click? (mutlu_inek, rev. 752605)&amp;lt;/s&amp;gt; This has just been resolved by ereslibre in SVN commit 752784. (mutlu_inek)&lt;br /&gt;
&lt;br /&gt;
==== KWin ====&lt;br /&gt;
* KWin tryes to activate compositioning on my VIA card, and thus, freezes everything , no backtrace since everything hangs. (tomaz)&lt;br /&gt;
* Windows are not fully redrawn when minimizing and then restoring with OpenGL compositing in use (jstubbs)&lt;br /&gt;
** I've rebuilt with qt-copy and left a week between testing, but this seems partially fixed? my only issue now is that the last frame drawn is sometimes a transitional frame, when either minimizing or restoring. iow, the window is shown smaller than it really is upon restoring (until a paint is forced) and it is also sometimes still visible when minimizing (again, until a paint is forced) (jstubbs)&lt;br /&gt;
* the compositing KCM should provide an easy way to enable the COMPOSITE extension (logixoul)&lt;br /&gt;
* Sometimes (tested with Konsole, X.org 7.3, latest nvidia drivers and a Geforce 5900XT), the clicked menus are not displayed and KWin crashes. Backtrace : [http://rafb.net/p/zmYj1980.html] (idem)&lt;br /&gt;
**Backtrace is not there anymore. rafb removes pastes after some time. Please ude pastebin.ca ([[User:Icwiener|Icwiener]] 03:42, 10 November 2007 (CET))&lt;br /&gt;
* After a while the alt-tab window list is completely missing though I can still switch between windows with alt+tab (apaku)&lt;br /&gt;
* alt+tab only allows to switch between windows on the same screen in a multihead setup, its impossible to activate a window on another screen (though its on the same virtual X11 desktop) (apaku)&lt;br /&gt;
* KWin does not detect compositing ability on my pc with a GeForce 7600 GS (driver version 100.14.19) (goliath23)&lt;br /&gt;
** Are you sure your KWin has compositing support compiled in? Desktop effects kcm now shows the reason why compositing cannot be enabled, please check this (rivo)&lt;br /&gt;
* 'Scale In' effect also scales in Menus and Dropdown boxes from the 'middle' of their target area, this is ugly. Either don't do that for such windows, or let them scale in from their topleft corner (BCoppens)&lt;br /&gt;
* Alt+Shift+Tab for backwards scrolling through Alt+Tab shortcut is not assigned, but I can't remember if this was the case in KDE3 as well or not... (BCoppens)&lt;br /&gt;
** Now when I click Alt+Shit+Tab my keyboard doesn't respond anymore and I don't know how to get it back, the only solution is to logout with the mouse , which still works. (q3xr2)&lt;br /&gt;
*** I filled a bug about it: {{bug|153211}} (q3xr2)&lt;br /&gt;
* Moving windows with &amp;quot;Display Content&amp;quot; turned off does not display an empty frame. (using an OpenSource driver)&amp;lt;JRT&amp;gt;&lt;br /&gt;
* Alt+Tab crashes KWin here, when pressed too fast several times in a row. Backtrace: http://pastebin.ca/767870 ([[User:Icwiener|Icwiener]] 03:42, 10 November 2007 (CET))&lt;br /&gt;
* Composite effects make video playback really slow(Meskalamdug)&lt;br /&gt;
** Maybe you should use vo=gl in your settings. I use it in my /etc/mplayer/mplayer.conf and it works fine. (amp)&lt;br /&gt;
*** Using vo=gl..same thing,is slow (Meskalamdug)&lt;br /&gt;
* When switching between users (alt+f7 and alt+f8) the entire screen in black until I force a redraw by clicking somewhere (jstubbs)&lt;br /&gt;
* KWin 'locks up' when trying to create a screenshot using ALT+Print. Now you're not able anymore clicking things - the only thing you can do now is moving windows around. It's like ALT is constantly pushed. The only way to get rid of this is restarting X (CTRL+ALT+Backspace is due to the lock-up not possible). You can only click things when first pushing RMB, keeping it pushed, then LMB too. While keeping RMB down, you're able to click things. Now you can quit the session using ''Logout'' from the Kickoff menu. (eliasp).&lt;br /&gt;
** Confirmed here. (q3xr2)&lt;br /&gt;
** Confirmed by me, too. However, the problem is slightly less serious for me since I can still open apps from kickoff, close apps and even log out. But I cannot use the keyboard, any menus or click any buttons. (mutlu_inek, rev. 743425 and 745228)&lt;br /&gt;
* kwin does not maximize windows corretly on my MacBook (intel xorg driver). See https://bugzilla.novell.com/show_bug.cgi?id=335530 for more information. xrandr output is at http://pastebin.ca/796053. _fm_&lt;br /&gt;
* If composite is activated when you first load a menu it's first displayed as an untuned TV, i mean the picture gets all messed up, then it gets normal, that happens only the first time, the image is cached later (i guess) and doesn't happen if you reopen it. I have an Intel chipset so that shouldn't be the problem. (Carutsu)&lt;br /&gt;
* &amp;lt;s&amp;gt;Show the windows (ctrl+f10) then writte something, the icons on the lower right corner of the window gets blank. (Carutsu)&amp;lt;/s&amp;gt;&lt;br /&gt;
** Fixed in revision 749354. (Carutsu)&lt;br /&gt;
* 'Show Windows'/'Expose' should never scale windows bigger as the actually are. Makes them looking blurry and ugly. (eliasp)&lt;br /&gt;
* After changing the cursor theme the cursor shape may be wrong when resizing by dragging the corners.  {{bug|153683}} (alecs1_)&lt;br /&gt;
* The Blur compositing plugin causes the screen to go black except for a observable(and moveable) mouse on a ATI Xpress1100 with the 7.11 (AIGLX) drivers . (nosrednaekim)&lt;br /&gt;
** The Blur compositing plugin works for me, but causes artifacts when for example switching between desktops (NVidia 7600 with proprietary driver x11-video-nvidia-1.0.9631-0.1) (shaga)&lt;br /&gt;
* Windows can start hidden in certain xinerama setups. example: smaller left screen and positioned lower than the right. (smileaf)&lt;br /&gt;
* Windows don't maximize to 1 screen on xinerama setups. (smileaf)&lt;br /&gt;
&lt;br /&gt;
==== Konqueror ====&lt;br /&gt;
* &amp;lt;s&amp;gt;Autocomplete in Konqueror forms doesn't allow to type words starting with the same letter of a previous entry. Example: if you search the word &amp;quot;wall&amp;quot; on google and then you try to search for &amp;quot;wireless&amp;quot; it doesn't work. (Tyl3r)(confirmed jpwhiting, jakub)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;Confirmed by me, too. When Konqueror displays the autocomplete hint, I cannot enter or delete more than one character. (mutlu_inek, rev. 743425)&amp;lt;/s&amp;gt;&lt;br /&gt;
*** &amp;lt;s&amp;gt;You have to click again at the input field for each of the following characters until there are no more autocomplete suggestions. It seems the focus is changing to the autocompletion suggestions as soon as you type something. (eliasp)&amp;lt;/s&amp;gt; This has been resolved. (mutlu_inek, rev. 747385)&lt;br /&gt;
* &amp;lt;s&amp;gt;Website http://kriptopolis.org it is really bad rendered, however it is fine with Konqueror 3.5.7. (q3xr2)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;Confirmed by me. (mutlu_inek, rev. 743425)&amp;lt;/s&amp;gt; Works now. (mutlu_inek, rev. 746963)&lt;br /&gt;
* After changing the arrangement of the address bar while several tabs are open, switching to another tab deletes the changes or messes up konqueror so that it needs to be restarted. (r743536)(glenner) and (mutlu_inek, rev. 743425)&lt;br /&gt;
* Nothing in View -&amp;gt; Sort By, Additional Information, &amp;lt;s&amp;gt;Panels, Navigation Bar&amp;lt;/s&amp;gt; submenus (yuriy)&lt;br /&gt;
**Confirmed here(SSJ_GZ).&lt;br /&gt;
**Confirmed here for the former, but no panels, navigation bar submenus (kakalto)&lt;br /&gt;
* &amp;lt;s&amp;gt;Nothing except &amp;quot;home folder&amp;quot; in home folder sidebar (yuriy) (mutlu_inek, rev. 743425)&amp;lt;/s&amp;gt; The side bar is populated since quite a while now. (mutlu_inek, rev. 751696)&lt;br /&gt;
* $HOME in the desktop entry doesn't seem to get evaluated (yuriy)&lt;br /&gt;
** Error is The File or Folder $HOME does not exist. This also mean we cannot get a tree view rooted at ~(SSJ_GZ)&lt;br /&gt;
* Some favicons do not appear in Konqueror's nav bar to titlebar. google.com and kubuntu.org works. kde.org, cnn.com and slashdot.org do not work. (JustinNoel)&lt;br /&gt;
** Bug #153049 (Quique)&lt;br /&gt;
* pressing ctrl+a when focus is on addressbar selects whole webpage instead of the text that is written in the addressbar (only on webpages: khtmlpart?) (emilsedgh) (mutlu_inek, rev. 743425)&lt;br /&gt;
** The same for text input fields in the displayed page. CTRL+A selects the text of the page, not of the input field. (eliasp)&lt;br /&gt;
* In file management mode it can't show hidden files, it doesn't have this option in the View menu, neither there is a shorcut available. (q3xr2)&lt;br /&gt;
* In HTML forms (such as the textbox to edit this wikipage with, or the username box), the initial fontsize is small. Once I click on the form, the font suddenly enlargens. Especially annoying with this editbox, since the place where you think you clicked changes after fontsize change (BCoppens)&lt;br /&gt;
* &amp;lt;s&amp;gt;Clicking on a link to an in-page 'tag' (the a href=#tag thing, like there are lots of in the index of this wiki page), results in konqueror showing the 'Drag link' mouse cursor (BCoppens)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;Yes, this really disturbs the browsing experience since no interaction with konqueror is possible until the mouse is clicked. (mutlu_inek, rev. 743425)&amp;lt;/s&amp;gt; Fixed. (mutlu_inek, rev. 751696)&lt;br /&gt;
* With Konqui becoming webbrowser as primary task, it would make sense to redesign the start page altogether and remove stuff like Storage media, Trash etc. Show something like &amp;quot;Search the web&amp;quot; which points to a search engine, like Google, yahoo,...&lt;br /&gt;
* &amp;lt;s&amp;gt;(Different from the one above) Start Konq. Enter '~'. Make a new tab (CtrlShift+N). Enter '/'. Switch back to the first tab. It's caption suddenly changes from '/home/kde4/' to 'kde4'! Switching to the second tab, removes the '/' and makes that tab nameless) (BCoppens)&amp;lt;/s&amp;gt; This seems fixed. (mutlu_inek, rev. 743425)&lt;br /&gt;
* Tabs are nameless if in file browsing mode and the root folder is displayed. (mutlu_inek, rev. 743425)&lt;br /&gt;
* Printing a html file from konqueror. The &amp;quot;HTML Settings&amp;quot; tab has an odd layout. It seems to miss a proper border. (mbiebl)&lt;br /&gt;
* The search button in the upper left corner of techbase.kde.org does not draw correctly (no text). (glenner)&lt;br /&gt;
** Not only that, also some other buttons. (frank95com)&lt;br /&gt;
* &amp;lt;s&amp;gt;For some pages the text in buttons is not shown in full, for example gmail. (talavis)&amp;lt;/s&amp;gt; This works well now. (mutlu_inek, rev. 743425)&lt;br /&gt;
* The height in konqueror address bar is too small (sergiof)&lt;br /&gt;
* Flash animations don't show in webpages (ex: www.motorcyclenews.com).Konqueror has the right path to flash plugin (sergiof)&lt;br /&gt;
** The flash plugin doesn't work here. (auxsvr)&lt;br /&gt;
*** I confirm,flash plugin doesn't work atm(Meskalamdug)&lt;br /&gt;
*** We can confirm that flash doesn't work either while it's well configured (carutsu and mutlu_inek (rev. 743425))&lt;br /&gt;
**** Flash works fine now (Meskalamdug)&lt;br /&gt;
***** Not for me. It is configured correctly and works in Firefox and Opera. I use version 9.0.48. (mutlu_inek, rev. 751696)&lt;br /&gt;
* Crashes when activating adblock-&amp;gt;hide filtered images (see {{bug|152107}} ) (TunaTom, reproduced by shaga)&lt;br /&gt;
* Drag and drop a file/URI from konqueror (web browsing), konqueror (file browsing with the dolphin part) and dolphin to a textfield in a webpage in konqueror doesn't work. Bug #152126 (FiNeX)&lt;br /&gt;
* The close buttons in the tabs don't work. (auxsvr)&lt;br /&gt;
* (wish) add an accelerator to &amp;quot;Save image as&amp;quot; on popup menu in khtml. See: http://pastebin.ca/768638 (FiNeX)&lt;br /&gt;
* Alt text frames are not large enough to show all of the text, e.g. &amp;quot;Comic 2&amp;quot; is displayed only as &amp;quot;Comic &amp;quot;. Also happens in kde3. (hdh)&lt;br /&gt;
* If you have a very long shortcut in the &amp;quot;Web shortcuts&amp;quot; configuration dialog on konqueror, the window will be resized over 1024px. If an user have such resolution he cannot view all the window.  The combo box for the &amp;quot;default search engine&amp;quot; is resized for displaying all the text and this make all the window resize.  Actually there is a schortcut called &amp;quot;Great Dictionary of the Catalan Language&amp;quot; who make this happen. See bug {{bug|152374}} (FiNeX)&lt;br /&gt;
* URL editor does not show browsing history when dropped down. It only shows the current page's URL. (JustinNoel)&lt;br /&gt;
* Import bookmark of mozilla(esported as mozilla bookmarks from konqueror 3x) doesn't work,no replace,no new folder (Meskalamdug)&lt;br /&gt;
* Inconsistency (IMHO): F4 in Konqueror behaves different than in Dolphin (terminal panel vs. terminal in new window) (gissi)&lt;br /&gt;
* Drag and Drop in dolphin part in konqueror doesn't work. See {{bug|152706}} (FiNeX)&lt;br /&gt;
* Edit bookmark crash,no backtrace generated (Meskalamdug)&lt;br /&gt;
** Now works fine (Meskalamdug)&lt;br /&gt;
* Copy then paste an existing bookmark crashes it. Backtrace: http://pastebin.ca/796786 (kakalto)&lt;br /&gt;
*Error loading dolphin part. By clicking in konqueror on systemsettings:/ ( in the main page.. &amp;quot;conqueror your desktop&amp;quot;, i get this error:&lt;br /&gt;
There was an error loading the module Dolphin Part.&lt;br /&gt;
The diagnostics is:&lt;br /&gt;
QLibrary::load_sys: Cannot load /home/KDE4/kde/lib/kde4/dolphinpart.so (/home/KDE4/kde/lib/kde4/libdolphinpart.so: cannot open shared object file: No such file or directory)&lt;br /&gt;
I click ok and then:&lt;br /&gt;
There was an error loading the module Cervisia.&lt;br /&gt;
The diagnostics is:&lt;br /&gt;
Library not found&lt;br /&gt;
I click ok and then:&lt;br /&gt;
There was an error loading the module kdesvn.&lt;br /&gt;
The diagnostics is:&lt;br /&gt;
Library not found&lt;br /&gt;
i click ok and then:&lt;br /&gt;
There appears to be a configuration error. You have associated Konqueror with inode/directory, but it cannot handle this file type.&lt;br /&gt;
Systemsettings don't open.. if you try to launch another konqueror those error appears. ( The file dolphinpart.so exist and is placed in the right directory. The file libdolphinpart doesn't exist ( and it has never existed )). ( LinusV2 )&lt;br /&gt;
** I don't get this error; I get &amp;quot;An error occurred while loading settings:/: Unknown settings folder (kakalto)&lt;br /&gt;
* Konqueror doesn't show the ''Add RSS Feed to Akregator'' button in the lower left corner when a website provides a feed (eliasp)&lt;br /&gt;
* Konqueror crashes while trying to go to /home it crashed exactly at /hom (when there were no other choices I guess) backtrace http://pastebin.ca/796683 i tried several times with same result. (carutsu)&lt;br /&gt;
**It looks like some problem in text completion in the URL bar. It happens very often although I did not find a way to reproduce it (ergroot)&lt;br /&gt;
* If you open konqueror and immediately split the window in two (CTRL+SHIFT+R), the right pane loads &amp;quot;about:konqueror&amp;quot;, instead of cloning the current page (expected and normal behaviour at any other path) (kakalto)&lt;br /&gt;
* Konqueror doesn't split windows evenly (kakalto)&lt;br /&gt;
* If you split the window left/right, then click in the left pane, split the window left/right again, then close active view once (in either of the left two panes), it resizes one of the remaining panes to full window size, hiding the other pane. (kakalto)&lt;br /&gt;
** This also happens with the upper two panes if you split top/bottom twice, or with combinations of split top/bottom and left/right&lt;br /&gt;
* &amp;lt;s&amp;gt;&amp;quot;Storage Media&amp;quot; link in konqueror broken (kakalto)&amp;lt;/s&amp;gt; http://img.photobucket.com/albums/v221/Kakalto/Screenshots/media_notsupported.jpg media ioslave was removed in kde4 (smileaf)&lt;br /&gt;
* konqueror crashes on exit, backtrace: http://pastebin.ca/796825 (kakalto)&lt;br /&gt;
** Had the same thing happen here, backtrace: http://pastebin.ca/799318 (open_)&lt;br /&gt;
** If i try to open a unexistant kioprotocol, konqueror crashes on exit but only on a kde4 session, from kde3 it doesn't, backtrace: http://pastebin.com/f7729b262&lt;br /&gt;
** same here. I only get the crash if I've visited an external website - if you open local html pages only and then close there is no crash.  (matt__)&lt;br /&gt;
** me too. But if I launch Konqueror with Konsole and with an URL (for example konqueror www.kde.org) it doesn't crash on exit (toma222).&lt;br /&gt;
** seemsU** The  fixed now rev 746168&lt;br /&gt;
* &amp;lt;s&amp;gt;If I have some addresses in browsing history and start to type one, eg: google.com, and then change so something else (eg: typing goo then an S or some other letter) it brings konqueror to a crash. Maybe something related with the combobox?&amp;lt;/s&amp;gt; (jcalado)&lt;br /&gt;
* Copying files to a samba location stalls for anything more than a few hundred KiB (No problems under konq3) (kakalto)&lt;br /&gt;
* &amp;lt;s&amp;gt;If I open a link in a new tab in konqueror by pressing the middle mouse button, the address bar of the former pages and its thumbnail change to the html address and the thumbnail of the new tab (this does not happen when right-clicking the link and choosing &amp;quot;open in new tab&amp;quot;). (mutlu_inek, rev. 743425)&amp;lt;/s&amp;gt; Works well now. (mutlu_inek, rev. 751696)&lt;br /&gt;
* if I open the link http://techbase.kde.org/Contribute/Bugsquad/KrushDays konqueror crash. Backtrace: http://pastebin.ca/805725 (mancausoft)&lt;br /&gt;
* The bar at the bottom below where the scrollbar appears is inordinately large for what it displays.&lt;br /&gt;
* A KDE developer's blog does not render legibly at all: http://www.bramschoenmakers.nl/ (mutlu_inek, rev. 747385)&lt;br /&gt;
* After starting a download from konqueror,select folder,kget crash (Meskalamdug)&lt;br /&gt;
* This url http://sourceforge.net/project/downloading.php?group_id=46509&amp;amp;use_mirror=dfn&amp;amp;filename=openrdf-sesame-2.0-rc2-onejar.jar&amp;amp;54070129 crash konqueror (Meskalamdug)&lt;br /&gt;
** I can confirm this. There is a really bad backtrace here: http://pastebin.ca/829287 (mutlu_inek, rev. 751696)&lt;br /&gt;
* &amp;lt;s&amp;gt;Konqueror provides View-&amp;gt;enlarge Font and View-&amp;gt;shrink Font. If I select 75% in the shrink Font menu, the enlarge Font menu show 100% to me. So I get the impression the font size I am looking at is 100%. Even worse I am not able to select 100% in the enlarge View menu again. I think the two menues should be aware of each other and indicate what the current font size really is. For bugreport see: http://bugs.kde.org/show_bug.cgi?id=154121 (confirmed: TunaTom r748790)&amp;lt;/s&amp;gt; Fixed by ggarand in commit 752352. (mutlu_inek)&lt;br /&gt;
* Wish: add reload/stop button instead of the two buttons, add a button for replacing the menu bar (like this https://addons.mozilla.org/en-US/firefox/addon/3722 ) &amp;amp; create config for the look of the tab-bar (position, toogle add &amp;amp; close tab buttons ...)&lt;br /&gt;
&lt;br /&gt;
==== Kate ====&lt;br /&gt;
* Endless loop when executing the following steps: create a new file, save it with the .py extension, press enter, up, closed parenthesis, enter (paolo)&lt;br /&gt;
** I can confirm it, and I'll take a look at it. (mstocker)&lt;br /&gt;
** I have a fix for it, but I'm not sure if doesn't cause other problems: http://pastebin.ca/778318 (mstocker)&lt;br /&gt;
*** see http://lists.kde.org/?l=kwrite-devel&amp;amp;m=119789215123897&amp;amp;w=2 (tfry)&lt;br /&gt;
* Word Completion - flickering suggestion popup when mouse pointer is inside the popup area. ([[User:Hilefoks|Hilefoks]]) &amp;lt;s&amp;gt;Works now. (mutlu_inek, rev. 743425)&amp;lt;/s&amp;gt;&lt;br /&gt;
** I still have this bug. ([[User:Hilefoks|Hilefoks]] rev. 748314)&lt;br /&gt;
*** Do you use compositing? Which graphics card do you have? And which drivers do you use? (mutlu_inek, rev. 751699)&lt;br /&gt;
**** With and without composite and also when I run kate in KDE3. I have a NVidia GF 8800 and using the binary driver. ([[User:Hilefoks|Hilefoks]])&lt;br /&gt;
* &amp;lt;s&amp;gt;Ctrl + a only selects everything up to the cursor (csh)&amp;lt;/s&amp;gt; Works now. (mutlu_inek, rev. 743425)&lt;br /&gt;
** &amp;lt;s&amp;gt;I still have this bug. Revision 744890. (Carutsu)&amp;lt;/s&amp;gt; Solved in revision 746184.&lt;br /&gt;
&lt;br /&gt;
==== KWrite ====&lt;br /&gt;
* traceback after &amp;quot;file has changed, what will you do?&amp;quot; and clicking reload - however, i couldn't reproduce it. http://pastebin.ca/778564 (jstubbs)&lt;br /&gt;
** I used this feature a lot and it never crashed on me. (mutlu_inek, rev. 751699)&lt;br /&gt;
* kwrite word completion plugin (This problem is also highlighted in the KATE section) - enabled, when completing a word the popup flickers madly ONLY for the first word, but works for completion for the next word onwards. Attached kwrite output and bt - http://pastey.net/77535 and http://pastey.net/77536 - hmm dont think the bt is of any use (null__)&lt;br /&gt;
** Can you still reproduce this? It works perfectly for me. Do you use compositing? Which graphics card do you have? And which drivers do you use? (mutlu_inek, rev. 751699)&lt;br /&gt;
* &amp;lt;s&amp;gt;If you open a text file with kwrite, click on a line and press CTRL+A to select all, visually it only displays that line and all prior lines being selected, but if you copy to clipboard, it copies everything. When you switch programs or maximise kwrite, it refreshes and shows all as selected. Also affects Kate. (kakalto)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;We could fix this by calling repaintText(false); in  KateView::selectAll() after setSelection(...)... ? (mstocker)&amp;lt;/s&amp;gt;&lt;br /&gt;
** I was able to confirm this a week ago, but it is fixed for me now in r746830 (firmo). Same here (uwolfer).&lt;br /&gt;
*If i open a binary-text file(for example nvidia-driver) kwrite use all ram and cause a out of memory (Meskalamdug)&lt;br /&gt;
** It works for me at revision 751699, could you check again? (mutlu_inek)&lt;br /&gt;
*** Still don't work,preview ok but when i try to open the files i have the memory problem (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
==== Login Manager KCM ====&lt;br /&gt;
* There are numbers on the tabs (yuriy)&lt;br /&gt;
** yes - the kcm is too big to have non-clashing letter shortcuts.&lt;br /&gt;
&lt;br /&gt;
==== KFontChooser ====&lt;br /&gt;
*It doesn't work correctly for the bit mapped fonts Fixed[Misc] &amp;amp; Fixed[Sony] which come with X11 are the best example of this since they might be used in Konsole.  This is mainly a Konsole issue. &amp;lt;JRT&amp;gt;&lt;br /&gt;
**There should be only 2 sizes of Fixed[Sony] which works correctly in KDE3 it displays only two sizes.  I'm not 100% clear on how this works if you have a screen resolution other than 75 or 100, but xfontsel lists two point sizes for 100 dpi: 12 &amp;amp; 17 and this agrees with the KFontSel dialog.  But in KDE4 it lists the usual list of sizes from 4 to 64.&lt;br /&gt;
**There are several sizes of Fixed[Misc], according to xfonsel they are: 5, 6, 7, 8, 10, 11, 12, &amp;amp; 14.  KDE has this fairly close to correct -- close enough that it works OK.  It also lists 4 which may be a 75 dpi font and it lists 9 but not 12.  Could these be rounding errors?  IAC, KDE4 is the same as with Fixed[Sony], it has the standard list of 4 to 64.&lt;br /&gt;
**We need to first ask if this is a Qt bug/error as are other font issues.&lt;br /&gt;
***The Fixed{Misc} fonts are not a uniform set of fonts and I don't think that there is any way that Qt can deal with this issue.&lt;br /&gt;
&lt;br /&gt;
=== Icons KCM ===&lt;br /&gt;
* Forces you to a manual reboot if you try to change icon theme :-) (ruphy)&lt;br /&gt;
=== KNetattach ===&lt;br /&gt;
* After finishing the KNetattach wizard, it opens up a Konqueror window using the newly created connection instead of Dolphin. (eliasp)&lt;br /&gt;
&lt;br /&gt;
=== Klipper ===&lt;br /&gt;
* Not a bug per se but &amp;quot;Clear clipboard History&amp;quot;'s icon (right click in the systray icon of Klipper) is a sand clock, while the methaphor is (i think) reseting history it is just confusing IMHO, couldn't it be the clipboard with an eraser or something? (Carutsu)&lt;br /&gt;
&lt;br /&gt;
== kdeedu ==&lt;br /&gt;
==== kalgebra ====&lt;br /&gt;
* Crash when entering &amp;quot;t-&amp;gt;(1..100,t)&amp;quot; as a 2d graph function (astromme) (backtrace: http://pastebin.ca/796378)&lt;br /&gt;
- Fixed (apol) &lt;br /&gt;
--&amp;gt; it still crashes here (svn 750124) (pvandewyngaerde ) backtrace http://pastebin.ca/827632&lt;br /&gt;
&lt;br /&gt;
==== KHangMan ====&lt;br /&gt;
*  After typing an already typed letter, the focus is left on the guess &amp;quot;button&amp;quot;, which means I have to press tab to get back to the letter entry field. If we enable the focus back before tooltip is hidden, it means the tooltip has to be hidden when a new letter is entered. (jstubbs)&lt;br /&gt;
** annma: intented behaviour is that the input is impossible why popup is shown. To leave the kid the time to understand what he is doing. Messing with the tooltip now seems bad to me. It's a WON'T FIX until we have it tested with kids ;) sorry jstubbs!&lt;br /&gt;
* &amp;lt;s&amp;gt;See if the font progressbar can disappear after first run (jstubbs)&amp;lt;/s&amp;gt;&lt;br /&gt;
** annma: Removing your ~/.fonts/d dustismo_roman.ttf will make the bug go away. The font will reinstall and then it'll be found. Not sure why it happened...&lt;br /&gt;
** jstubbs: the above does not work for me&lt;br /&gt;
* Test what happens for the fonts when no internet connection (annma)&lt;br /&gt;
* &amp;lt;s&amp;gt;Wish: when using the Special chars toolbar, letters should go immediatly in the word or in Missed. Annma is not sure this would work with kids, they maybe won't understand what happens. (jstubbs)&amp;lt;/s&amp;gt;&lt;br /&gt;
** annma: maybe a config option for KDE 4.1 as we are in feature freeze now.&lt;br /&gt;
* Language combo in toolbar does not resize correctly when adding a language with a longer name than those already present. (jstubbs)&lt;br /&gt;
* &amp;lt;s&amp;gt;Right-clicking &amp;quot;Type accented letters&amp;quot; does not offer the context sensitive help when the option is disabled. (jstubbs)&amp;lt;/s&amp;gt;&lt;br /&gt;
** annma: this is from Qt, it's default behaviour for QWhatsThis help.&lt;br /&gt;
** jstubbs: Using the &amp;quot;what's this&amp;quot; button from the title bar and then clicking on it gives the help. Perhaps this should be sent upstream? At the moment, it is not clear what the option does or under what situations it would become enabled...&lt;br /&gt;
&lt;br /&gt;
==== Kiten ====&lt;br /&gt;
* Searching for &amp;quot;one&amp;quot; takes a long time to process, during which the application blocks without any feedback. (jstubbs)&lt;br /&gt;
* &amp;quot;Filter Rare&amp;quot; does not seem to work (jstubbs)&lt;br /&gt;
* From the Search menu, selecting Search {with Beginning of Word, Anywhere}, Grade or Strokes does not seem to have any affect (jstubbs)&lt;br /&gt;
* Selecting Verb or Noun from the grammatical element dropdown does not seem to have any affect (jstubbs)&lt;br /&gt;
* When searching for something that has no results, the results pane continues to display the previous results until a refresh is forced (jstubbs)&lt;br /&gt;
* Can't copy text when right clicking on selected text in the results pane (jstubbs)&lt;br /&gt;
* Disabling &amp;quot;match only whole english word&amp;quot; still only matches whole words (jstubbs)&lt;br /&gt;
&lt;br /&gt;
==== KBruch ====&lt;br /&gt;
* In fraction tasks, the denominators used sometimes exceed the max denominator that is set. (jstubbs) r732343 attempted to fixe it but not totally&lt;br /&gt;
&lt;br /&gt;
==== KGeography ====&lt;br /&gt;
* With KWin's dimming of inactive windows, it is difficult to relate the colors signfying right/wrong answers back to the map (jstubbs)&lt;br /&gt;
&lt;br /&gt;
==== KmPlot ====&lt;br /&gt;
* &amp;lt;s&amp;gt;Editing function does not work as if Enter is not doing anything (rivo, gissi and idem-kde4) Annma cannot reproduce.&amp;lt;/s&amp;gt;&lt;br /&gt;
**Note by gissi: For me, only editing a cartesian plot doesn't work, the others work as expected. Don't know wether that's the same for rivo and idem.&lt;br /&gt;
***I confirm this too, i also confirm that it is a regression, it worked just fine few month ago (ELV13)&lt;br /&gt;
****Should be fixed on r750188 (aacid) (confirmed pvandewyngaerde)&lt;br /&gt;
* The cursor disappear when a dialog is open and the mouse go over the plot visualizer section&lt;br /&gt;
* zoom in/out buttons do not work (pvandewyngaerde)&lt;br /&gt;
* opening the &amp;quot;constants editor&amp;quot; from the &amp;quot;equation editor&amp;quot;, does not work before you close the &amp;quot;equation editor&amp;quot; (pvandewyngaerde)&lt;br /&gt;
&lt;br /&gt;
==== Marble ====&lt;br /&gt;
* &amp;lt;s&amp;gt;Navigate to Minneapolis (search is quick) and then zoom in until &amp;quot;saint paul&amp;quot; appears. Rotating up and down will now cause the text &amp;quot;saint paul&amp;quot; to jump around. (jstubbs)&amp;lt;/s&amp;gt; Works now. (mutlu_inek, rev. 751699)&lt;br /&gt;
* &amp;lt;s&amp;gt;In full screen mode, clicking in the right half of the globe doesn't work. It seems that plasma is getting the events? (jstubbs)&amp;lt;/s&amp;gt; Works now. (mutlu_inek, rev. 751699)&lt;br /&gt;
* Marble has to be restarted for the newly downloaded maps (KHotNewStuff2) to be integrated into the sidebar and therefore usable. (mutlu_inek, rev. 751699)&lt;br /&gt;
&lt;br /&gt;
== kdegames ==&lt;br /&gt;
&lt;br /&gt;
==== Kolf ====&lt;br /&gt;
* The colors chosen for the balls are not displayed. They're white (without compositing). (frank95com).&lt;br /&gt;
&lt;br /&gt;
==== Patience ====&lt;br /&gt;
* Some graphical glitches in Klondike with compiz enabled(Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
== kdegraphics ==&lt;br /&gt;
&lt;br /&gt;
==== Gwenview ====&lt;br /&gt;
* Random crashes when navigating to directories, or when editing the path manually. Backtrace http://pastebin.ca/760077 (luca_b)&lt;br /&gt;
* Gwenview is noticeably slower while loading the images than the stable 1.4.2 version (on the same system). It seems that the new version load entirely the image before showing it. Gwenview 1.4.2 show the image little by little that is better for the user experience. See bug report: {{bug|152275}} (mar nov 13 22:40:35 CET 2007, FiNeX)&lt;br /&gt;
* In the &amp;quot;view&amp;quot; mode, if the &amp;quot;zoom to fit option&amp;quot; is enabled and the gwenview window is smaller than the monitor resolution, when you navigate through images with &amp;quot;next&amp;quot; and &amp;quot;previous&amp;quot; buttons, the gwenview window will be resized to the max size for displaying the image. See bug {{bug|152276}} (mar nov 13 23:09:03 CET 2007, FiNeX)&lt;br /&gt;
* Problems while loading files without having read permissions. For a long description and some examples see: {{bug|152398}} (FiNeX)&lt;br /&gt;
* When rotating an image there are sometimes parts of the last rotation still visible and the image doesn't return to the centre of the window.http://img522.imageshack.us/img522/9755/gwenviewrotatecc9.th.jpg (open_)&lt;br /&gt;
** Confirmed, using r745387. (lucianolev)&lt;br /&gt;
&lt;br /&gt;
==== KSnapshot ====&lt;br /&gt;
&lt;br /&gt;
* Snapshots are saved with permissions 0600 rather than the current umask (jstubbs)&lt;br /&gt;
&lt;br /&gt;
==== okular ====&lt;br /&gt;
* Reviews cannot be removed from the Reviews sidebar using delete key.(lucianolev)&lt;br /&gt;
&lt;br /&gt;
==== Kolourpaint ====&lt;br /&gt;
* &amp;lt;s&amp;gt;Fonts look weird&amp;lt;/s&amp;gt; Fonts are fine for me. (mutlu_inek, rev. 743425)&lt;br /&gt;
* &amp;lt;s&amp;gt;urrent image size doesn't stand out - white on white background&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== kdelibs ==&lt;br /&gt;
&lt;br /&gt;
==== Phonon ====&lt;br /&gt;
* Can't get any sound to work. Chosen backend is xine. Tried to play an mp3 in juk. juk says its playing, but I get no sound. (mbiebl)&lt;br /&gt;
** Have you already tried to configure different main output from kcm_phonon to music category? Changing dev=0 output worked for me.. (teprrr)&lt;br /&gt;
* In the Phonon kcm module, dragging of devices in the priority list works, but it is not possible dropping them (eliasp)&lt;br /&gt;
** That's a bug in Qt, fixed in qt-copy patch 0194. See also http://trolltech.com/developer/task-tracker/index_html?id=181413&amp;amp;method=entry It still works (IIRC) if you press the SHIFT key while dragging.&lt;br /&gt;
&lt;br /&gt;
==== Oxygen - Style ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;konsole, Oxygen: the arrows of the right scrollbar are not visible (black on black). (mbiebl)&amp;lt;/s&amp;gt; Seems to be fixed. (mutlu_inek, rev. 743425)&lt;br /&gt;
* Too little contrast in the window-list from alt-tab shortcut, people with only slight visual problems won't be able to see the difference between selected/not selected (apaku)&lt;br /&gt;
* Missing widgets / invisible text in the side bar off application like marble or kalzium&lt;br /&gt;
* Close/minimize/maximise/make independant button in title bar and panel qt container are not similar. In panel container when they are highlighted, a square is painted over them. In title bar it is a circle. To get more coherence, both should be the same (square are nicer in my opinion).&lt;br /&gt;
* Oxygen window decoration is missing &amp;quot;keep above others&amp;quot; and &amp;quot;keep below others&amp;quot; functionality. (and possibly icons for them, too) (teprrr)&lt;br /&gt;
* Tabbar scroll buttons, when the tabs exceed the space available for the widget, are drawn on top of the rightmost tab: [[Image:Kopete_yahooconfig_oxygen_tab_bug.png]]&lt;br /&gt;
** Already reported: {{bug|152327}} (FiNeX)&lt;br /&gt;
** Fixed on latest revisions (FiNeX)&lt;br /&gt;
*** This still does not work for me at all. Does anyone else have this bug, too? (mutlu_inek, rev. 751699)&lt;br /&gt;
* There's an obvious flaw in the drawing of progress bars, which is only visible during the first 15% of the progress bar being filled. After a progress bar is filled up to 20% it looks nice. To reproduce, start a large download with Kget for example and you'll notice the flaw. (yojoe)&lt;br /&gt;
** Same here (_Brandon_) http://www.uploadgeek.com/uploads456/0/schermata3.png&lt;br /&gt;
*** already reported, {{bug|152640}}&lt;br /&gt;
*Too litte textbox in konqueror using 1152*864 resolution. The text is cut up and down, same for dolphin&lt;br /&gt;
* Konsole tabbar look odd and ugly (teddy)&lt;br /&gt;
* Menu mouse-over in menubar still missing (teddy)&lt;br /&gt;
&lt;br /&gt;
==== Oxygen - Icons ====&lt;br /&gt;
&lt;br /&gt;
* Chanel icons in KMix could use some Oxygenification (JLP)&lt;br /&gt;
* systemsettings: in Network &amp;amp; Connectivity group every item has the same icon. (teprrr)&lt;br /&gt;
* Juk is missing guess tags from filename icon (teprrr)&lt;br /&gt;
* A lot of missing icons in kinfocenter (FiNeX)&lt;br /&gt;
* &amp;lt;b&amp;gt;List of missing icons with screenshots&amp;lt;/b&amp;gt;:&lt;br /&gt;
** http://www.finex.org/missing_icons/ (FiNeX)&lt;br /&gt;
* No icon in krandrtray on systray (Meskalamdug)&lt;br /&gt;
* Some missing icons in Korganizer (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
==== Nepomuk ====&lt;br /&gt;
&lt;br /&gt;
* When you add ratings/comments to a file through Nepomuk and then you rename this file, the ratings/comments disappear. (Tyl3r)&lt;br /&gt;
** Reproducible also for me. ([[User:frank95com|frank95com]])&lt;br /&gt;
* Nepomuk won't start, I have enabled it with kcmshell4 kcm_nepomuk but it does not start. Every time I start kcmshell4 kcm_nepomuk, &amp;quot;Enable Nepomuk...&amp;quot; is unchecked again. (Meskalamdug)&lt;br /&gt;
** Reproducible also for me. However, according to the Service Manager in System Settings, the Nepomuk Server is automatically started and currently running. Also, Dolphin does not complain about Nepomuk not running. It offers that I can rate and tag files, but the entries are not actually recorded. (mutlu_inek, rev. 743425)&lt;br /&gt;
* Dolphin doesn't tag nothing. When yuo change file the tag\rating, etc.. disappears. Nepomuk and strigi are started and seems running.(Linusv2)&lt;br /&gt;
&lt;br /&gt;
==== KNS ====&lt;br /&gt;
* Sometimes KNS dialog is under Settings dialog (Kanagram and KStars) modal/non-modal issue when KNS is invoked from a Config dialog (jstubbs)&lt;br /&gt;
&lt;br /&gt;
==== KDElibs - Misc ====&lt;br /&gt;
* kbuildsycoca4 crashes on startup. Backtrace windows is displayed below splashscreen. After a while - everything goes down. Couldn't save backtrace, but last KDE entry was vfolder_menu.cpp:488. Next was qdebug. Using rev 741332 (macson_g)&lt;br /&gt;
* cannot write Right-To-Left...in kde3 when you start a line with a character of an rtl language, the line goes rtl automatically (emilsedgh)&lt;br /&gt;
** Well, for me it does write RTL, but the text is not right-aligned as in KDE3, but left-aligned which is indeed a bug. (mutlu_inek, rev. 743425)&lt;br /&gt;
* Configure shortcuts dialog is too small at start: I cannot see the action name at all (it says stuff like 'C...' instead of 'Close'). Furthermore, and much worse: I cannot change the width of the columns at all to try to make the action names readable! (BCoppens)&lt;br /&gt;
* I can reproduce this behaviour e.g. with okular or kbounce, but not whith kwin4 or kgouldrunner: open okular, resize it, close it -- when reopened it will have the same size as before. Now maximize the window and close the app. When you restart the app it has it's default size. (Trigger7)&lt;br /&gt;
** I can confirm this. (mutlu_inek, rev. 743425)&lt;br /&gt;
** This bug seems to be related with {{bug|137108}}. Don't know a person but me which can reproduce it right now - please speak up if you can! Pinotree thinks this is a kdelibs bug and no bug in the applications. You can find an very ugly screen cast shich shows the problem here: http://alioth.debian.org/~trigger-guest/resizing-windows.ogg (Trigger7)&lt;br /&gt;
** I can reproduce this here. kpdf in KDE3 will restart maximized, however if you click the restore button, it returns to the default window size, which is too small. (auxsvr)&lt;br /&gt;
* When you make an application's toolbar locked, the next time you start the application the toolbar is not locked. (brumgabrasch)  {{bug|152263}}&lt;br /&gt;
* When you make an application's toolbar float, the next time you start the application the toolbar becomes a glitch.&lt;br /&gt;
*** Test case: http://www.mediafire.com/?5xjgdxttclt&lt;br /&gt;
*** Screenshot: http://img256.imageshack.us/img256/3091/glitchxi2.png&lt;br /&gt;
*** Steps to reproduce:&lt;br /&gt;
**** Run KWrite&lt;br /&gt;
**** Make the toolbar float&lt;br /&gt;
**** Exit it and run it again&lt;br /&gt;
*** Might be related:&lt;br /&gt;
**** The floating toolbars no longer have a title bar or a border&lt;br /&gt;
**** The &amp;quot;Toolbar Menu-&amp;gt;Orientation&amp;quot; menu no longer have &amp;quot;flat&amp;quot; or &amp;quot;floating&amp;quot;&lt;br /&gt;
** I can confirm this. (mutlu_inek, rev. 743425)&lt;br /&gt;
** Mek: using Qt 4.4 snapshot this is fixed&lt;br /&gt;
* &amp;lt;s&amp;gt;When trying to hear an audio preview (Right click on an audio file -&amp;gt; Properties -&amp;gt; Preview) the UI appears completely messed up (luca_b).&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;Should be fixed. Please confirm. (Vir)&amp;lt;/s&amp;gt;&lt;br /&gt;
*** Works. (teprrr and eliasp)&lt;br /&gt;
* The now fixed audio preview dialog could use some further improvements. Currently, it's very hard doing a seek on a long track due to the really short seek bar. Here's a quick'n'dirty mockup how it could be done: http://eliasprobst.eu/~elias/stuff/screenshots/kde4-issues/kfileaudiopreview-seekbar-redesign.png (eliasp)&lt;br /&gt;
* &amp;lt;s&amp;gt;Invisible menu bar disable shortcuts:&amp;lt;/s&amp;gt; {{bug|152519}} (FiNeX) Fixed on 744418&lt;br /&gt;
* The items in the &amp;quot;select folder&amp;quot; dialogue are not sorted. (rabauke)&lt;br /&gt;
* Double-clicking folders on the &amp;quot;select folder&amp;quot; dialogue does not expand them. (rabauke)&lt;br /&gt;
* Playing an audio preview (rightclick → properties → preview), the audio preview is played using the ''Video'' channel defined in Phonon's settings. The preview component should be able to decide, based on the MIME type (audio or video), whether to do the play the sound using the ''Video'' or ''Music'' channel of Phonon. It's easy to reproduce if you have more than one soundcard. (eliasp)&lt;br /&gt;
** Vir added a 'fix' to do the playback using the ''NoCategory'' Phonon channel. Now we're waiting, until NoCategory is configurable using kcm phonon ;-) (eliasp)&lt;br /&gt;
* Filedialog: It should be possible jumping to the address bar using F6/the default shortcut, like it's possible in Konqueror. (eliasp)&lt;br /&gt;
* In Kfind if you start deleting something that you have found while search is in progress, the delete progress window appear, but it don't want to stay in top of kfind. Kfind always stays on top with this window.(Linusv2)&lt;br /&gt;
&lt;br /&gt;
==== IO-slaves ====&lt;br /&gt;
* smb:/ ioslave causes crash (nixternal) (kakalto) - {{bug|152838}}&lt;br /&gt;
* smb:/ ioslave does not work with shares that need authentication. Console output: http://pastebin.ca/760196 (luca_b)&lt;br /&gt;
* The sftp:/ (scp:/ and others probably too) display '%2F' instead of '/' at the end of a path during autocompletion. Screenshot: http://eliasprobst.eu/~elias/stuff/screenshots/kde4-issues/sftp-auto-completion.png (eliasp)&lt;br /&gt;
* Setting permissions (rwx) of a file via sftp:/ doesn't work. It just doesn't change anything. (eliasp)&lt;br /&gt;
* file transfer from smb-shares stalls, {{bug|153054}}&lt;br /&gt;
&lt;br /&gt;
==== KHTML ====&lt;br /&gt;
* There is no real font shrinking and enlarging available in apps that use khtml (I tested Konqueror and Akregator), only full page shrink/enlarge. This '''must''' be there in 4.0, IMO this is absolutely a release blocker. (If this functionality is available in KHTML and apps only don't use it, this bug note should be moved to all apps needing font shrink/enlarge but currently not implementing it) (gissi)&lt;br /&gt;
* Using full page shrink causes some graphical glitches (e.g. extremely unsharp font, displaced items). See [http://www.picupload.net/f-445754ac45c90a8218f6851003895e49.png Screenshot]. (gissi)&lt;br /&gt;
&lt;br /&gt;
==== Directory Browser ====&lt;br /&gt;
The directory browser (e.g. Rightclick on Desktop → Configure Desktop → Slideshow → Add Directory) doesn't have the option to display hidden directories (rightclick in the browser → show hidden directories). So it's not possible adding ~/.kde/share/wallpapers to the Slideshow in this case. (eliasp)&lt;br /&gt;
&lt;br /&gt;
== kdemultimedia ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Juk ====&lt;br /&gt;
* Too much columns in default setting. Not a bug but a bad looking thing. (frank95com)&lt;br /&gt;
* When retrieving covers from the internet, a lot of 'transfer dialog' windows pop up and covering the whole screen for a moment. (eliasp)&lt;br /&gt;
** I can confirm this. (mutlu_inek, rev. 743425)&lt;br /&gt;
* Also, the cover is not actually shown in the &amp;quot;cover&amp;quot; column (instead there is a placeholder pic). (mutlu_inek, rev. 743425)&lt;br /&gt;
* JuK needs to be restarted to apply a changed output device of the Phonon 'Music' channel. (eliasp)&lt;br /&gt;
&lt;br /&gt;
==== KMix ====&lt;br /&gt;
* The kmix icon in the system tray always shows 0% volume and doesn't respond to mouse wheel movement. (auxsvr)&lt;br /&gt;
** This happens when the default master channel is PCM. Trying to change to front it shows the volume percentage. (frank95com)&lt;br /&gt;
** I have an USB soundcard that only provides PCM, nothing else... I'd like to be able using volume change on scrolling + showing volume percentage. It worked in KDE 3.5.x. (eliasp)&lt;br /&gt;
*** I have a &amp;quot;solution&amp;quot; for this bug:select other master channel(whateveryouwant) then reselect pcm,then close and reopen kmix,you will find the volume in tray working. (Meskalamdug)&lt;br /&gt;
* wish: the checkbox to mute/unmute and output/input isn't very intuitive. Can I suggest something like this? (http://www.box.net/shared/quc0dkrx8t). (frank95com)&lt;br /&gt;
** vote++ (eliasp)&lt;br /&gt;
* The default layout of the KMix window should be changed at some points (eliasp): &amp;lt;s&amp;gt;has been fixed.&amp;lt;/s&amp;gt; Didn't change at all ;-( (Yes, I've deleted my config-files..!) (eliasp)&lt;br /&gt;
http://eliasprobst.eu/~elias/stuff/screenshots/kde4-issues/kmix-window-layout.png&lt;br /&gt;
** The window height should be increased or a minimal value should be set as it is currently not obvious, that the lower buttons are volume sliders - they look just like a button you can't click.&lt;br /&gt;
** There's a lot of unused space on the bottom.&lt;br /&gt;
** The default window width should be slightly increased - it looks a little bit squeezed.&lt;br /&gt;
* don't change the master channel: http://www.mancausoft.org/kmix_4.png (mancausoft)&lt;br /&gt;
&lt;br /&gt;
==== kscd ====&lt;br /&gt;
* crashes when inserting a CD. Problem is an assert thats hit http://pastebin.ca/769076 (apaku)&lt;br /&gt;
* another backtrace for above (looks different) http://pastebin.ca/768571 (yuriy)&lt;br /&gt;
* Eject button doesn't work (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
== kdenetwork ==&lt;br /&gt;
&lt;br /&gt;
==== Kopete ====&lt;br /&gt;
* Kopete crashes while connecting to my GTalk account (shortly after the contact list is loaded). See {{bug|152874}}&lt;br /&gt;
* When creating an account in Kopete I chose to use KWallet to store my passwords. After which KWallet brings up it's dialog to enter the password, but the Kopete settings window switches to being the window that's on top (but not focused) when interacting with the KWallet dialog, and vice versa, KWallet is on top when clicking on the settings window. (open_)&lt;br /&gt;
* In the Settings drop-down menu there are tickable options which change from Show to Hide whether they are ticked or unticked. Personally it looks like the program is malfunctioning if Hide Offline Users is ticked and I can see offline users. (open_)&lt;br /&gt;
** Confirmed. The text shouldn't change for ToggleActions in the menu, and the tooltip for the Show All button always displays the wrong tooltip. (Earthwings)&lt;br /&gt;
* Adding a msn contact(valid) produce..nothing (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
==== Akregator ====&lt;br /&gt;
* Akregrator provides currently no tabbing functionality at all. Neither is it possible to open an article using 'Rightclick -&amp;gt; Open in tab' nor using 'Middleclick' (when having it configured this way). It is only possible opening articles in an external browser. (eliasp).&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;s&amp;gt;Marking feeds or messages as Read does not work. Even when reading a message, it is not marked as read. ([[User:Kleag|Kleag]] 23:46, 7 November 2007 (CET))&amp;lt;/s&amp;gt; - fixed in [http://websvn.kde.org/?view=rev&amp;amp;revision=734910 734910]&lt;br /&gt;
** Marking feeds as Read is still broken for me. (yuriy)&lt;br /&gt;
*If a feed is deleted, the feed tree view is folded up completely. ([[User:Icwiener|Icwiener]] 03:48, 10 November 2007 (CET))&lt;br /&gt;
**Confirmed. Tree view is currently reset when something has changed. -- [[User:Eckhart|Eckhart]] 14:19, 10 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
*Shortcuts for increasing and decreasing font size in View menu are not shown completely (here &amp;quot;Ctrl+&amp;quot; for both) ([[User:Icwiener|Icwiener]] 13:11, 17 November 2007 (CET))&lt;br /&gt;
**Confirmed, same thing also in &amp;quot;Go&amp;quot; menu. -- [[User:Eckhart|Eckhart]] 12:57, 18 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
*Doesn't remember the width of the columns in the feed list panel and the &amp;quot;article&amp;quot; column in the article list panel cannot be resized. See {{bug|152702}} (FiNeX)&lt;br /&gt;
&lt;br /&gt;
*When Multiple articles are highlighted and ^U is pressed only one has it's flag changed to unread. (DaSkreech)&lt;br /&gt;
&lt;br /&gt;
* When using 'Mark Feed as Read' the 'Unread' value in the feed list on the left isn't updated until clicking somewhere else again. (eliasp)&lt;br /&gt;
** Confirmed. -- [[User:Eckhart|Eckhart]] 12:40, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
* There is no visual feedback, whether a feed still contains unread articles (e.g. bold feed name in feed list) (eliasp)&lt;br /&gt;
** Confirmed. -- [[User:Eckhart|Eckhart]] 12:40, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
* When trying to delete an article the selected count is three times bigger than the selected articles. (msoeken) {{bug|152949}}&lt;br /&gt;
** Confirmed. -- [[User:Eckhart|Eckhart]] 01:01, 26 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
* After deleting an article a list entry with no text is left. (msoeken) {{bug|152949}}&lt;br /&gt;
** Confirmed. -- [[User:Eckhart|Eckhart]] 01:01, 26 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
* When marking an article as important and then clicking on other articles, the flags are changing from one article to other ones. (msoeken)&lt;br /&gt;
** Confirmed. -- [[User:Eckhart|Eckhart]] 12:40, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
*In the context menu (right click) of an article the icon for the option &amp;quot;Mark as important&amp;quot; is an envelope. (Carutsu)&lt;br /&gt;
&lt;br /&gt;
==== KGet ====&lt;br /&gt;
* Again the corrupt download problem:i try http://fpdownload.macromedia. com/get/flashplayer/current/install_flash_player_9_linux.tar.gz and i get a corrupted file (Meskalamdug)&lt;br /&gt;
** Are you saying that a previous problem crept in again? I tried the link and it worked for me. (mutlu_inek, rev. 752265)&lt;br /&gt;
*** Ok,solved now.Works fine (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
== KDEPIM ==&lt;br /&gt;
&lt;br /&gt;
Please report bugs to [http://bugs.kde.org the KDE bugtracker]. There is not enough space here for meaningful reports, and it is hard to discuss or track them here.&lt;br /&gt;
&lt;br /&gt;
Make sure you include enough details in your reports.&lt;br /&gt;
&lt;br /&gt;
For crashes, read [[Development/Tutorials/Debugging/How_to_create_useful_crash_reports|this article]] first.&amp;lt;br&amp;gt;&lt;br /&gt;
For normal bugs, read [http://www.chiark.greenend.org.uk/~sgtatham/bugs.html this article].&lt;br /&gt;
&lt;br /&gt;
== kdeutils ==&lt;br /&gt;
&lt;br /&gt;
==== Ark ====&lt;br /&gt;
* &amp;lt;s&amp;gt;Ark support only zip and raw cd images (Meskalamdug)&amp;lt;/s&amp;gt; This is fixed now. Thanks a lot! :)  (mutlu_inek, rev. 752605)&lt;br /&gt;
* Adding files to archives does not work. (mutlu_inek, rev. 752605)&lt;br /&gt;
* If I select several files that reside in an archive and unselect them, they are still selected in the &amp;quot;size&amp;quot; column. (mutlu_inek, rev. 752605)&lt;br /&gt;
* Drag &amp;amp; drop does not work. (mutlu_inek, rev. 752605)&lt;br /&gt;
* Deleting files in archives does not work. (mutlu_inek, rev. 752605)&lt;br /&gt;
* If the files in the archive reside inside a folder, the folder is ignored and the files are extracted directly into the target folder. (mutlu_inek, rev. 752605)&lt;br /&gt;
* Ark open tar.gz ok,but create only zip archives or raw cd (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
==== Kinfocenter ====&lt;br /&gt;
* Most of the Items are empty (emilsedgh)&lt;br /&gt;
&lt;br /&gt;
==== KCalc ====&lt;br /&gt;
* &amp;lt;s&amp;gt;Under Settings-&amp;gt;Configure KCalc...-&amp;gt;General-&amp;gt;Precision there is a spin box labelled &amp;quot;Maximum number of digits:&amp;quot;. You can type numbers from 0-99 in it but it can be rotated (with the arrow buttons) up to 200. ([[User:Icwiener|Icwiener]] 03:34, 10 November 2007 (CET))&amp;lt;/s&amp;gt; Fixed. (mutlu_inek, rev. 752265)&lt;br /&gt;
* &amp;lt;s&amp;gt;The window becomes way too wide when chosen high precicion. It's what the user wants if he sets the precision that high, but couldn't there be another solution than expanding the window beyond the screen borders? ([[User:Icwiener|Icwiener]] 03:34, 10 November 2007 (CET))&amp;lt;/s&amp;gt; I have a small screen (1024x768) and it does not even fill half of it. I condider this fixed. (mutlu_inek, rev. 752265)&lt;br /&gt;
* &amp;lt;s&amp;gt;The dialog &amp;quot;Configure KCalc&amp;quot; is way too tall, and the space is not even needed. (Carutsu)&amp;lt;/s&amp;gt; Fixed. (mutlu_inek, rev. 752265)&lt;br /&gt;
* &amp;lt;s&amp;gt;After enabling some buttons under Settings (such as Science buttons or Statistic buttons) when you disable them the application doesn't resize back to the smaller size it needs now. (Carutsu)&amp;lt;/s&amp;gt; Fixed. (mutlu_inek, rev. 752265)&lt;br /&gt;
&lt;br /&gt;
==== KHexEdit ====&lt;br /&gt;
* In Settings-&amp;gt;Configure KHexEdit...-&amp;gt;Files there is an option &amp;quot;Do not save 'Recent' document list on exit&amp;quot;. This is a negative option. &amp;quot;Yes, I do not want to have them saved&amp;quot; &amp;lt;- odd ([[User:Icwiener|Icwiener]] 03:34, 10 November 2007 (CET))&lt;br /&gt;
&lt;br /&gt;
==== KRegExpEditor ====&lt;br /&gt;
* On the info page on startup, the &amp;quot;littler than&amp;quot; sign '&amp;amp;lt;' for the email address at the end of the page is not drawn. ([[User:Icwiener|Icwiener]] 03:34, 10 November 2007 (CET))&lt;br /&gt;
* When typing &amp;quot;a+&amp;quot; (without quote chars), KRegExpEditor crashes ([http://pastebin.ca/768287 backtrace]) -- [[User:Eckhart|Eckhart]] 15:09, 10 November 2007 (CET)&lt;br /&gt;
** confirmed in revision 737446 (FiNeX)&lt;br /&gt;
&lt;br /&gt;
==== kgpg ====&lt;br /&gt;
* Gpg-agent won't start,i put it in .kde4/Autostart but at every kde start..kgpg said &amp;quot;The use of GnuPG Agent is enabled in GnuPG's configuration file (/home/giuseppe/.gnupg/gpg.conf).However, the agent does not seem to be running. This could result in problems with signing/decryption.Please disable GnuPG Agent from KGpg settings, or fix the agent&amp;quot; my script syntax is &amp;quot;#!/bin/sh eval &amp;quot;$(gpg-agent --daemon)&amp;quot; (Meskalamdug)&lt;br /&gt;
** Probably is a Konsole problem,gpg-agent is running but no $GPG_AGENTINFO like kde3 (Meskalamdug)&lt;br /&gt;
* Kpgp don't generate keys if under 1024 (Meskalamdug)&lt;br /&gt;
&lt;br /&gt;
== fileshare module ==&lt;br /&gt;
* file share config dialog crash adding shared folders. See {{bug|152989}} (FiNeX)&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T21:19:18Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Finish up the file saving stuff. Loading coming next...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=KCmdLineArgs (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful. At the most basic, a text editor needs to be able to load files from disc, save files that you've created/edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we declare a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving. This will all be happening in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have our file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = outputFileName;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====saveFileAs()====&lt;br /&gt;
&lt;br /&gt;
This is the function that the &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt; slot is connected to. It simply calls the generic &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; function and passes the file name returned by &amp;lt;tt&amp;gt;{{class|KFileDialog}}::[http://api.kde.org/4.0-api/kdelibs-apidocs/kio/html/classKFileDialog.html#8891356c249c5911e1ab15cc2739a89b getSaveFileName()]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This our first actual use of the KIO library. {{class|KFileDialog}} provides a number of static functions for displaying the common file dialog that is used by all KDE applications. Calling &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; will display a dialog where the user can select the name of the file to save to or choose a new name. The function returns the full file name, which we then pass to &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====saveFile()====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There's nothing exciting or new in this function, just the logic to decide whether or not to show the save dialog. If &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is not empty, then the file is saved to &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. But if it is, then the dialog is shown to allow the user to select a file name.&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to KCmdLineArgs (TODO [[User:milliams]]).&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T19:50:59Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Proofreading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=KCmdLineArgs (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful. At the most basic, a text editor needs to be able to load files from disc, save files that you've created/edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we declare a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving. This will all be happening in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have our file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName = outputFileName;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to KCmdLineArgs (TODO [[User:milliams]]).&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Milliams</id>
		<title>User:Milliams</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Milliams"/>
				<updated>2007-12-26T19:34:01Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Currently working on [http://websvn.kde.org/trunk/playground/games/ksquares/ KSquares], various parts of KDE Games and a new version of KEduca.&lt;br /&gt;
&lt;br /&gt;
Website/blog found at [http://milliams.com milliams.com].&lt;br /&gt;
&lt;br /&gt;
I'm responsible for the '''Introduction To KDE 4 Programming''' tutorial series on [[Development/Tutorials]].&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T19:32:03Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: A bit of planning ahead&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files (Under construction [[User:milliams]])|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=KCmdLineArgs (TODO [[User:milliams]])| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful.At the most basic a text editor needs to be able to load files from disc, save files that you've created or edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we create a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving.&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have out file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to KCmdLineArgs (TODO [[User:milliams]]).&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T19:18:35Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: All the info on KSaveFile&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful.At the most basic a text editor needs to be able to load files from disc, save files that you've created or edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we create a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //new&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Okay, now to implement the code that will do the loading and saving.&lt;br /&gt;
&lt;br /&gt;
The first thing we do is add&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
fileName(QString())&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
to the &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; constructor list on line 16. This makes sure that &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; is empty right from the beginning.&lt;br /&gt;
&lt;br /&gt;
===Adding the actions===&lt;br /&gt;
&lt;br /&gt;
The first thing we are going to do is provide the outward interface for the user so they can tell the application to load and save. Like with the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action in tutorial 3, we will use &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. On lines 37 to 47 we add the actions in the same way as for the &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; action. For each one, we connect it to the appropriate slot that we declared in the header file.&lt;br /&gt;
&lt;br /&gt;
===Creating a new document===&lt;br /&gt;
&lt;br /&gt;
The first function we create is the &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; sets the &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; QString to be empty to reflect the fact that this document does not yet have a presence on disc. &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; then clears the central text area using the same function that we connected the &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; to in tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Saving a file===&lt;br /&gt;
&lt;br /&gt;
Now we get onto our first file handling code. We're going to implement a function which will save the contents of the text area to the file name given as a parameter. KDE provides a class for safely saving a file called {{class|KSaveFile}} which is derived from Qt's {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
The function's prototype is&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We then create our &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; object and open it with&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KSaveFile file(outputFileName);&lt;br /&gt;
file.open();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have out file to write to, we need to format the text in the text area to a format which can be written to file. For this, we create a {{qt|QByteArray}} and fill it with the plain text version of whatever is in the text area:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Now that we have our &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, we use it to write to the file with &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. If we were using a normal &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, this would make the changes immediately. However, if a problem occurred partway through writing, the file would become corrupted. For this reason, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; works by first writing to a temporary file and then, when you call &amp;lt;tt&amp;gt;KSaveFile::finalize()&amp;lt;/tt&amp;gt; the changes are made to the actual file.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
file.write(outputByteArray);&lt;br /&gt;
file.finalize();&lt;br /&gt;
file.close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Finally, we set &amp;lt;tt&amp;gt;MainWindows&amp;lt;/tt&amp;gt;'s &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; member to point to the file name we just saved to.&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials</id>
		<title>Development/Tutorials</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials"/>
				<updated>2007-12-26T19:04:56Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Introduction To KDE 4 Programming */ Add newest tutorial to main page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Tutorials are the fastest way of finding out what KDE will do for you, and how to do it. Here is a list of currently available tutorials '''for KDE4'''. Material for KDE3 and KDE2 is available on the bottom of this page.&lt;br /&gt;
&lt;br /&gt;
== Introduction To KDE 4 Programming ==&lt;br /&gt;
Are you interested in writing applications with KDE 4? This tutorial series is aimed at those completely new to KDE programming.&lt;br /&gt;
;[[Development/Tutorials/First program|Hello World]]&lt;br /&gt;
:''A preliminary introduction to the very basics of KDE4 programming''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow|Creating the Main Window]]&lt;br /&gt;
:''This tutorial shows you the magic of an application's most important thing: The main window.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions|Using KActions]]&lt;br /&gt;
:''How to add actions to the menus and toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Saving and Loading]]&lt;br /&gt;
:''Introduces the KIO library while adding loading and saving support to our application.''&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Porting Your Application]]&lt;br /&gt;
:''Help Porting Applications from Qt3/KDE3 to Qt4/KDE4''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introduction to CMake]]&lt;br /&gt;
:''How to use the CMake build system used by KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Common Programming Mistakes]]&lt;br /&gt;
:''Various common mistakes made while developing Qt and KDE applications and how to avoid them.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Using Qt Designer to build user interfaces]]&lt;br /&gt;
:''How to create UI files with designer, and how to integrate them into a KDE program.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Command-Line Options|Using Command-line Options]]&lt;br /&gt;
:''Processing and accessing command-line arguments the easy way with KDE's command line arguments classes.''&lt;br /&gt;
&lt;br /&gt;
== Testing And Debugging ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Debugging your application]]&lt;br /&gt;
:''Tips, tools and techniques to apply when debugging your KDE application''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Writing Unittests for Qt4 and KDE4 with QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html Original link])&lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to write unit tests using the QTestLib framework. It is presented as an example based tutorial, and is still under development.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Semi-automatic ways to detect code errors]]&lt;br /&gt;
:''Techniques you can use to detect errors in KDE code''&lt;br /&gt;
&lt;br /&gt;
== Managing Configuration Data With KConfig ==&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introduction To KConfig]]&lt;br /&gt;
:''An overview of the KConfig classes and how to use them in your application code''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Using KConfig XT]]&lt;br /&gt;
:''Tutorial on how to efficiently use the KConfig XT framework.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Updating KConfig Files]]&lt;br /&gt;
:''Tutorial on how to write an update script to keep changes in your application's config file format in sync with the user's already existing config file''&lt;br /&gt;
&lt;br /&gt;
== Services: Applications and Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introduction to the Services Framework]]&lt;br /&gt;
:''An overview of the services framework in KDE and what it provides the application developer. Covers the system configuration cache (SyCoCa), the source data files and what the indexed information can be used for.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Finding Services Using Trader Queries]]&lt;br /&gt;
:''How to find services, such as plugins or mimetypes, that are indexed in the SyCoCa using Trader Query Syntax''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Creating and Loading Plugins Using KService]]&lt;br /&gt;
:''Learn how to define custom plugin types, find installed plugins (including 3rd party plugins) and load them in an easy and portable fashion using KService.''&lt;br /&gt;
&lt;br /&gt;
== Localization ==&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introduction To Unicode]]&lt;br /&gt;
:''An introduction to what Unicode is as well as how to handle Unicode data in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n|Writing Applications With Localization In Mind]]&lt;br /&gt;
:''This tutorial covers what localization is, why it's important and how to ensure your application is ready to be localized. A must read for all application developers.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Mistakes|Avoiding Common Localization Pitfalls]]&lt;br /&gt;
:''There are several common mistakes that prevent applications from being properly localized. Find out what they are and how to easily avoid them in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Building KDE's Localization Module]]&lt;br /&gt;
:''Building and installing language support from KDE's localization (l10n) module is a good idea for those working on applications in the main KDE repository. Doing so will allow you to test your application in another language and spot problem areas. Learn how to do just that in this tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporating i18n Into the Build System]]&lt;br /&gt;
:''Once your application is ready to be localized, the next step is to ensure that translation files are built automatically and kept up to date. This tutorial covers the necessary CMakeFiles.txt additions as well the process of distributing the resulting message catalogs with your application.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Common i18n Challenges and Solutions]]&lt;br /&gt;
:''This tutorial covers challenges that you may eventually run into such as translating handbooks and other data that exists outside of the source code, merging and handling obsolete .po files, dealing with freezes, coding in languages other than English and creating independent releases of or moving applications between KDE modules.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n_Semantics|Semantic Markup of Messages]]&lt;br /&gt;
:''To ensure consistent presentation and more meaningful representations of messages in applications, semantic markup can be applied to messages marked for translation using the KUIT system. This tutorial describes how this system works.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Automated i18n Code Checking]]&lt;br /&gt;
:''The Krazy code checker scans KDE's code and reports common i18n mistakes.''&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/API_Documentation|API Documentation]]&lt;br /&gt;
:''This tutorial explains how to document your APIs properly.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Man_Pages|Man Pages]]&lt;br /&gt;
:''Writing and Generating Reference Manual Pages.''&lt;br /&gt;
&lt;br /&gt;
== Application Automation and Scripting ==&lt;br /&gt;
&lt;br /&gt;
=== D-Bus ===&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Introduction|Introduction to D-Bus]]&lt;br /&gt;
:''A straight-forward introduction to the core concepts in D-Bus from an application developer's perspective, this tutorial covers what D-Bus is and how it can be used by applications.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Accessing Interfaces|Accessing D-Bus Interfaces]]&lt;br /&gt;
:''A step-by-step guide to calling D-Bus methods and connecting to D-Bus signals using QtDBus.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Intermediate_D-Bus|Intermediate D-Bus]]&lt;br /&gt;
:''Tips to make use of QtDBus when faced with problematic real-world interfaces.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Creating Interfaces|Creating D-Bus Interfaces]]&lt;br /&gt;
:''Learn how to expose functionality in your application by creating and using custom D-Bus interfaces. Covers generating the XML descriptions, instantiating interfaces at run time and setting up the build system with CMake.''&lt;br /&gt;
; [[Development/Tutorials/D-Bus/Autostart Services|D-Bus Autostart Services]]&lt;br /&gt;
:''Turn your application into a D-Bus autostart service with this tutorial. This D-Bus feature, also known as &amp;quot;D-Bus service activation&amp;quot;, will ensure that even when your application isn't running that D-Bus calls made to it will work by relying on the D-Bus daemon itself to start your app if and when needed.''&lt;br /&gt;
; [[Development/Tutorials/Porting_to_D-Bus|Porting from DCOP to D-Bus]]&lt;br /&gt;
: ''Port your applications from DCOP to D-Bus with this handy guide.''&lt;br /&gt;
&lt;br /&gt;
=== Konqueror ===&lt;br /&gt;
; [[Development/Tutorials/Creating Konqueror Service Menus|Creating Konqueror Service Menus]]&lt;br /&gt;
:''This tutorial shows you how to create mimetype-specific actions in Konqueror's context menu (aka &amp;quot;servicemenus&amp;quot;).''&lt;br /&gt;
&lt;br /&gt;
=== Kross ===&lt;br /&gt;
; [[Development/Tutorials/Kross/Introduction|Introduction to Kross]]&lt;br /&gt;
:''An introduction to the Kross Scripting Framework.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Hello_World|Hello World]]&lt;br /&gt;
:''A first application with working kross code.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Connecting_Signals_and_slots_in_Kross|Connecting Signals and Slots in Kross]]&lt;br /&gt;
:''Simple demonstration of connecting object signals with script slots''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Kross/Scripts-as-Plugins|Scripts as Plugins with Kross]]&lt;br /&gt;
:''This tutorial provides a step-by-step introduction how to integrate scripts as plugins into a KDE application.''&lt;br /&gt;
&lt;br /&gt;
=== KOffice ===&lt;br /&gt;
; [[Development/Tutorials/KOffice Overview|KOffice Overview]]&lt;br /&gt;
:''This document shows an overview of the different KOffice plugin types and tells you what each of their purpose and strengths are.''  If you are new with KOffice plugins, this is the place to start.&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Write a Flake Plugin|Creating KOffice Flake Plugins]]&lt;br /&gt;
:''This tutorial shows you how you can build a plugin for KOffice applications to allow you embed content in ODF documents using Flake.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/KWord Scripting|KWord Scripting]]&lt;br /&gt;
:''This tutorial shows how to script KWord with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/KSpread Scripting|KSpread Scripting]]&lt;br /&gt;
:''This tutorial shows how to script KSpread with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Krita Scripting|Krita Scripting]]&lt;br /&gt;
:''This tutorial shows how to script Krita with Python, Ruby or JavaScript using Kross.''&lt;br /&gt;
&lt;br /&gt;
=== SuperKaramba ===&lt;br /&gt;
; [[Development/Tutorials/SuperKaramba|SuperKaramba Tutorial]]&lt;br /&gt;
:''This tutorial provides an overview of SuperKaramba, theme files and scripting with Python, Ruby and JavaScript.''&lt;br /&gt;
&lt;br /&gt;
== Search and Metadata ==&lt;br /&gt;
&lt;br /&gt;
=== Strigi ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Writing file analyzers|Writing file analyzers]]&lt;br /&gt;
:''File analyzers extract data from files to display in the file dialogs and file managers. The data gathered this way is also used to search for files. KDE4 allows the use of multiple analyzers per file type. This tutorial describes how you can write new analyzers.''&lt;br /&gt;
&lt;br /&gt;
=== Nepomuk ===&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Metadata/KMetaData first steps|Nepomuk first steps]]&lt;br /&gt;
:''Nepomuk is the KDE library which provides easy access to metadata in the [http://nepomuk-kde.semanticdesktop.org Nepomuk-KDE] system. Learn how to make your application create and read metadata using the Nepomuk system.''&lt;br /&gt;
&lt;br /&gt;
== Hardware Awareness (Solid) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Tutorials|Introduction to Solid]]&lt;br /&gt;
:''An introduction to using the Solid hardware discovery and interaction system in KDE applications.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Solid_Network_Tutorial|Accessing Network Information]]&lt;br /&gt;
:''How to use the Solid system to get information about the network''&lt;br /&gt;
&lt;br /&gt;
== Multimedia (Phonon) ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Phonon/Introduction|Phonon]]&lt;br /&gt;
:''How to start with the multimedia API''&lt;br /&gt;
&lt;br /&gt;
:''How to compile and use Phonon and its GStreamer backend on Linux using Qt 4.3.x''&lt;br /&gt;
::''This article gives you a quick brief of how you can use checkout, compile Phonon and its GStreamer backend on GNU/Linux with just Qt 4.3.x. Towards the end, the article also describes how a developer can make use of Phonon to create simple audio and video players. You can read the article [http://www.vcreatelogic.com/oss/docs/CompilingPhononOnLinux.pdf here]. You can download the editable OpenDocumentText file from [http://www.prashanthudupa.com/phonon/CompilingPhononOnLinux.odt here].''&lt;br /&gt;
&lt;br /&gt;
== Plasma ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first Plasma widget, or Plasmoid, in C++ with an SVG background, an icon and some text''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Writing A DataEngine]]&lt;br /&gt;
:''DataEngines provide a standardized interface to various data sources for visualizations to use. Learn what a DataEngine is and how to write one of your own.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Using DataEngines in Plasmoids]]&lt;br /&gt;
:''With a DataEngine, it is possible to retrieve data for display in a simple and standard way. This tutorial covers the topic of how to use DataEngines for this purpose in Plasmoids.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Creating Runners]]&lt;br /&gt;
:''Runners are plugins that provide action-based search functionality in the Plasma workspace &amp;quot;run command&amp;quot; dialog. These plugins can be used by any application that links again libplasma.''&lt;br /&gt;
&lt;br /&gt;
== Kate / Kwrite ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Kate/KTextEditor Plugins|Getting Started With KTextEditor Plugins]]&lt;br /&gt;
:''Creating your first KTextEditor plugin''&lt;br /&gt;
&lt;br /&gt;
==Printing==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Hello World|Hello World]]&lt;br /&gt;
:''Introduction to the KDE printing system''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Printing Print Dialog|Print Dialog]]&lt;br /&gt;
:''Using the KDE print dialog''&lt;br /&gt;
&lt;br /&gt;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/Introduction to Get Hot New Stuff|Introduction to Get Hot New Stuff]]&lt;br /&gt;
:''An introduction to the developer-friendly network update system that allows KDE applications to fetch new application data at runtime in a user friendly manner.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KNewStuffSecure|KNewStuff Secure]] ([http://developer.kde.org/documentation/tutorials/knewstuffsecure/index.html Original Link])&lt;br /&gt;
:''Tutorial showing how to share resources in a secured way (KDE 3.4 and later).''  By Andr&amp;amp;#225;s Mantia &amp;amp;lt;amantia@kde.org&amp;amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Rapid Application Development ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Python introduction to signals and slots|101 Introduction to signals and slots]]&lt;br /&gt;
:''A simple introduction to Qt's signal and slot architecture.''&lt;br /&gt;
&lt;br /&gt;
=== Ruby ===&lt;br /&gt;
&lt;br /&gt;
;[http://developer.kde.org/language-bindings/ruby/kde3tutorial/index.html KDE Ruby Korundum tutorial]&lt;br /&gt;
:''A ruby version of Antonio Larrosa Jim&amp;amp;eacute;nez's KDE tutorial by Richard Dale. See the [http://developer.kde.org/language-bindings/ruby/index.html Ruby Developers Corner] for Qt tutorials and other info.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Qt4_Ruby_Tutorial|Qt4 Ruby Tutorial]]&lt;br /&gt;
:''Trolltech's fabulous introductory tutorial to Qt, translated to Ruby.''&lt;br /&gt;
&lt;br /&gt;
=== Shell ===&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Shell_Scripting_with_KDE_Dialogs|Shell Scripting with KDE dialogs]] ([http://developer.kde.org/documentation/tutorials/kdialog/t1.html Original Link]) &lt;br /&gt;
:''Tutorial by [mailto:bradh@frogmouth.net Brad Hards] that describes how to use KDE dialogs in shell scripts with kdialog. It is presented as an example based tutorial.''&lt;br /&gt;
&lt;br /&gt;
== Other tutorials ==&lt;br /&gt;
&lt;br /&gt;
=== Using the KDE Games Library ===&lt;br /&gt;
;[[Development/Tutorials/Games/KStandardGameAction| KStandardGameAction]]&lt;br /&gt;
:''Using libkdegames to make your game fit the kdegames standard''&lt;br /&gt;
;[[Development/Tutorials/Games/Highscores| Highscores]]&lt;br /&gt;
:''Implementing a simple highscore table into your game''&lt;br /&gt;
;[[Development/Tutorials/Games/Theme Selector| Theme Selector]]&lt;br /&gt;
:''Using the libkdegames theme selection dialog''&lt;br /&gt;
&lt;br /&gt;
=== 2D Plotting (KPlotWidget) ===&lt;br /&gt;
;[[Development/Tutorials/KPlotWidget|Using the KDE data-plotting widget]]&lt;br /&gt;
:''This tutorial introduces KPlotWidget, which is used for 2-D data plotting.  It includes information on simple usage of the widget (including adding and modifying data sets, and customizing the plot axes and labels), and advanced customization (including extending the widget through sub-classing).''&lt;br /&gt;
&lt;br /&gt;
=== Spelling and Grammar Checking (Sonnet) ===&lt;br /&gt;
;[[Development/Tutorials/Sonnet/SonnetTutorial|Adding spell-checking or grammar-checking to KDE applications]]&lt;br /&gt;
:''This tutorial introduces Sonnet and how one may use it to add language correction to your KDE application. Sonnet's auxiliary features shall be described in a separate tutorial.''&lt;br /&gt;
&lt;br /&gt;
=== Pixmap cache (KPixmapCache) ===&lt;br /&gt;
;[[Development/Tutorials/KPixmapCache|Using the KDE pixmap cache]]&lt;br /&gt;
:''This tutorial shows how to use KPixmapCache to cache e.g. pixmaps generated from SVGs or some data.''&lt;br /&gt;
&lt;br /&gt;
== KDE2 and KDE3 Materials ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE3|KDE3 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE3.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KDE2|KDE2 Tutorials]]&lt;br /&gt;
:''These tutorials cover topics related to KDE2.''&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow</id>
		<title>Development/Tutorials/Using KXmlGuiWindow</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow"/>
				<updated>2007-12-26T17:15:32Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program|Tutorial 1 - Hello World]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions and XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial carries on from [[Development/Tutorials/First_program|First Program Tutorial]] and will introduce the {{class|KXmlGuiWindow}} class.&lt;br /&gt;
&lt;br /&gt;
In the previous tutorial, the program caused a dialog box to pop up but we're going to take steps towards a functioning application.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
{{class|KXmlGuiWindow}} provides a full main window view with menubars, toolbars, a statusbar and a main area in the centre for a large widget. Most KDE applications will derive from this class as it provides an easy way to define menu and toolbar layouts through XML files (this technology is called XMLGUI). While we will not be using XMLGUI in ''this'' tutorial, we will use it in the next.&lt;br /&gt;
&lt;br /&gt;
In order to have a useful KXmlGuiWindow, we must subclass it. So we create two files, a &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; which will contain our code.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
		&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First we Subclass KXmlGuiWindow on line 7 with &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then we declare the constructor with &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And finally we declare a pointer to the object that will make up the bulk of our program. {{class|KTextEdit}} is a generic richtext editor with some KDE niceties like cursor auto-hiding.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit();&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First, of course, on line 1 we have to include the header file containing the class declaration.&lt;br /&gt;
&lt;br /&gt;
On line 5, we initialise our text editor with an object. Then on line 6 we use KXmlGuiWindow's built-in setCentralWidget() function which tells the KXmlGuiWindow what should appear in the central section of the window.&lt;br /&gt;
&lt;br /&gt;
Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).&lt;br /&gt;
&lt;br /&gt;
==Back to main.cpp==&lt;br /&gt;
In order to actually run this window, we need to add a few lines in main.cpp:&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial2&amp;quot;, 0,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 2&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  &lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The only new lines here (compared to Tutorial 1) are 5, 18 and 19. On line 18, we create our MainWindow object and then on line 19, we display it.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
The best way to build the program is to use CMake. All that's changed since tutorial 1 is that &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; has been added to the sources list and any &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; has become &amp;lt;tt&amp;gt;tutorial2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project (tutorial2)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial2_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial2 ${tutorial2_SRCS})&lt;br /&gt;
target_link_libraries(tutorial2 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile it===&lt;br /&gt;
To compile, link and run it, use:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake ..&lt;br /&gt;
 make&lt;br /&gt;
 ./tutorial2&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KActions|using KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program</id>
		<title>Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program"/>
				<updated>2007-12-26T17:15:29Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Make And Run */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Hello World|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4|KDE4 development environment]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
Your first program shall greet the world with a friendly &amp;quot;Hello World&amp;quot;, what else? For that, we will use a {{class|KMessageBox}} and customise one of the buttons.&lt;br /&gt;
[[image:introtokdetutorial1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
{{tip|To get more information about any class you come across, Konqueror offers a quick shortcut. So to look for information about KMessageBox, just type &amp;quot;kde:kmessagebox&amp;quot; into Konqueror and you'll be taken to the documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You might want to use KDevelop for your projects, which does many nice things like code completion, easy access to API documentation or debugging support.&lt;br /&gt;
&lt;br /&gt;
Read [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this tutorial]] to set up KDevelop correctly for this task. You probably want to check if the setup is working by testing opening an existing KDE 4 application with KDevelop first.&lt;br /&gt;
&lt;br /&gt;
You still need to edit the CMake files by hand though.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
All the code we need will be in one file, &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;. Create that file with the code below:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;QString&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocalizedString&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    KAboutData aboutData(&amp;quot;tutorial1&amp;quot;,                  // The program name used internally.&lt;br /&gt;
                         0,                            // The message catalog name, use program name if null.&lt;br /&gt;
                         ki18n(&amp;quot;Tutorial 1&amp;quot;),          // A displayable program name string.&lt;br /&gt;
                         &amp;quot;1.0&amp;quot;,                        // The program version string.&lt;br /&gt;
                         ki18n(&amp;quot;KMessageBox popup&amp;quot;),   // A short description of what the program does.&lt;br /&gt;
                         KAboutData::License_GPL,      // License identifier&lt;br /&gt;
                         ki18n(&amp;quot;(c) 2007&amp;quot;),            // Copyright Statement&lt;br /&gt;
                         ki18n(&amp;quot;Some text...&amp;quot;),        // Some free form text, that can contain any kind of information.&lt;br /&gt;
                         &amp;quot;http://tutorial.com&amp;quot;,        // The program homepage string.&lt;br /&gt;
                         &amp;quot;submit@bugs.kde.org&amp;quot;);       // The bug report email address string.&lt;br /&gt;
&lt;br /&gt;
    KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
    KApplication app;&lt;br /&gt;
    KGuiItem guiItem( QString( &amp;quot;Hello&amp;quot; ), QString(),&lt;br /&gt;
                      QString( &amp;quot;this is a tooltip&amp;quot; ),&lt;br /&gt;
                      QString( &amp;quot;this is a whatsthis&amp;quot; ) );&lt;br /&gt;
    KMessageBox::questionYesNo( 0, &amp;quot;Hello World&amp;quot;, &amp;quot;Hello&amp;quot;, guiItem );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first KDE specific code we come across in this program is {{class|KAboutData}}. This is the class used to store information about the program such as a short description, authors or license information. Pretty much every KDE application should use this class.&lt;br /&gt;
&lt;br /&gt;
Then we come to {{class|KCmdLineArgs}}. This is the class one would use to specify command line switches to, for example, open the program with a specific file. However, in this tutorial, we simply initialise it with the {{class|KAboutData}} object we created so we can use the &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; switches.&lt;br /&gt;
&lt;br /&gt;
Then we create a {{class|KApplication}} object. This needs to be done exactly once in each program since it is needed for things such as [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Now we've done all the necessary KDE setup, we can move on to doing interesting things with our application. We're going to create a popup box but we're going to customise one of the buttons. To do this customisation, we need to use a {{class|KGuiItem}} object. The first argument in the {{class|KGuiItem}} constructor is the text that will appear on the item (in our case, a button). Then we have an option of setting an icon for the button but we don't want one so we just give it &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;. Finally we set the tooltip (what appears when you hover over an item) and finally the &amp;quot;What's This?&amp;quot; (accessed through right-clicking or Shift-F1) text.&lt;br /&gt;
&lt;br /&gt;
Now we have our item, we can create our popup. We call the &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt; function which, by default, creates a message box with a &amp;quot;Yes&amp;quot; and a &amp;quot;No&amp;quot; button. The second argument is the text that will appear in the middle of the popup box. The third is the caption the window will have and finally we set the KGuiItem for (what would normally be) the &amp;quot;Yes&amp;quot; button to the &amp;lt;tt&amp;gt;KGuiItem guiItem&amp;lt;/tt&amp;gt; we created.&lt;br /&gt;
&lt;br /&gt;
We're all done as far as the code is concerned. Now to build it and try it out.&lt;br /&gt;
&lt;br /&gt;
==Build==&lt;br /&gt;
If you set up your environment as described in [[Getting Started/Build/KDE4]], you can compile this code with&lt;br /&gt;
 &lt;br /&gt;
 g++ main.cpp -o tutorial1 \&lt;br /&gt;
 -I$QTDIR/include/Qt \&lt;br /&gt;
 -I$QTDIR/include/QtCore \&lt;br /&gt;
 -I$QTDIR/include \&lt;br /&gt;
 -I$KDEDIR/include/KDE \&lt;br /&gt;
 -I$KDEDIR/include \&lt;br /&gt;
 -L$KDEDIR/lib \&lt;br /&gt;
 -L$QTDIR/lib -lQtCore -lQtGui -lkdeui -lkdecore&lt;br /&gt;
and then run it with &lt;br /&gt;
 dbus-launch ./tutorial1&lt;br /&gt;
&lt;br /&gt;
===Using CMake===&lt;br /&gt;
If that worked, you may want to use [[Development/Tutorials/CMake|CMake]], just like the rest of KDE. This will automatically locate the libraries and headers for KDE, Qt etc. and will allow you to easily build your applications on other computers.&lt;br /&gt;
====CMakeLists.txt====&lt;br /&gt;
Create a file named CMakeLists.txt in the same directory as main.cpp with this content:&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function locates the package that you ask it for (in this case KDE4) and sets some variables describing the location of the package's headers and libraries. In this case we will use the &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt; variable which contains the path to the KDE4 header files.&lt;br /&gt;
&lt;br /&gt;
In order to allow the compiler to find these files, we pass that variable to the &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; function which adds the KDE4 headers to the header search path.&lt;br /&gt;
&lt;br /&gt;
Next we create a variable called &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; using the &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt; function. In this case we simply set it to the name of our only source file.&lt;br /&gt;
&lt;br /&gt;
Then we use &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; to create an executable called &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; from the source files listed in our &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; variable. Finally we link our executable to the KDE4 kdeui library using &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt; variable which was set by the &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
====Make And Run====&lt;br /&gt;
Again, if you set up your environment as described in [[Getting_Started/Build/KDE4|Getting Started/Build/KDE4]], you can compile this code with:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
Or if you did not:&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake ..&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
And launch it with:&lt;br /&gt;
 ./tutorial1&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KXmlGuiWindow|using KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions</id>
		<title>Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions"/>
				<updated>2007-12-26T17:14:03Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: CMakeLists.txt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KActions and XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]], Basic XML knowledge|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Saving and loading]]| &lt;br /&gt;
&lt;br /&gt;
reading=None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.&lt;br /&gt;
&lt;br /&gt;
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 {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
A {{class|KAction}} 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 [http://doc.trolltech.com/latest/signalsandslots.html slot] which carries out the work of your action.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial3&amp;quot;, &amp;quot;tutorial3&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 3&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area using KAction etc.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This time, very little has changed in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, only the KAboutData constructor has been updated to show that we are now on tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
	&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Only a function &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt; has been added which will do all the work setting up the KActions.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
&lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
&lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
This builds upon the KXmlGuiWindow code from [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2]]. Most of the changes are to &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, an important structural change being that the constructor for MainWindow now calls &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; is where the new KAction code goes before finally calling &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
===Creating the KAction object===&lt;br /&gt;
The KAction is built up in a number of steps. The first is including the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; library and then creating the KAction:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
KAction* clearAction = new KAction(this);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a new KAction called &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Setting KAction Properties===&lt;br /&gt;
====Text====&lt;br /&gt;
Now we have our KAction object, we can start setting its properties. The following code sets the text that will be displayed in the menu and under the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt;'s icon in the toolbar.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that the text is passed through the i18n() function; this is necessary for the UI to be translatable (more information on this can be found in the [[Development/Tutorials/Localization/i18n|i18n tutorial]]).&lt;br /&gt;
&lt;br /&gt;
====Icon====&lt;br /&gt;
If the action is going to be displayed in a toolbar, it's nice to have an icon depicting the action. The following code sets the icon to the standard KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; icon through the use of the &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Keyboard Shortcut====&lt;br /&gt;
Setting a keyboard shortcut to perform our action is equally simple:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&amp;lt;/code&amp;gt;&lt;br /&gt;
This associates Ctrl+W with the KAction.&lt;br /&gt;
&lt;br /&gt;
===Adding to the Collection===&lt;br /&gt;
In order for the action to be accessed by the XMLGUI framework (explained in depth later) it must be added to the application's ''action collection''. The action collection is accessed via the &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt; function like this: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Here, the &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; KAction is added to the collection and given a name of ''clear''. This name (''clear'') is used by the XMLGUI framework to refer to the action.&lt;br /&gt;
&lt;br /&gt;
====Connecting the action====&lt;br /&gt;
Now that the action is fully set up, it needs to be connected to something useful. In this case (because we want to clear the text area), we connect our action to the &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; action belonging to a KTextEdit (which, unsurprisingly, clears the KTextEdit)&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
connect( clearAction, SIGNAL( triggered(bool) ), &lt;br /&gt;
         textArea, SLOT( clear() ) );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is the same as it would be done in Qt with a {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
&lt;br /&gt;
For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through {{class|KStandardAction}}.&lt;br /&gt;
&lt;br /&gt;
They are very simple to use. Once the library has been included (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simply supply it with what you want the function to do and which KActionCollection to add it to. For example:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a KAction with the correct icon, text and shortcut and even adds it to the File menu.&lt;br /&gt;
&lt;br /&gt;
==Adding the action to menus and toolbars==&lt;br /&gt;
At the moment, the new &amp;quot;Clear&amp;quot; action has been created but it hasn't been associated with any menus or toolbars. This is done with a KDE technology called XMLGUI, which does nice things like movable toolbars for you.&lt;br /&gt;
&lt;br /&gt;
{{note|In a later version of KDE4, XMLGUI, may be replaced with a new framework called liveui. For now, XMLGUI, is the only and correct way to set up the UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; function in {{class|KXmlGuiWindow}} depends on the XMLGUI system to construct the GUI, which XMLGUI does by parsing an XML file description of the interface.&lt;br /&gt;
&lt;br /&gt;
The rule for naming this XML file is &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; is the name you set in {{class|KAboutData}} (in this case, ''tutorial3''). So in our example, the file is called &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, and is located in the build directory. Where the file will ultimately be placed is handled by CMake.&lt;br /&gt;
&lt;br /&gt;
==''appname''ui.rc File==&lt;br /&gt;
&lt;br /&gt;
Since the description of the UI is defined with XML, the layout must follow strict rules. This tutorial will not go into great depth on this topic, but for more information, see the [[Development/Architecture/KDE4/XMLGUI_Technology|detailed XMLGUI page]].&lt;br /&gt;
&lt;br /&gt;
===tutorial3ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial3&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; tag allows you to describe the toolbar, which is the bar across the top of the window normally with icons. Here it is given the unique name ''mainToolBar'' and its user visible name set to ''Main Toolbar'' using the &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt; tag. The clear action is added to the toolbar using the &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt; tag, the name parameter in this tag being the string that was passed to the KActionCollection with &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Besides having the action in the toolbar, it can also be added to the menubar. Here the action is being added to the ''File'' menu of the &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; the same way it was added to the toolbar.&lt;br /&gt;
&lt;br /&gt;
Change the 'version' attribute of the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;gui&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; tag if you changed .rc file since the last install to force a system cache update.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Finally, the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; needs to go somewhere where KDE can find it (can't just leave it in the source directory!). '''This means the project needs to be installed somewhere.'''&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial3)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial3_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial3 ${tutorial3_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial3ui.rc &lt;br /&gt;
        DESTINATION  ${DATA_INSTALL_DIR}/tutorial3)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file is almost identical to the one for tutorial2, but with two extra lines at the end that describe where the files are to be installed. Firstly, the &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; target is installed to the &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt; then the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; file that describes the layout of the user interface is installed to the application's data directory.&lt;br /&gt;
&lt;br /&gt;
===Make, Install And Run===&lt;br /&gt;
If you don't have write access to where your KDE4 installation directory, you can install it to a folder in your home directory.&lt;br /&gt;
&lt;br /&gt;
To tell CMake where to install the program, set the &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt; switch. You probably just want to install it somewhere local for testing (it's probably a bit silly to go to the effort of installing these tutorials to your KDE directory), so the following might be appropriate:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial3&lt;br /&gt;
which will create a KDE-like directory structure in your user's home directory directory and will install the executable to {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Saving_and_loading|saving and loading]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T17:13:58Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: CMakeLists.txt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful.At the most basic a text editor needs to be able to load files from disc, save files that you've created or edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we create a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} &lt;br /&gt;
                                ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow</id>
		<title>Development/Tutorials/Using KXmlGuiWindow</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow"/>
				<updated>2007-12-26T17:13:53Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: CMakeLists.txt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program|Tutorial 1 - Hello World]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions and XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial carries on from [[Development/Tutorials/First_program|First Program Tutorial]] and will introduce the {{class|KXmlGuiWindow}} class.&lt;br /&gt;
&lt;br /&gt;
In the previous tutorial, the program caused a dialog box to pop up but we're going to take steps towards a functioning application.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
{{class|KXmlGuiWindow}} provides a full main window view with menubars, toolbars, a statusbar and a main area in the centre for a large widget. Most KDE applications will derive from this class as it provides an easy way to define menu and toolbar layouts through XML files (this technology is called XMLGUI). While we will not be using XMLGUI in ''this'' tutorial, we will use it in the next.&lt;br /&gt;
&lt;br /&gt;
In order to have a useful KXmlGuiWindow, we must subclass it. So we create two files, a &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; which will contain our code.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
		&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First we Subclass KXmlGuiWindow on line 7 with &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then we declare the constructor with &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And finally we declare a pointer to the object that will make up the bulk of our program. {{class|KTextEdit}} is a generic richtext editor with some KDE niceties like cursor auto-hiding.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit();&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First, of course, on line 1 we have to include the header file containing the class declaration.&lt;br /&gt;
&lt;br /&gt;
On line 5, we initialise our text editor with an object. Then on line 6 we use KXmlGuiWindow's built-in setCentralWidget() function which tells the KXmlGuiWindow what should appear in the central section of the window.&lt;br /&gt;
&lt;br /&gt;
Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).&lt;br /&gt;
&lt;br /&gt;
==Back to main.cpp==&lt;br /&gt;
In order to actually run this window, we need to add a few lines in main.cpp:&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial2&amp;quot;, 0,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 2&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  &lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The only new lines here (compared to Tutorial 1) are 5, 18 and 19. On line 18, we create our MainWindow object and then on line 19, we display it.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
The best way to build the program is to use CMake. All that's changed since tutorial 1 is that &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; has been added to the sources list and any &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; has become &amp;lt;tt&amp;gt;tutorial2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project (tutorial2)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial2_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial2 ${tutorial2_SRCS})&lt;br /&gt;
target_link_libraries(tutorial2 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile it===&lt;br /&gt;
To compile, link and run it, use:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. &amp;amp;&amp;amp; make&lt;br /&gt;
 ./tutorial2&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KActions|using KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program</id>
		<title>Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program"/>
				<updated>2007-12-26T17:13:44Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: CMakeLists.txt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Hello World|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4|KDE4 development environment]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
Your first program shall greet the world with a friendly &amp;quot;Hello World&amp;quot;, what else? For that, we will use a {{class|KMessageBox}} and customise one of the buttons.&lt;br /&gt;
[[image:introtokdetutorial1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
{{tip|To get more information about any class you come across, Konqueror offers a quick shortcut. So to look for information about KMessageBox, just type &amp;quot;kde:kmessagebox&amp;quot; into Konqueror and you'll be taken to the documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You might want to use KDevelop for your projects, which does many nice things like code completion, easy access to API documentation or debugging support.&lt;br /&gt;
&lt;br /&gt;
Read [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this tutorial]] to set up KDevelop correctly for this task. You probably want to check if the setup is working by testing opening an existing KDE 4 application with KDevelop first.&lt;br /&gt;
&lt;br /&gt;
You still need to edit the CMake files by hand though.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
All the code we need will be in one file, &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;. Create that file with the code below:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;QString&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocalizedString&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    KAboutData aboutData(&amp;quot;tutorial1&amp;quot;,                  // The program name used internally.&lt;br /&gt;
                         0,                            // The message catalog name, use program name if null.&lt;br /&gt;
                         ki18n(&amp;quot;Tutorial 1&amp;quot;),          // A displayable program name string.&lt;br /&gt;
                         &amp;quot;1.0&amp;quot;,                        // The program version string.&lt;br /&gt;
                         ki18n(&amp;quot;KMessageBox popup&amp;quot;),   // A short description of what the program does.&lt;br /&gt;
                         KAboutData::License_GPL,      // License identifier&lt;br /&gt;
                         ki18n(&amp;quot;(c) 2007&amp;quot;),            // Copyright Statement&lt;br /&gt;
                         ki18n(&amp;quot;Some text...&amp;quot;),        // Some free form text, that can contain any kind of information.&lt;br /&gt;
                         &amp;quot;http://tutorial.com&amp;quot;,        // The program homepage string.&lt;br /&gt;
                         &amp;quot;submit@bugs.kde.org&amp;quot;);       // The bug report email address string.&lt;br /&gt;
&lt;br /&gt;
    KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
    KApplication app;&lt;br /&gt;
    KGuiItem guiItem( QString( &amp;quot;Hello&amp;quot; ), QString(),&lt;br /&gt;
                      QString( &amp;quot;this is a tooltip&amp;quot; ),&lt;br /&gt;
                      QString( &amp;quot;this is a whatsthis&amp;quot; ) );&lt;br /&gt;
    KMessageBox::questionYesNo( 0, &amp;quot;Hello World&amp;quot;, &amp;quot;Hello&amp;quot;, guiItem );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first KDE specific code we come across in this program is {{class|KAboutData}}. This is the class used to store information about the program such as a short description, authors or license information. Pretty much every KDE application should use this class.&lt;br /&gt;
&lt;br /&gt;
Then we come to {{class|KCmdLineArgs}}. This is the class one would use to specify command line switches to, for example, open the program with a specific file. However, in this tutorial, we simply initialise it with the {{class|KAboutData}} object we created so we can use the &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; switches.&lt;br /&gt;
&lt;br /&gt;
Then we create a {{class|KApplication}} object. This needs to be done exactly once in each program since it is needed for things such as [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Now we've done all the necessary KDE setup, we can move on to doing interesting things with our application. We're going to create a popup box but we're going to customise one of the buttons. To do this customisation, we need to use a {{class|KGuiItem}} object. The first argument in the {{class|KGuiItem}} constructor is the text that will appear on the item (in our case, a button). Then we have an option of setting an icon for the button but we don't want one so we just give it &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;. Finally we set the tooltip (what appears when you hover over an item) and finally the &amp;quot;What's This?&amp;quot; (accessed through right-clicking or Shift-F1) text.&lt;br /&gt;
&lt;br /&gt;
Now we have our item, we can create our popup. We call the &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt; function which, by default, creates a message box with a &amp;quot;Yes&amp;quot; and a &amp;quot;No&amp;quot; button. The second argument is the text that will appear in the middle of the popup box. The third is the caption the window will have and finally we set the KGuiItem for (what would normally be) the &amp;quot;Yes&amp;quot; button to the &amp;lt;tt&amp;gt;KGuiItem guiItem&amp;lt;/tt&amp;gt; we created.&lt;br /&gt;
&lt;br /&gt;
We're all done as far as the code is concerned. Now to build it and try it out.&lt;br /&gt;
&lt;br /&gt;
==Build==&lt;br /&gt;
If you set up your environment as described in [[Getting Started/Build/KDE4]], you can compile this code with&lt;br /&gt;
 &lt;br /&gt;
 g++ main.cpp -o tutorial1 \&lt;br /&gt;
 -I$QTDIR/include/Qt \&lt;br /&gt;
 -I$QTDIR/include/QtCore \&lt;br /&gt;
 -I$QTDIR/include \&lt;br /&gt;
 -I$KDEDIR/include/KDE \&lt;br /&gt;
 -I$KDEDIR/include \&lt;br /&gt;
 -L$KDEDIR/lib \&lt;br /&gt;
 -L$QTDIR/lib -lQtCore -lQtGui -lkdeui -lkdecore&lt;br /&gt;
and then run it with &lt;br /&gt;
 dbus-launch ./tutorial1&lt;br /&gt;
&lt;br /&gt;
===Using CMake===&lt;br /&gt;
If that worked, you may want to use [[Development/Tutorials/CMake|CMake]], just like the rest of KDE. This will automatically locate the libraries and headers for KDE, Qt etc. and will allow you to easily build your applications on other computers.&lt;br /&gt;
====CMakeLists.txt====&lt;br /&gt;
Create a file named CMakeLists.txt in the same directory as main.cpp with this content:&lt;br /&gt;
&amp;lt;code ini n&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function locates the package that you ask it for (in this case KDE4) and sets some variables describing the location of the package's headers and libraries. In this case we will use the &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt; variable which contains the path to the KDE4 header files.&lt;br /&gt;
&lt;br /&gt;
In order to allow the compiler to find these files, we pass that variable to the &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; function which adds the KDE4 headers to the header search path.&lt;br /&gt;
&lt;br /&gt;
Next we create a variable called &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; using the &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt; function. In this case we simply set it to the name of our only source file.&lt;br /&gt;
&lt;br /&gt;
Then we use &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; to create an executable called &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; from the source files listed in our &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; variable. Finally we link our executable to the KDE4 kdeui library using &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt; variable which was set by the &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
====Make And Run====&lt;br /&gt;
Again, if you set up your environment as described in [[Getting_Started/Build/KDE4|Getting Started/Build/KDE4]], you can compile this code with:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
Or if you did not:&lt;br /&gt;
&lt;br /&gt;
 mkdir build&lt;br /&gt;
 cd build&lt;br /&gt;
 cmake .. &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
And launch it as:&lt;br /&gt;
 ./tutorial1.shell&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KXmlGuiWindow|using KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T17:05:55Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: mainwindow.h++&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful.At the most basic a text editor needs to be able to load files from disc, save files that you've created or edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutorial 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new from tutorial3&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we want to add the ability to load and save files, we must add the functions which will do the work. Since the functions will be called through Qt's [http://doc.trolltech.com/latest/signalsandslots.html signal/slot] mechanism we must specify that these functions are slots as we do on line 19. Since we are using slots in this header file, we must also add the [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;] macro.&lt;br /&gt;
&lt;br /&gt;
We also want to keep track of the filename of the currently opened file so we create a &amp;lt;tt&amp;gt;{{qt|QString}} fileName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//New from here on&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile()&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T16:47:36Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Abstract++&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
Now that we have a basic text editor interface, it's time to make it do something useful.At the most basic a text editor needs to be able to load files from disc, save files that you've created or edited and create new files.&lt;br /&gt;
&lt;br /&gt;
KDE provides a number of classes for working with files which make life a lot easier for developers. The KIO library allows you to easily access files through network-transparent protocols as well as providing standard file dialogs.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutoral 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile() //new&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions</id>
		<title>Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions"/>
				<updated>2007-12-26T15:55:20Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Add links to new tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KActions and XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]], Basic XML knowledge|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Saving and loading]]| &lt;br /&gt;
&lt;br /&gt;
reading=None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.&lt;br /&gt;
&lt;br /&gt;
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 {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
A {{class|KAction}} 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 [http://doc.trolltech.com/latest/signalsandslots.html slot] which carries out the work of your action.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial3&amp;quot;, &amp;quot;tutorial3&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 3&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area using KAction etc.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This time, very little has changed in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, only the KAboutData constructor has been updated to show that we are now on tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
	&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Only a function &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt; has been added which will do all the work setting up the KActions.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
&lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
&lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
This builds upon the KXmlGuiWindow code from [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2]]. Most of the changes are to &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, an important structural change being that the constructor for MainWindow now calls &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; is where the new KAction code goes before finally calling &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
===Creating the KAction object===&lt;br /&gt;
The KAction is built up in a number of steps. The first is including the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; library and then creating the KAction:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
KAction* clearAction = new KAction(this);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a new KAction called &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Setting KAction Properties===&lt;br /&gt;
====Text====&lt;br /&gt;
Now we have our KAction object, we can start setting its properties. The following code sets the text that will be displayed in the menu and under the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt;'s icon in the toolbar.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that the text is passed through the i18n() function; this is necessary for the UI to be translatable (more information on this can be found in the [[Development/Tutorials/Localization/i18n|i18n tutorial]]).&lt;br /&gt;
&lt;br /&gt;
====Icon====&lt;br /&gt;
If the action is going to be displayed in a toolbar, it's nice to have an icon depicting the action. The following code sets the icon to the standard KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; icon through the use of the &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Keyboard Shortcut====&lt;br /&gt;
Setting a keyboard shortcut to perform our action is equally simple:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&amp;lt;/code&amp;gt;&lt;br /&gt;
This associates Ctrl+W with the KAction.&lt;br /&gt;
&lt;br /&gt;
===Adding to the Collection===&lt;br /&gt;
In order for the action to be accessed by the XMLGUI framework (explained in depth later) it must be added to the application's ''action collection''. The action collection is accessed via the &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt; function like this: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Here, the &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; KAction is added to the collection and given a name of ''clear''. This name (''clear'') is used by the XMLGUI framework to refer to the action.&lt;br /&gt;
&lt;br /&gt;
====Connecting the action====&lt;br /&gt;
Now that the action is fully set up, it needs to be connected to something useful. In this case (because we want to clear the text area), we connect our action to the &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; action belonging to a KTextEdit (which, unsurprisingly, clears the KTextEdit)&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
connect( clearAction, SIGNAL( triggered(bool) ), &lt;br /&gt;
         textArea, SLOT( clear() ) );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is the same as it would be done in Qt with a {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
&lt;br /&gt;
For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through {{class|KStandardAction}}.&lt;br /&gt;
&lt;br /&gt;
They are very simple to use. Once the library has been included (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simply supply it with what you want the function to do and which KActionCollection to add it to. For example:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a KAction with the correct icon, text and shortcut and even adds it to the File menu.&lt;br /&gt;
&lt;br /&gt;
==Adding the action to menus and toolbars==&lt;br /&gt;
At the moment, the new &amp;quot;Clear&amp;quot; action has been created but it hasn't been associated with any menus or toolbars. This is done with a KDE technology called XMLGUI, which does nice things like movable toolbars for you.&lt;br /&gt;
&lt;br /&gt;
{{note|In a later version of KDE4, XMLGUI, may be replaced with a new framework called liveui. For now, XMLGUI, is the only and correct way to set up the UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; function in {{class|KXmlGuiWindow}} depends on the XMLGUI system to construct the GUI, which XMLGUI does by parsing an XML file description of the interface.&lt;br /&gt;
&lt;br /&gt;
The rule for naming this XML file is &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; is the name you set in {{class|KAboutData}} (in this case, ''tutorial3''). So in our example, the file is called &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, and is located in the build directory. Where the file will ultimately be placed is handled by CMake.&lt;br /&gt;
&lt;br /&gt;
==''appname''ui.rc File==&lt;br /&gt;
&lt;br /&gt;
Since the description of the UI is defined with XML, the layout must follow strict rules. This tutorial will not go into great depth on this topic, but for more information, see the [[Development/Architecture/KDE4/XMLGUI_Technology|detailed XMLGUI page]].&lt;br /&gt;
&lt;br /&gt;
===tutorial3ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial3&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; tag allows you to describe the toolbar, which is the bar across the top of the window normally with icons. Here it is given the unique name ''mainToolBar'' and its user visible name set to ''Main Toolbar'' using the &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt; tag. The clear action is added to the toolbar using the &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt; tag, the name parameter in this tag being the string that was passed to the KActionCollection with &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Besides having the action in the toolbar, it can also be added to the menubar. Here the action is being added to the ''File'' menu of the &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; the same way it was added to the toolbar.&lt;br /&gt;
&lt;br /&gt;
Change the 'version' attribute of the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;gui&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; tag if you changed .rc file since the last install to force a system cache update.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Finally, the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; needs to go somewhere where KDE can find it (can't just leave it in the source directory!). '''This means the project needs to be installed somewhere.'''&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project(tutorial3)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial3_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial3 ${tutorial3_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial3ui.rc &lt;br /&gt;
        DESTINATION  ${DATA_INSTALL_DIR}/tutorial3)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file is almost identical to the one for tutorial2, but with two extra lines at the end that describe where the files are to be installed. Firstly, the &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; target is installed to the &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt; then the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; file that describes the layout of the user interface is installed to the application's data directory.&lt;br /&gt;
&lt;br /&gt;
===Make, Install And Run===&lt;br /&gt;
If you don't have write access to where your KDE4 installation directory, you can install it to a folder in your home directory.&lt;br /&gt;
&lt;br /&gt;
To tell CMake where to install the program, set the &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt; switch. You probably just want to install it somewhere local for testing (it's probably a bit silly to go to the effort of installing these tutorials to your KDE directory), so the following might be appropriate:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial3&lt;br /&gt;
which will create a KDE-like directory structure in your user's home directory directory and will install the executable to {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Saving_and_loading|saving and loading]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow</id>
		<title>Development/Tutorials/Using KXmlGuiWindow</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow"/>
				<updated>2007-12-26T15:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program|Tutorial 1 - Hello World]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions and XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial carries on from [[Development/Tutorials/First_program|First Program Tutorial]] and will introduce the {{class|KXmlGuiWindow}} class.&lt;br /&gt;
&lt;br /&gt;
In the previous tutorial, the program caused a dialog box to pop up but we're going to take steps towards a functioning application.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
{{class|KXmlGuiWindow}} provides a full main window view with menubars, toolbars, a statusbar and a main area in the centre for a large widget. Most KDE applications will derive from this class as it provides an easy way to define menu and toolbar layouts through XML files (this technology is called XMLGUI). While we will not be using XMLGUI in ''this'' tutorial, we will use it in the next.&lt;br /&gt;
&lt;br /&gt;
In order to have a useful KXmlGuiWindow, we must subclass it. So we create two files, a &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; which will contain our code.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
		&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First we Subclass KXmlGuiWindow on line 7 with &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then we declare the constructor with &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And finally we declare a pointer to the object that will make up the bulk of our program. {{class|KTextEdit}} is a generic richtext editor with some KDE niceties like cursor auto-hiding.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit();&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First, of course, on line 1 we have to include the header file containing the class declaration.&lt;br /&gt;
&lt;br /&gt;
On line 5, we initialise our text editor with an object. Then on line 6 we use KXmlGuiWindow's built-in setCentralWidget() function which tells the KXmlGuiWindow what should appear in the central section of the window.&lt;br /&gt;
&lt;br /&gt;
Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).&lt;br /&gt;
&lt;br /&gt;
==Back to main.cpp==&lt;br /&gt;
In order to actually run this window, we need to add a few lines in main.cpp:&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial2&amp;quot;, 0,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 2&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  &lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The only new lines here (compared to Tutorial 1) are 5, 18 and 19. On line 18, we create our MainWindow object and then on line 19, we display it.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
The best way to build the program is to use CMake. All that's changed since tutorial 1 is that &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; has been added to the sources list and any &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; has become &amp;lt;tt&amp;gt;tutorial2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project (tutorial2)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set(tutorial2_SRCS &lt;br /&gt;
	main.cpp&lt;br /&gt;
	mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial2 ${tutorial2_SRCS})&lt;br /&gt;
target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile it===&lt;br /&gt;
To compile, link and run it, use:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. &amp;amp;&amp;amp; make&lt;br /&gt;
 ./tutorial2&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KActions|using KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions</id>
		<title>Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions"/>
				<updated>2007-12-26T15:49:44Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KActions and XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]], Basic XML knowledge|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.&lt;br /&gt;
&lt;br /&gt;
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 {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
A {{class|KAction}} 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 [http://doc.trolltech.com/latest/signalsandslots.html slot] which carries out the work of your action.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial3&amp;quot;, &amp;quot;tutorial3&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 3&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area using KAction etc.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This time, very little has changed in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, only the KAboutData constructor has been updated to show that we are now on tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
	&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Only a function &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt; has been added which will do all the work setting up the KActions.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
&lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
&lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
This builds upon the KXmlGuiWindow code from [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2]]. Most of the changes are to &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, an important structural change being that the constructor for MainWindow now calls &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; is where the new KAction code goes before finally calling &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
===Creating the KAction object===&lt;br /&gt;
The KAction is built up in a number of steps. The first is including the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; library and then creating the KAction:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
KAction* clearAction = new KAction(this);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a new KAction called &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Setting KAction Properties===&lt;br /&gt;
====Text====&lt;br /&gt;
Now we have our KAction object, we can start setting its properties. The following code sets the text that will be displayed in the menu and under the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt;'s icon in the toolbar.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that the text is passed through the i18n() function; this is necessary for the UI to be translatable (more information on this can be found in the [[Development/Tutorials/Localization/i18n|i18n tutorial]]).&lt;br /&gt;
&lt;br /&gt;
====Icon====&lt;br /&gt;
If the action is going to be displayed in a toolbar, it's nice to have an icon depicting the action. The following code sets the icon to the standard KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; icon through the use of the &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Keyboard Shortcut====&lt;br /&gt;
Setting a keyboard shortcut to perform our action is equally simple:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&amp;lt;/code&amp;gt;&lt;br /&gt;
This associates Ctrl+W with the KAction.&lt;br /&gt;
&lt;br /&gt;
===Adding to the Collection===&lt;br /&gt;
In order for the action to be accessed by the XMLGUI framework (explained in depth later) it must be added to the application's ''action collection''. The action collection is accessed via the &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt; function like this: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Here, the &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; KAction is added to the collection and given a name of ''clear''. This name (''clear'') is used by the XMLGUI framework to refer to the action.&lt;br /&gt;
&lt;br /&gt;
====Connecting the action====&lt;br /&gt;
Now that the action is fully set up, it needs to be connected to something useful. In this case (because we want to clear the text area), we connect our action to the &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; action belonging to a KTextEdit (which, unsurprisingly, clears the KTextEdit)&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
connect( clearAction, SIGNAL( triggered(bool) ), &lt;br /&gt;
         textArea, SLOT( clear() ) );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is the same as it would be done in Qt with a {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
&lt;br /&gt;
For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through {{class|KStandardAction}}.&lt;br /&gt;
&lt;br /&gt;
They are very simple to use. Once the library has been included (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simply supply it with what you want the function to do and which KActionCollection to add it to. For example:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a KAction with the correct icon, text and shortcut and even adds it to the File menu.&lt;br /&gt;
&lt;br /&gt;
==Adding the action to menus and toolbars==&lt;br /&gt;
At the moment, the new &amp;quot;Clear&amp;quot; action has been created but it hasn't been associated with any menus or toolbars. This is done with a KDE technology called XMLGUI, which does nice things like movable toolbars for you.&lt;br /&gt;
&lt;br /&gt;
{{note|In a later version of KDE4, XMLGUI, may be replaced with a new framework called liveui. For now, XMLGUI, is the only and correct way to set up the UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; function in {{class|KXmlGuiWindow}} depends on the XMLGUI system to construct the GUI, which XMLGUI does by parsing an XML file description of the interface.&lt;br /&gt;
&lt;br /&gt;
The rule for naming this XML file is &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; is the name you set in {{class|KAboutData}} (in this case, ''tutorial3''). So in our example, the file is called &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, and is located in the build directory. Where the file will ultimately be placed is handled by CMake.&lt;br /&gt;
&lt;br /&gt;
==''appname''ui.rc File==&lt;br /&gt;
&lt;br /&gt;
Since the description of the UI is defined with XML, the layout must follow strict rules. This tutorial will not go into great depth on this topic, but for more information, see the [[Development/Architecture/KDE4/XMLGUI_Technology|detailed XMLGUI page]].&lt;br /&gt;
&lt;br /&gt;
===tutorial3ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial3&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; tag allows you to describe the toolbar, which is the bar across the top of the window normally with icons. Here it is given the unique name ''mainToolBar'' and its user visible name set to ''Main Toolbar'' using the &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt; tag. The clear action is added to the toolbar using the &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt; tag, the name parameter in this tag being the string that was passed to the KActionCollection with &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Besides having the action in the toolbar, it can also be added to the menubar. Here the action is being added to the ''File'' menu of the &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; the same way it was added to the toolbar.&lt;br /&gt;
&lt;br /&gt;
Change the 'version' attribute of the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;gui&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; tag if you changed .rc file since the last install to force a system cache update.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Finally, the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; needs to go somewhere where KDE can find it (can't just leave it in the source directory!). '''This means the project needs to be installed somewhere.'''&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project(tutorial3)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
&lt;br /&gt;
set(tutorial3_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial3 ${tutorial3_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial3ui.rc &lt;br /&gt;
        DESTINATION  ${DATA_INSTALL_DIR}/tutorial3)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file is almost identical to the one for tutorial2, but with two extra lines at the end that describe where the files are to be installed. Firstly, the &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; target is installed to the &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt; then the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; file that describes the layout of the user interface is installed to the application's data directory.&lt;br /&gt;
&lt;br /&gt;
===Make, Install And Run===&lt;br /&gt;
If you don't have write access to where your KDE4 installation directory, you can install it to a folder in your home directory.&lt;br /&gt;
&lt;br /&gt;
To tell CMake where to install the program, set the &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt; switch. You probably just want to install it somewhere local for testing (it's probably a bit silly to go to the effort of installing these tutorials to your KDE directory), so the following might be appropriate:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial3&lt;br /&gt;
which will create a KDE-like directory structure in your user's home directory directory and will install the executable to {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading</id>
		<title>Development/Tutorials/Saving and loading</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading"/>
				<updated>2007-12-26T15:47:58Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Add code and skellington text for my latest tutorial. More to come very soon...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Saving_and_loading}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Loading and saving files|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial4&amp;quot;, &amp;quot;tutorial4&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 4&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area which can load and save.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt; hasn't changed from tutoral 3 except to change any reference to tutorial 3 to tutorial 4.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  Q_OBJECT //new&lt;br /&gt;
  &lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
  &lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
    QString fileName; //new&lt;br /&gt;
&lt;br /&gt;
  private slots: //new&lt;br /&gt;
    void newFile(); //new&lt;br /&gt;
    void openFile(); //new&lt;br /&gt;
    void saveFile(); //new&lt;br /&gt;
    void saveFileAs(); //new&lt;br /&gt;
    void saveFileAs(const QString &amp;amp;outputFileName); //new&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KFileDialog&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //new&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //new&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent),&lt;br /&gt;
      fileName(QString()) //new&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
 &lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::open(this, SLOT(openFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
                        actionCollection()); //new&lt;br /&gt;
 &lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::newFile()&lt;br /&gt;
{&lt;br /&gt;
  fileName.clear();&lt;br /&gt;
  textArea-&amp;gt;clear();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::openFile() //new&lt;br /&gt;
{&lt;br /&gt;
  QString fileNameFromDialog = KFileDialog::getOpenFileName();&lt;br /&gt;
&lt;br /&gt;
  QString tmpFile;&lt;br /&gt;
  if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, &lt;br /&gt;
         this))&lt;br /&gt;
  {&lt;br /&gt;
    QFile file(tmpFile);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    textArea-&amp;gt;setPlainText(QTextStream(&amp;amp;file).readAll());&lt;br /&gt;
    fileName = fileNameFromDialog;&lt;br /&gt;
&lt;br /&gt;
    KIO::NetAccess::removeTempFile( tmpFile );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    KMessageBox::error(this, &lt;br /&gt;
        KIO::NetAccess::lastErrorString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFile()&lt;br /&gt;
{&lt;br /&gt;
  if(!fileName.isEmpty())&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs(fileName);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    saveFileAs();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs()&lt;br /&gt;
{&lt;br /&gt;
  saveFileAs(KFileDialog::getSaveFileName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::saveFileAs(const QString &amp;amp;outputFileName)&lt;br /&gt;
{&lt;br /&gt;
  KSaveFile file(outputFileName);&lt;br /&gt;
  file.open();&lt;br /&gt;
  &lt;br /&gt;
  QByteArray outputByteArray;&lt;br /&gt;
  outputByteArray.append(textArea-&amp;gt;toPlainText());&lt;br /&gt;
  file.write(outputByteArray);&lt;br /&gt;
  file.finalize();&lt;br /&gt;
  file.close();&lt;br /&gt;
  &lt;br /&gt;
  fileName = outputFileName;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===tutorial4ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial4&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is identical to &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; from tutorial 3 except the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; has changed to 'tutorial4'. We do not need to add any information about any of the &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt;s since the placement of those actions is handled automatically by KDE.&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
==Make, Install And Run==&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project(tutorial4)&lt;br /&gt;
 &lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
 &lt;br /&gt;
set(tutorial4_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
kde4_add_executable(tutorial4 ${tutorial4_SRCS})&lt;br /&gt;
 &lt;br /&gt;
target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install(FILES tutorial4ui.rc &lt;br /&gt;
        DESTINATION ${DATA_INSTALL_DIR}/tutorial4)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Since we are now using the KIO library, we must tell CMake to link against it. We do this by passing &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
With this file, the tutorial can built and run in the same way as tutorial 3. For more information, see tutorial 3.&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial4&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions</id>
		<title>Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions"/>
				<updated>2007-12-25T22:52:21Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Proofreading. Remove all the crap that's been added over time to make the article more focused.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KActions and XmlGui|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]], Basic XML knowledge|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.&lt;br /&gt;
&lt;br /&gt;
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 {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
A {{class|KAction}} 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 [http://doc.trolltech.com/latest/signalsandslots.html slot] which carries out the work of your action.&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial3&amp;quot;, &amp;quot;tutorial3&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 3&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area using KAction etc.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This time, very little has changed in &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, only the KAboutData constructor has been updated to show that we are now on tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
	&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Only a function &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt; has been added which will do all the work setting up the KActions.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
&lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
&lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
This builds upon the KXmlGuiWindow code from [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2]]. Most of the changes are to &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, an important structural change being that the constructor for MainWindow now calls &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; is where the new KAction code goes before finally calling &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; itself.&lt;br /&gt;
&lt;br /&gt;
===Creating the KAction object===&lt;br /&gt;
The KAction is built up in a number of steps. The first is including the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; library and then creating the KAction:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
KAction* clearAction = new KAction(this);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a new KAction called &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Setting KAction Properties===&lt;br /&gt;
====Text====&lt;br /&gt;
Now we have our KAction object, we can start setting its properties. The following code sets the text that will be displayed in the menu and under the &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt;'s icon in the toolbar.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Note that the text is passed through the i18n() function; this is necessary for the UI to be translatable (more information on this can be found in the [[Development/Tutorials/Localization/i18n|i18n tutorial]]).&lt;br /&gt;
&lt;br /&gt;
====Icon====&lt;br /&gt;
If the action is going to be displayed in a toolbar, it's nice to have an icon depicting the action. The following code sets the icon to the standard KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; icon through the use of the &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;document-new&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Keyboard Shortcut====&lt;br /&gt;
Setting a keyboard shortcut to perform our action is equally simple:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setShortcut(Qt::CTRL + Qt::Key_W);&amp;lt;/code&amp;gt;&lt;br /&gt;
This associates Ctrl+W with the KAction.&lt;br /&gt;
&lt;br /&gt;
===Adding to the Collection===&lt;br /&gt;
In order for the action to be accessed by the XMLGUI framework (explained in depth later) it must be added to the application's ''action collection''. The action collection is accessed via the &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt; function like this: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Here, the &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; KAction is added to the collection and given a name of ''clear''. This name (''clear'') is used by the XMLGUI framework to refer to the action.&lt;br /&gt;
&lt;br /&gt;
====Connecting the action====&lt;br /&gt;
Now that the action is fully set up, it needs to be connected to something useful. In this case (because we want to clear the text area), we connect our action to the &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; action belonging to a KTextEdit (which, unsurprisingly, clears the KTextEdit)&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
connect( clearAction, SIGNAL( triggered(bool) ), &lt;br /&gt;
         textArea, SLOT( clear() ) );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is the same as it would be done in Qt with a {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
&lt;br /&gt;
For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through {{class|KStandardAction}}.&lt;br /&gt;
&lt;br /&gt;
They are very simple to use. Once the library has been included (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simply supply it with what you want the function to do and which KActionCollection to add it to. For example:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a KAction with the correct icon, text and shortcut and even adds it to the File menu.&lt;br /&gt;
&lt;br /&gt;
==Adding the action to menus and toolbars==&lt;br /&gt;
At the moment, the new &amp;quot;Clear&amp;quot; action has been created but it hasn't been associated with any menus or toolbars. This is done with a KDE technology called XMLGUI, which does nice things like movable toolbars for you.&lt;br /&gt;
&lt;br /&gt;
{{note|In a later version of KDE4, XMLGUI, may be replaced with a new framework called liveui. For now, XMLGUI, is the only and correct way to set up the UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; function in {{class|KXmlGuiWindow}} depends on the XMLGUI system to construct the GUI, which XMLGUI does by parsing an XML file description of the interface.&lt;br /&gt;
&lt;br /&gt;
The rule for naming this XML file is &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; is the name you set in {{class|KAboutData}} (in this case, ''tutorial3''). So in our example, the file is called &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, and is located in the build directory. Where the file will ultimately be placed is handled by CMake.&lt;br /&gt;
&lt;br /&gt;
==''appname''ui.rc File==&lt;br /&gt;
&lt;br /&gt;
Since the description of the UI is defined with XML, the layout must follow strict rules. This tutorial will not go into great depth on this topic, but for more information, see the [[Development/Architecture/KDE4/XMLGUI_Technology|detailed XMLGUI page]].&lt;br /&gt;
&lt;br /&gt;
===tutorial3ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial3&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;ToolBar name=&amp;quot;mainToolBar&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Main Toolbar&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
  &amp;lt;MenuBar&amp;gt;&lt;br /&gt;
    &amp;lt;Menu name=&amp;quot;file&amp;quot; &amp;gt;&lt;br /&gt;
      &amp;lt;Action name=&amp;quot;clear&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; tag allows you to describe the toolbar, which is the bar across the top of the window normally with icons. Here it is given the unique name ''mainToolBar'' and its user visible name set to ''Main Toolbar'' using the &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt; tag. The clear action is added to the toolbar using the &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt; tag, the name parameter in this tag being the string that was passed to the KActionCollection with &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Besides having the action in the toolbar, it can also be added to the menubar. Here the action is being added to the ''File'' menu of the &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; the same way it was added to the toolbar.&lt;br /&gt;
&lt;br /&gt;
Change the 'version' attribute of the &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;gui&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; tag if you changed .rc file since the last install to force a system cache update.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Finally, the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; needs to go somewhere where KDE can find it (can't just leave it in the source directory!). '''This means the project needs to be installed somewhere.'''&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project(tutorial3)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set(tutorial3_SRCS &lt;br /&gt;
  main.cpp&lt;br /&gt;
  mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial3 ${tutorial3_SRCS})&lt;br /&gt;
&lt;br /&gt;
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})&lt;br /&gt;
install( FILES tutorial3ui.rc &lt;br /&gt;
         DESTINATION  ${DATA_INSTALL_DIR}/tutorial3 )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file is almost identical to the one for tutorial2, but with two extra lines at the end that describe where the files are to be installed. Firstly, the &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; target is installed to the &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt; then the &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; file that describes the layout of the user interface is installed to the application's data directory.&lt;br /&gt;
&lt;br /&gt;
===Make, Install And Run===&lt;br /&gt;
If you don't have write access to where your KDE4 installation directory, you can install it to a folder in your home directory.&lt;br /&gt;
&lt;br /&gt;
To tell CMake where to install the program, set the &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt; switch. You probably just want to install it somewhere local for testing (it's probably a bit silly to go to the effort of installing these tutorials to your KDE directory), so the following might be appropriate:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. -DCMAKE_INSTALL_PREFIX=$HOME&lt;br /&gt;
 make install&lt;br /&gt;
 $HOME/bin/tutorial3&lt;br /&gt;
which will create a KDE-like directory structure in your user's home directory directory and will install the executable to {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow</id>
		<title>Development/Tutorials/Using KXmlGuiWindow</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow"/>
				<updated>2007-12-25T22:11:32Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: More proofreading, increased consistency and a better introduction to KXmlGuiWindow&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program|Tutorial 1 - Hello World]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions and XmlGui]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial carries on from [[Development/Tutorials/First_program|First Program Tutorial]] and will introduce the {{class|KXmlGuiWindow}} class.&lt;br /&gt;
&lt;br /&gt;
In the previous tutorial, the program caused a dialog box to pop up but we're going to take steps towards a functioning application.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
{{class|KXmlGuiWindow}} provides a full main window view with menubars, toolbars, a statusbar and a main area in the centre for a large widget. Most KDE applications will derive from this class as it provides an easy way to define menu and toolbar layouts through XML files (this technology is called XMLGUI). While we will not be using XMLGUI in ''this'' tutorial, we will use it in the next.&lt;br /&gt;
&lt;br /&gt;
In order to have a useful KXmlGuiWindow, we must subclass it. So we create two files, a &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; which will contain our code.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
		&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First we Subclass KXmlGuiWindow on line 7 with &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then we declare the constructor with &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And finally we declare a pointer to the object that will make up the bulk of our program. {{class|KTextEdit}} is a generic richtext editor with some KDE niceties like cursor auto-hiding.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit();&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First, of course, on line 1 we have to include the header file containing the class declaration.&lt;br /&gt;
&lt;br /&gt;
On line 5, we initialise our text editor with an object. Then on line 6 we use KXmlGuiWindow's built-in setCentralWidget() function which tells the KXmlGuiWindow what should appear in the central section of the window.&lt;br /&gt;
&lt;br /&gt;
Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).&lt;br /&gt;
&lt;br /&gt;
==Back to main.cpp==&lt;br /&gt;
In order to actually run this window, we need to add a few lines in main.cpp:&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial2&amp;quot;, 0,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 2&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  &lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The only new lines here (compared to Tutorial 1) are 5, 18 and 19. On line 18, we create our MainWindow object and then on line 19, we display it.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
The best way to build the program is to use CMake. All that's changed since tutorial 1 is that &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; has been added to the sources list and any &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; has become &amp;lt;tt&amp;gt;tutorial2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project (tutorial2)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set(tutorial2_SRCS &lt;br /&gt;
	main.cpp&lt;br /&gt;
	mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial2 ${tutorial2_SRCS})&lt;br /&gt;
target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile it===&lt;br /&gt;
To compile, link and run it, use:&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. &amp;amp;&amp;amp; make&lt;br /&gt;
 ./tutorial2&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KActions|using KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program</id>
		<title>Development/Tutorials/First program</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program"/>
				<updated>2007-12-25T21:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: Some proofreading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Hello World|&lt;br /&gt;
&lt;br /&gt;
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4|KDE4 development environment]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
Your first program shall greet the world with a friendly &amp;quot;Hello World&amp;quot;, what else? For that, we will use a {{class|KMessageBox}} and customise one of the buttons.&lt;br /&gt;
[[image:introtokdetutorial1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
{{tip|To get more information about any class you come across, Konqueror offers a quick shortcut. So to look for information about KMessageBox, just type &amp;quot;kde:kmessagebox&amp;quot; into Konqueror and you'll be taken to the documentation.}}&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
You might want to use KDevelop for your projects, which does many nice things like code completion, easy access to API documentation or debugging support.&lt;br /&gt;
&lt;br /&gt;
Read [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this tutorial]] to set up KDevelop correctly for this task. You probably want to check if the setup is working by testing opening an existing KDE 4 application with KDevelop first.&lt;br /&gt;
&lt;br /&gt;
You still need to edit the CMake files by hand though.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
All the code we need will be in one file, &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;. Create that file with the code below:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;QString&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocalizedString&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
    KAboutData aboutData(&amp;quot;tutorial1&amp;quot;,                  // The program name used internally.&lt;br /&gt;
                         0,                            // The message catalog name, use program name if null.&lt;br /&gt;
                         ki18n(&amp;quot;Tutorial 1&amp;quot;),          // A displayable program name string.&lt;br /&gt;
                         &amp;quot;1.0&amp;quot;,                        // The program version string.&lt;br /&gt;
                         ki18n(&amp;quot;KMessageBox popup&amp;quot;),   // A short description of what the program does.&lt;br /&gt;
                         KAboutData::License_GPL,      // License identifier&lt;br /&gt;
                         ki18n(&amp;quot;(c) 2007&amp;quot;),            // Copyright Statement&lt;br /&gt;
                         ki18n(&amp;quot;Some text...&amp;quot;),        // Some free form text, that can contain any kind of information.&lt;br /&gt;
                         &amp;quot;http://tutorial.com&amp;quot;,        // The program homepage string.&lt;br /&gt;
                         &amp;quot;submit@bugs.kde.org&amp;quot;);       // The bug report email address string.&lt;br /&gt;
&lt;br /&gt;
    KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
    KApplication app;&lt;br /&gt;
    KGuiItem guiItem( QString( &amp;quot;Hello&amp;quot; ), QString(),&lt;br /&gt;
                      QString( &amp;quot;this is a tooltip&amp;quot; ),&lt;br /&gt;
                      QString( &amp;quot;this is a whatsthis&amp;quot; ) );&lt;br /&gt;
    KMessageBox::questionYesNo( 0, &amp;quot;Hello World&amp;quot;, &amp;quot;Hello&amp;quot;, guiItem );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The first KDE specific code we come across in this program is {{class|KAboutData}}. This is the class used to store information about the program such as a short description, authors or license information. Pretty much every KDE application should use this class.&lt;br /&gt;
&lt;br /&gt;
Then we come to {{class|KCmdLineArgs}}. This is the class one would use to specify command line switches to, for example, open the program with a specific file. However, in this tutorial, we simply initialise it with the {{class|KAboutData}} object we created so we can use the &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; switches.&lt;br /&gt;
&lt;br /&gt;
Then we create a {{class|KApplication}} object. This needs to be done exactly once in each program since it is needed for things such as [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Now we've done all the necessary KDE setup, we can move on to doing interesting things with our application. We're going to create a popup box but we're going to customise one of the buttons. To do this customisation, we need to use a {{class|KGuiItem}} object. The first argument in the {{class|KGuiItem}} constructor is the text that will appear on the item (in our case, a button). Then we have an option of setting an icon for the button but we don't want one so we just give it &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;. Finally we set the tooltip (what appears when you hover over an item) and finally the &amp;quot;What's This?&amp;quot; (accessed through right-clicking or Shift-F1) text.&lt;br /&gt;
&lt;br /&gt;
Now we have our item, we can create our popup. We call the &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt; function which, by default, creates a message box with a &amp;quot;Yes&amp;quot; and a &amp;quot;No&amp;quot; button. The second argument is the text that will appear in the middle of the popup box. The third is the caption the window will have and finally we set the KGuiItem for (what would normally be) the &amp;quot;Yes&amp;quot; button to the &amp;lt;tt&amp;gt;KGuiItem guiItem&amp;lt;/tt&amp;gt; we created.&lt;br /&gt;
&lt;br /&gt;
We're all done as far as the code is concerned. Now to build it and try it out.&lt;br /&gt;
&lt;br /&gt;
==Build==&lt;br /&gt;
If you set up your environment as described in [[Getting Started/Build/KDE4]], you can compile this code with&lt;br /&gt;
 &lt;br /&gt;
 g++ main.cpp -o tutorial1 \&lt;br /&gt;
 -I$QTDIR/include/Qt \&lt;br /&gt;
 -I$QTDIR/include/QtCore \&lt;br /&gt;
 -I$QTDIR/include \&lt;br /&gt;
 -I$KDEDIR/include/KDE \&lt;br /&gt;
 -I$KDEDIR/include \&lt;br /&gt;
 -L$KDEDIR/lib \&lt;br /&gt;
 -L$QTDIR/lib -lQtCore -lQtGui -lkdeui -lkdecore&lt;br /&gt;
and then run it with &lt;br /&gt;
 dbus-launch ./tutorial1&lt;br /&gt;
&lt;br /&gt;
===Using CMake===&lt;br /&gt;
If that worked, you may want to use [[Development/Tutorials/CMake|CMake]], just like the rest of KDE. This will automatically locate the libraries and headers for KDE, Qt etc. and will allow you to easily build your applications on other computers.&lt;br /&gt;
====CMakeLists.txt====&lt;br /&gt;
Create a file named CMakeLists.txt in the same directory as main.cpp with this content:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function locates the package that you ask it for (in this case KDE4) and sets some variables describing the location of the package's headers and libraries. In this case we will use the &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt; variable which contains the path to the KDE4 header files.&lt;br /&gt;
&lt;br /&gt;
In order to allow the compiler to find these files, we pass that variable to the &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt; function which adds the KDE4 headers to the header search path.&lt;br /&gt;
&lt;br /&gt;
Next we create a variable called &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; using the &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt; function. In this case we simply set it to the name of our only source file.&lt;br /&gt;
&lt;br /&gt;
Then we use &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; to create an executable called &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; from the source files listed in our &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; variable. Finally we link our executable to the KDE4 kdeui library using &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt; variable which was set by the &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
====Make And Run====&lt;br /&gt;
Again, if you set up your environment as described in [[Getting_Started/Build/KDE4|Getting Started/Build/KDE4]], you can compile this code with:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
Or if you did not:&lt;br /&gt;
&lt;br /&gt;
 mkdir build&lt;br /&gt;
 cd build&lt;br /&gt;
 cmake .. &amp;amp;&amp;amp; make&lt;br /&gt;
&lt;br /&gt;
And launch it as:&lt;br /&gt;
 ./tutorial1.shell&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KXmlGuiWindow|using KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/KDE_TechBase:Contributors</id>
		<title>KDE TechBase:Contributors</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/KDE_TechBase:Contributors"/>
				<updated>2007-12-21T14:36:47Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Reviewers and Article Writers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the contributors page.&lt;br /&gt;
&lt;br /&gt;
'''This site contains a list of ''active'' contributors. It should help to build teams which maintain KDE TechBase's content. If you have questions about KDE TechBase you can ask/email the corresponding person.'''&lt;br /&gt;
&lt;br /&gt;
Please add yourself to the list where appropriate. If you are inactive, please remove yourself again.&lt;br /&gt;
&lt;br /&gt;
== Administrators ==&lt;br /&gt;
&lt;br /&gt;
This is a list of KDE TechBase administrators.&lt;br /&gt;
&lt;br /&gt;
* [[User:Danimo|Danimo]]&lt;br /&gt;
* [[User:Dhaumann|Dhaumann]], &amp;lt;dhaumann at kde dot org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reviewers and Article Writers ==&lt;br /&gt;
&lt;br /&gt;
If you are continuously reviewing KDE TechBase changes or writing articles add yourself to the list.&lt;br /&gt;
&lt;br /&gt;
* [[User:Dhaumann|Dhaumann]], &amp;lt;dhaumann at kde dot org&amp;gt;&lt;br /&gt;
* [[User:Milliams|Milliams]]&lt;br /&gt;
* name, &amp;lt;email&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Translation Teams ==&lt;br /&gt;
&lt;br /&gt;
KDE TechBase is [[Help:Wiki Translation|translated]] into many languages. If you translate pages please add yourself to the right translation team.&lt;br /&gt;
&lt;br /&gt;
=== Chinese(simplified) Team ===&lt;br /&gt;
* [[User:Liangqi|Liangqi]], cavendish.qi at gmail dot com&lt;br /&gt;
* name, &amp;lt;email&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== German Team ===&lt;br /&gt;
* DrSlowDecay, kde at metalhorde dot de&lt;br /&gt;
* name, &amp;lt;email&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Italian Team ===&lt;br /&gt;
* [[User:Thunder Teaser|Thunder Teaser]], totokid at gmail dot com&lt;br /&gt;
* name, &amp;lt;email&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ... Team ===&lt;br /&gt;
* name, &amp;lt;email&amp;gt;&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/KDE_Relicensing</id>
		<title>Projects/KDE Relicensing</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/KDE_Relicensing"/>
				<updated>2007-11-24T17:13:50Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Current Reply List */ Add name to relicensing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== KDE GPL v2.0 Relicensing effort ==&lt;br /&gt;
&lt;br /&gt;
=== Why does it matter ? ===&lt;br /&gt;
&lt;br /&gt;
A couple of KDE dependent projects or even libraries have moved or are going to move to GPLv3 ([http://gpl3.palamida.com:8080/ State of GPLv3 movement]). &lt;br /&gt;
&lt;br /&gt;
Unfortunately, GPL v3 is incompatible with GPL v2. This means that it is not possible to create a project linking GPL v2 and v3 code together. There is no problem for projects which are licensed GPLv2+ (version 2 or above).&lt;br /&gt;
&lt;br /&gt;
A few parts of KDE are currently licensed as GPLv2 only. So far we have no reason to believe that this was something other than an oversight. However, we still need to validate with the individual copyright holders that a relicense to GPLv2+ or GPLv2+v3 is okay with them. &lt;br /&gt;
&lt;br /&gt;
Therefore, in an effort we're trying to identify the contributors that have contributed under the terms of GPLv2 and where the &amp;quot;+&amp;quot; part was not explicitly mentioned. If we know that all contributors agreed to a relicense, we can go ahead and flip the license of the individual source file.&lt;br /&gt;
&lt;br /&gt;
== How can I help ? ==&lt;br /&gt;
&lt;br /&gt;
By identifying a contributor who as contributed under the terms of GPLv2 (use '''kdesdk/scripts/relicensecheck.pl''' on the file in question or the [http://toma.kovoks.nl/kde/ Relicense Status Page]), and contacting him if he wasn't already contacted. Ask him the following questions: &lt;br /&gt;
&lt;br /&gt;
* Are you okay with relicensing your contributions done under GPLv2 to GPLv2+?&lt;br /&gt;
&lt;br /&gt;
* Are you okay with relicensing your contributions done under GPLv2 to GPLv2 or GPLv3 ?&lt;br /&gt;
&lt;br /&gt;
* Are you okay with relicensing your contributions done under LGPLv2 to LGPLv2+?&lt;br /&gt;
&lt;br /&gt;
* Are you okay with relicensing your contributions done under LGPLv2 to LGPLv2 or LGPLv3?&lt;br /&gt;
&lt;br /&gt;
* Are you okay with the KDE e.V. deciding on a future licensing change to your code, should that be necessary?&lt;br /&gt;
&lt;br /&gt;
=== Whats next? ===&lt;br /&gt;
&lt;br /&gt;
# you checkout relicensecheck.pl from trunk/KDE/kdesdk/scripts&lt;br /&gt;
# you run it on the file or directory in question&lt;br /&gt;
# you interpret the result. check each commit that is being complained about carefully. Try to get the copyright's holder's permission. if you get it, update the whitelist in the script.&lt;br /&gt;
# review the list of declared copyright holders in the file.&lt;br /&gt;
# if you're all clear, change the license to the most liberal license possible. Document your change verbosely in the SVN commit log.&lt;br /&gt;
&lt;br /&gt;
== Current Reply List ==&lt;br /&gt;
&lt;br /&gt;
* Please keep the list sorted by family name!&lt;br /&gt;
* Please only use &amp;quot;YES&amp;quot; or &amp;quot;NO&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! GPLv2-&amp;gt;GPLv2+ !! LGPLv2 -&amp;gt; LGPLv2+ !! GPLv2 -&amp;gt; GPLv2+v3 !! LGPLv2 -&amp;gt; LGPLv2+LGPLv3 || KDE e.V. decides&lt;br /&gt;
|-&lt;br /&gt;
|Adam, Till || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Alsina, Roberto || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Armitage, Chani || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Bastian, Waldo || NO || NO || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Boemann, Casper || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Broadstone, Matt || NO || NO || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Connell, Charles || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Cullmann, Christoph || NO || NO || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Drummond, Craig || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Dymo, Alexander || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Edghill, Gregg || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Faure, David || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Granroth, Kurt || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Hausmann, Simon || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Hoeglund, Fredrik || NO || NO || YES || YES ||&lt;br /&gt;
|-&lt;br /&gt;
|Kainhofer, Reinhold || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Kellet, Alexander || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Knight, Robert || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Kretz, Matthias || NO || NO || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Kulow, Stephan || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Lunak, Lubos || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Mac-Vicar, Duncan || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Macieira, Thiago || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Mantia, Andras || NO || NO || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Martyn, Greg || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|McGuire, Thomas || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Molkentin, Daniel || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Montel, Laurent || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Moore, Richard || NO || NO || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Mueller, Dirk || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Mutz, Marc || YES || YES || NO || NO || NO&lt;br /&gt;
|-&lt;br /&gt;
|Ottens, Kevin || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Pyne, Michael || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Raabe, Frerich || NO || NO || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Riddell, Jonathan || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Sand, Espen || YES || YES || || || YES&lt;br /&gt;
|-&lt;br /&gt;
|Schlaeger, Chris || NO || NO || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Schumacher, Cornelius || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Seigo, Aaron || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Soeken, Mathias || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|Stephenson, Will || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Tapsell, John || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Toscano, Pino || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Trueg, Sebastian (Exception: K3b) || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Ventura-Whiting, Ian || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Wallin, Inge || YES || YES || YES || YES ||&lt;br /&gt;
|-&lt;br /&gt;
|Williams, Matt || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Wolfer, Urs || YES || YES || YES || YES || YES&lt;br /&gt;
|-&lt;br /&gt;
|Zachmann, Thorsten || YES || YES || YES || YES || NO&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Current TODO List ==&lt;br /&gt;
&lt;br /&gt;
* KDAB&lt;br /&gt;
* Tobias Koenig&lt;br /&gt;
* Matthew Woehlke&lt;br /&gt;
* Daniel Teske&lt;br /&gt;
* Dawit Alemayehu&lt;br /&gt;
* Alex Zepeda&lt;br /&gt;
* Thomas Leitner&lt;br /&gt;
* Lars Knoll&lt;br /&gt;
* Kevin Ottens&lt;br /&gt;
* Maksim Orlovich&lt;br /&gt;
* Sirtaj Singh Kang&lt;br /&gt;
* Karol Szwed&lt;br /&gt;
* Thorsten Roeder&lt;br /&gt;
* Joseph Wenninger&lt;br /&gt;
&lt;br /&gt;
== Current list of problematic Files ==&lt;br /&gt;
&lt;br /&gt;
Tom Albers has written a webfrontend to '''relicensecheck.pl''', which makes it really easy to find files that can already be relicensed, or for those that can not it is possible to easily see (via tooltip) which commits are preventing it. &lt;br /&gt;
&lt;br /&gt;
[http://toma.kovoks.nl/kde/ Visit the Relicensing Status Page]&lt;br /&gt;
&lt;br /&gt;
== Relicensing progress ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://www.suse.de/~dmueller/licensing/files_KDE1.png&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Games</id>
		<title>Projects/Games</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Games"/>
				<updated>2007-11-11T16:09:27Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* IRC */ Update for next month&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Projects/Games}}&lt;br /&gt;
Intro to do&lt;br /&gt;
&lt;br /&gt;
== The Game Categories ==&lt;br /&gt;
*[[/Arcade Games|Arcade games]]&lt;br /&gt;
*[[/Board Games|Board Games]]&lt;br /&gt;
*[[/Tactic and Strategy|Tactic and Strategy]]&lt;br /&gt;
*[[/Card Games|Card games]]&lt;br /&gt;
&lt;br /&gt;
===See also===&lt;br /&gt;
* [http://doc.trolltech.com/4.2/qsvgrenderer.html QSvgRenderer Class Reference]&lt;br /&gt;
* [http://developer.kde.org/documentation/library/cvs-api/kdelibs-apidocs/kdecore/html/classKSvgRenderer.html KSvgRenderer Class Reference]&lt;br /&gt;
* [http://websvn.kde.org/trunk/KDE/kdegames/katomic/ KAtomic KDE4 code in websvn]&lt;br /&gt;
* [[Schedules/KDE4/4.0 Release Schedule]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
* [[/Maintainers| Game's maintainers]]&lt;br /&gt;
* [[/UI and usability|UI and usability]]&lt;br /&gt;
* [[/libkdegames Usage|libkdegames Usage]]&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
* [[/Status KDE 4.0|Status KDE 4.0]]&lt;br /&gt;
** [[/Documentation_progress|Documentation progress]]&lt;br /&gt;
** [[/Icons_ToDo|Icons_ToDo]]&lt;br /&gt;
* older pages:&lt;br /&gt;
** [[/Status_Ready|Ready]]&lt;br /&gt;
** [[/Status_Should_be_Ready|Should be ready]]&lt;br /&gt;
** [[/Status_Playground|kdegames playground (kdegame's candidate or unready) ]]&lt;br /&gt;
** [[/Status|old status page]]&lt;br /&gt;
&lt;br /&gt;
==Meeting==&lt;br /&gt;
&lt;br /&gt;
===IRC===&lt;br /&gt;
&lt;br /&gt;
We are doing meeting on [irc://irc.kde.org/#kdegames IRC] every month to talk about the games development. &lt;br /&gt;
&lt;br /&gt;
[[/IRC Meeting|Next Meeting : 1 December 20:00UTC]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/KDE_on_Windows/Installation</id>
		<title>Projects/KDE on Windows/Installation</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/KDE_on_Windows/Installation"/>
				<updated>2007-11-06T11:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* Download needed packages */ Fix link text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|Perhaps actual developers should summarize status of KDE4 on Windows here, while we encourage users to describe their experiences on the [[Talk:{{PAGENAME}}|Talk page?]]}}&lt;br /&gt;
&lt;br /&gt;
== KDE Installer for Windows ==&lt;br /&gt;
You can use this installer to download and install the&lt;br /&gt;
various binary packages that you need to run KDE applications on MS Windows.&lt;br /&gt;
KDE is free and open source so you can build all the applications &amp;quot;from scratch&amp;quot; from their source code;&lt;br /&gt;
but as a convenience for others,&lt;br /&gt;
volunteers create these precompiled packages and make them available on the Internet.&lt;br /&gt;
&lt;br /&gt;
'''Disclaimer''' These are early days for KDE4 on Windows,&lt;br /&gt;
some programs work better than others and some fail to run altogether.&lt;br /&gt;
&lt;br /&gt;
You can also use the KDE Installer for Windows to install source code and the packages that you need to ''build'' KDE4 on Windows&lt;br /&gt;
(although if you are building KDE4 on Windows you may prefer to use the emerge system to build KDE and its requirements from latest source);&lt;br /&gt;
see [[Getting Started/Build/KDE4/Windows]].&lt;br /&gt;
&lt;br /&gt;
=== Summary of Steps ===&lt;br /&gt;
* Visit http://download.cegit.de/kde-windows/installer&lt;br /&gt;
* Download and save the latest version to a directory, e.g. &amp;lt;tt&amp;gt;C:\KDE4&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Run the installer, download what you need (see [[#Download needed packages]] below).&lt;br /&gt;
* Add your lib directory, e.g. &amp;lt;tt&amp;gt;C:\KDE4\lib&amp;lt;/tt&amp;gt; to your Windows %PATH%.  (Start &amp;gt; Control Panel &amp;gt; System &amp;gt; Advanced &amp;gt; Environment Variables, double-click the Path System Variable and this to your path separated by semicolon.)&lt;br /&gt;
* Add a KDEDIRS environment variable (Start &amp;gt; Control Panel &amp;gt; System &amp;gt; Advanced &amp;gt; Environment Variables, click [New] User variable and create Variable name &amp;lt;tt&amp;gt;KDEDIRS&amp;lt;/tt&amp;gt; with Variable value the directory where you installed KDE4, e.g. &amp;lt;tt&amp;gt;C:\KDE4&amp;lt;/tt&amp;gt;).&lt;br /&gt;
* Try running a Qt application in the &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; directory, such as linguist.exe&lt;br /&gt;
* If that works, try running a KDE application such as &amp;lt;tt&amp;gt;kruler.exe&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Download needed packages ===&lt;br /&gt;
A single program in the The K Desktop Environment depends on many other libraries and packages; that is why each .exe is comparatively small.&lt;br /&gt;
The KDE Installer for Windows has some awareness of dependencies,&lt;br /&gt;
but not complete.&lt;br /&gt;
So, the first few times you try to run an application you may see alerts about missing DLLs.&lt;br /&gt;
&lt;br /&gt;
If you do not intend to build from source, do not click &amp;quot;all&amp;quot; and do not click &amp;quot;src&amp;quot;, as you do not need to download the source for each package. ''Unclear whether you need lib for each''.&lt;br /&gt;
&lt;br /&gt;
There are two development systems for KDE on Windows,&lt;br /&gt;
Microsoft's Visual C and [http://en.wikipedia.org/wiki/MinGW MinGW].&lt;br /&gt;
Even if you are only running binaries and do not intend to build KDE4 yourself,&lt;br /&gt;
you need to choose between these.&lt;br /&gt;
As of October 2007, the former is more stable, so when you have a choice of packages in the KDE Installer for Windows, prefer the -msvc version.&lt;br /&gt;
&lt;br /&gt;
The KDE programs themselves are organized into several groups: kdeedu, kdegames, and kdegraphics.&lt;br /&gt;
&lt;br /&gt;
Here are some of the minimal packages you need to run a KDE application:&lt;br /&gt;
: dbus-msvc, kdewin32-msvc, qt-msvc, vcredist, ??&lt;br /&gt;
&lt;br /&gt;
The Dependencies tab for a particular package lists some of the additional packages it needs.&lt;br /&gt;
However, the dependency checking currently only works for first-level dependencies&lt;br /&gt;
Other dependencies are not easy to determine in advance.&lt;br /&gt;
For example, if you install kdegames only with its dependencies,&lt;br /&gt;
you will not be able to start it because you also need libstreamanalyze&lt;br /&gt;
(for which you have to install the strigi package).&lt;br /&gt;
&lt;br /&gt;
[[Getting_Started/Build/KDE4/Windows/3rd-party_libraries]] is a more complete list of libraries that a full installation needs.&lt;br /&gt;
&lt;br /&gt;
If a download fails, then the KDE Installer fails.&lt;br /&gt;
If you have a broken file, you need to delete it&lt;br /&gt;
and then restart the KDE Installer to download it again.&lt;br /&gt;
You can also download and unpack files manually.&lt;br /&gt;
&lt;br /&gt;
== Testing your installation ==&lt;br /&gt;
Navigate to the &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
See if you can run the Qt program assistant.exe.&lt;br /&gt;
Qt programs have fewer dependencies than a full-blown KDE application.&lt;br /&gt;
&lt;br /&gt;
If that works, try running a simple KDE application, such as kruler.exe from the kdegraphics package.&lt;br /&gt;
&lt;br /&gt;
The first KDE application you run will start a console window in order to run the [http://en.wikipedia.org/wiki/D-Bus D-Bus daemon].&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
&lt;br /&gt;
Using the kdewin-installer-gui-0.8.1-2.exe to install packages, dbus-daemon.exe starts up, and many games run.&lt;br /&gt;
&lt;br /&gt;
It seems running kbuildsycoca4.exe by hand helps applications like KStars and Okular to run.&lt;br /&gt;
&lt;br /&gt;
There are problems with the file open dialog:&lt;br /&gt;
* Besides I/O errors if you do not have KDEDIRS set (see elsewhere), you may see &amp;quot;Windows - No Disk&amp;quot; exceptions for each empty removable drive on your computer (floppy disk, CD-ROM, etc.).  Click [Continue] for each one.&lt;br /&gt;
&lt;br /&gt;
[[Category: MS Windows]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Oxygen/Missing_Icons</id>
		<title>Projects/Oxygen/Missing Icons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Oxygen/Missing_Icons"/>
				<updated>2007-11-04T14:22:42Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* KDE main modules */ Remove duplicate ksquares&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The page will help Oxygen team to track and produce icons that are currently missing in KDE4. Additionally it will help developers to make requests for icons that they need for KDE4 related projects. &lt;br /&gt;
&lt;br /&gt;
= Instructions to fill out the request =&lt;br /&gt;
&lt;br /&gt;
* This page, being a wiki, obviously does not validate your request. Please take care when providing information about the icons. Note that this page is mainly for the team to know where is mostly needed the work, we'll do our best to fullfill your requests for 4.0 but however we can't guarantee that. =)&lt;br /&gt;
&lt;br /&gt;
* When providing icon names please try to make them compatible with the actual naming scheme.&lt;br /&gt;
&lt;br /&gt;
* Please provide clear but short descriptions about the icons, it needs to help the artists in imagining a good metaphore to make your icon. '''This point is extremely important'''. You may obviously also link your description if it's going to be lengthy. This will help us to manage icon requests, and check if there are any possible duplicates. The most descriptive you are, the best it is for us.&lt;br /&gt;
&lt;br /&gt;
* Screenshots are sometimes a better way to easily show the usage of the icon. Provide metaphores when possible this will help the artist to visualize our reqest faster and give a better understanding of the reqest.&lt;br /&gt;
&lt;br /&gt;
* As someone already noted, this is not the right page to complain or make suggestions about existing icon, this is just to know the remaining work.&lt;br /&gt;
&lt;br /&gt;
* Please sort by module/application/priority&lt;br /&gt;
&lt;br /&gt;
= Missing Icons Table =&lt;br /&gt;
&lt;br /&gt;
== General purpose icons ==&lt;br /&gt;
For icons like the folder, or the desktop.&lt;br /&gt;
&lt;br /&gt;
{|rules=&amp;quot;all&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=center style=&amp;quot;border:1px solid #999; border-right:2px solid #999; border-bottom:2px solid #999;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Icon Name&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Description / Where can be found?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Done?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Assigned To&lt;br /&gt;
|-----&lt;br /&gt;
|| image-resize || an icon for an image resize action.  || Done (See disscusion page) || dmiller&lt;br /&gt;
|-----&lt;br /&gt;
|| move || move action [[http://websvn.kde.org/branches/KDE/3.5/kdelibs/pics/crystalsvg/cr16-action-move.png?revision=438982&amp;amp;view=markup]]  || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| application-javascript || Icon for *.js (application/javascript) files just like we have them for e.g. Python and Ruby. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| application-x-php || Icon for *.php (application/x-php). || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| idea || KStandardAction for &amp;quot;Tip of the Day&amp;quot;, for example seen in the help menu of KMail || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| item-locked || icon to show that an item or ui element is locked and will not move or disappear, such as a toolbar in a fullscreen window || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| item-unlocked || icon to show that an item or ui element is unlocked and will move or disappear, such as a toolbar in a fullscreen window || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| general-plugin || icon to show that there are plugins to enable, for example in a configuration dialog || ||&lt;br /&gt;
|-----&lt;br /&gt;
|-----&lt;br /&gt;
|| ordered-list || icon for indicating the creation of an ordered i.e. numbered list. Qt rich-text classes mean this will probably be used more often || ||&lt;br /&gt;
|-----&lt;br /&gt;
|| unordered-list || icon for indicating the creation of an unordered i.e. bulleted list. Qt rich-text classes mean this will probably be used more often || ||&lt;br /&gt;
|-----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KDE main modules ==&lt;br /&gt;
For apps in trunk/KDE/&lt;br /&gt;
&lt;br /&gt;
{|rules=&amp;quot;all&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=center style=&amp;quot;border:1px solid #999; border-right:2px solid #999; border-bottom:2px solid #999;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Module&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Application&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Icon Name&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Description / Where can be found?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Done?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Assigned To&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || filetypes-association || konqueror configuration dialog File Associations || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || filter-page || konqueror configuration dialog AdBlock Filters || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || enhanced_browsing || konqueror configuration dialog Web Shortcuts || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || cache || konqueror configuration dialog Cache || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || proxy || konqueror configuration dialog Proxy || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || fonts || konqueror configuration dialog Fonts || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || stylesheets || konqueror configuration dialog Stylesheets || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || cookies || konqueror configuration dialog Cookies || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || browser_identification || konqueror configuration dialog Browser Identification || Done 3/4 || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || text_to_speech || Konqueror text-to-speech plugin || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect || Generic effect icon || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| preferences-desktop-effects || Desktop effects config module || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-boxswitch || Boxswitch (alt-tab) effect (low priority) || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-desktopgrid || Desktopgrid (desktop switcher) effect (low priority) || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-presentwindows || Presentwindows effect (low priority) || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-shadow || Shadow effect (low priority) || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwrite || kwrite || Previously existed, recently removed from SVN. See Misc requests below for details || Yes (renamed accessories-text-editor)|| &lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwrite|| insert_file || KWrite insert file plugin || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwrite || word_completion || KWrite word completion plugin || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || systemsettings || preferences-desktop-color || Desktop colour settings configuration module || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || systemsettings || preferences-desktop-icons || Desktop icon settings configuration module  || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || systemsettings || preferences-desktop-theme-manager || Desktop theme selector module || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || systemsettings || preferences-desktop || Desktop configuration category || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || systemsettings || preferences-system-network-sharing || Network shares config module || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || systemsettings || preferences-desktop-launch-feedback || Launch feedback config module || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || systemsettings || preferences-desktop-login || KDM/login manager config module || Done - named preferences-system-login [[User:Djmdave|Djmdave]] 14:27, 1 November 2007 (CET) || Dmiller&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase &lt;br /&gt;
|| kopete (misc) || (various) || Emoticons for Kopete, See http://techbase.kde.org/index.php?title=Projects/Oxygen/Missing_Emoticons || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdemultimedia || kmix|| kmix icons || KMix icons || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| koffice &lt;br /&gt;
|| (all)&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| See http://wiki.koffice.org/index.php?title=Icons&lt;br /&gt;
|-----&lt;br /&gt;
|| kdeedu || kalgebra || application || Application Icon kdeedu/kalgebra/icons || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdeedu || kig || application || Application Icon kdeedu/kig/kig || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || identity || KMail configuration dialog for managing identities &amp;lt;i&amp;gt;(I beleive actions/contact is meant for this - [[User:Djmdave|Djmdave]] 11:59, 28 October 2007 (CET))&amp;lt;/i&amp;gt;|| Done ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || misc || KMail configuration dialog for miscellaneous configurations || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || ? (goto-page was used before) || Action to mark all currently unread mails in one folder as read (&amp;quot;Mark All Messages as Read&amp;quot;), can be found in the &amp;quot;Folder&amp;quot; menu of KMail || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || folder-sent-mail || Icon for folder where successfully sent mails are stored, as found on the left pane in KMail. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || mail_custom_reply || Reply to the currently selected message with a custom (user-created) template message. Found in the &amp;quot;Message-&amp;gt;Reply Special&amp;quot; menu entry in KMail. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || mail_custom_reply_all || Reply to the currently selected message with a custom (user-created) template message, and send the message to every addressee (All which are in To, From and CC headers). Found in the &amp;quot;Message-&amp;gt;Reply Special&amp;quot; menu entry in KMail. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || mail_custom_forward || Forward the currently selected message, using a custom (user-created) template message. Found in the &amp;quot;Message-&amp;gt;Forward&amp;quot; menu entry in KMail. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || mail_post_to || Creates a new message, which will have the mailing list of the current folder as the recepient. Can be found in the context menu of a folder in KMail, but only after activating &amp;quot;Folder-&amp;gt;Mailing List Management&amp;quot;. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kmail || mail_send_via ||&amp;quot;Send Queued Messages Via&amp;quot;, sends all mails which currently are queued in the outbox, but pops up a menu first asking the user which of his outgoing accounts (SMTP servers) he wants to use. Can be found in the &amp;quot;File&amp;quot; menu of KMail. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kalarm || kalarm || System tray icon, indicating alarms are enabled. Current icon is still the hicolor one. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kalarm || kalarm_disabled || System tray icon, indicating alarms are disabled. Current icon still is the hicolor one. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || korganizer || timespent || Doesn't exist yet. an icon representing the new timespent view. || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || dmiller&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || korganizer || timeline || Doesn't exist yet. an icon representing the new timeline view. || Done || dmiller&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || korganizer || view-calendar-journal || Doesn't exist yet. an icon representing KOrganizer's journal view. || New ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || korganizer || view-freebusy || Doesn't exist yet. an icon representing freebusy time in a calendar || New ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdesupport || strigi || strigi || Doesn't exist yet. It should be an owl.|| &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || bovo || bovo || Apps main icon || done || johann_ol&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || katomic || katomic || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kbattleship || kbattleship || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kblackbox || kblackbox || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kbounce || kbounce || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kgoldrunner || kgoldrunner || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kiriki || kiriki || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kjumpingcube || kjumpingcube || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || klines || klines || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kmahjongg || kmahjongg || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kmines || kmines || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || knetwalk || knetwalk || Apps main icon || done || johann_ol &amp;amp; trouvnez&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kolf || kolf || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || konquest || konquest || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kpat || kpat || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kreversi || kreversi || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || ksame || ksame || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kshisen || kshisen || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kspaceduel || kspaceduel || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || ksquares || ksquares || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || ksudoku || ksudoku || Apps main icon || done || johann_ol&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || ktuberling || ktuberling || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || kwin4 || kwin4 || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || lskat || lskat || Apps main icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-config-options || Old ChooseGameType action, used in configuration panes, to specify game types, variations or options|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-solve || Solve action for games, used to be a wizard's wand|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkmahjongg || games-config-tiles || Configuration pane icon, used to select the tileset in kmahjongg and kshisen. Could be possibly created from the tilesets SVG graphics in kdegames/libkmahjongg/tilesets|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkmahjongg || games-config-background || Configuration pane icon, used to select the field background in kmahjongg and kshisen. Could be reused by other games as a generic background icon|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkmahjongg || games-config-board || Configuration pane icon, used to select the board layout in kmahjongg and kshisen. Could be reused by other games as a generic configure levels/boards icon|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-config-theme || Configuration pane icon, used to select the KGameTheme to be used|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-config-custom || Configuration pane icon, used to configure custom game options, or complex settings|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-endturn || End turn checkmark|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || krdc || krdc-viewonly || Toggles the remote view viewonly / view-control mode. Viewonly means, that the remote desktop shows all updates, but the client does not send actions back to the server. At the moment the kgpg-sign-kgpg is used there. --[[User:Uwolfer|Uwolfer]] 23:11, 28 October 2007 (CET) || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kget || connect-creating || Shown while trying to connect to a server. --[[User:Uwolfer|Uwolfer]] 21:05, 29 October 2007 (CET) || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || kopeteavailable || Icon representing the user in an online state. Used to set status to online || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || kopeteaway || Icon representing the user in an away state. Used to set status to away.  NB for this and the following kopetebusy there are overlay icons (small clock faces etc) in kdenetwork/kopete/icons that are used to generate contact status icons at runtime.  It would be good if these icons were consistent with the overlay icons || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || kopetebusy || Icon representing the user in an away state. Used to set status to busy || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || metacontact_away || Icon representing an IM contact in an away state. Used in the contact list  || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || metacontact_online || Icon representing an IM contact in an online state. Used in the contact list || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || metacontact_offline || Icon representing an IM contact in an offline state. Used in the contact list  || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || metacontact_unknown || Icon representing the user in an unknown state. Used in the contact list  || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || kopete_plugin || Generic icon for extensions - please no literal 'plug' icon as we use this already for network connections || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || kopete_privacy || Configuring privacy settings || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || kopete_texteffect || Configuring text formatting special effects || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || kopete_autoreplace || Configuring text autocorrect rules || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || highlight || Configuring text highlighting - icon exists but only in a low resolution || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || urlpicpreview || icon exists but only in a low resolution || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdenetwork || kopete || newmsg || icon flashed in system tray when new messages are received || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdeutils || kwalletmanager || wallet_open|| kwalletmanager system tray icon when a wallet is open || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdeutils || kwalletmanager || wallet_closed || kwalletmanager system tray icon when a wallet is close || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|| kdeutils || kwalletmanager || kwalletmanager || kwalletmanager application icon || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; || &lt;br /&gt;
|-----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other 3rd party Application Icons ==&lt;br /&gt;
For all the other applications&lt;br /&gt;
&lt;br /&gt;
{|rules=&amp;quot;all&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=center style=&amp;quot;border:1px solid #999; border-right:2px solid #999; border-bottom:2px solid #999;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Application&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Icon Name&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Description / Where can be found?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Done?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Assigned To&lt;br /&gt;
|-----&lt;br /&gt;
|| KSystemlog || KSystemLog icon || [http://websvn.kde.org/trunk/playground/sysadmin/ksystemlog/src/hi128-app-ksystemlog.png?view=markup App icon] - Made by a non-graphic designer developer ;-) || Done (utilites-log-viewer) || dmiller&lt;br /&gt;
|-----&lt;br /&gt;
|| Tagua || tagua || [http://www.tagua-project.org/chrome/site/banner.png Tagua logo] || Done (in apps) || dmiller&lt;br /&gt;
|-----&lt;br /&gt;
|| Tagua || tagua-movelist || toggle [http://www.tagua-project.org/attachment/wiki/Screenshots/nested1.png movelist] &amp;lt;i&amp;gt;Suggestion: I beleive the actions/history.png icon would be most suitable? - [[User:Djmdave|Djmdave]] 19:13, 26 October 2007 (CEST)&amp;lt;/i&amp;gt;|| Yes - Use actions/history.png ||&lt;br /&gt;
|-----&lt;br /&gt;
|| Amarok || amarok ||&lt;br /&gt;
[http://websvn.kde.org/trunk/extragear/multimedia/amarok/src/images/amarok_icon.svg App icon]. Needs Oxygen colors, we don't really want to change design.&lt;br /&gt;
|| &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; &lt;br /&gt;
||&lt;br /&gt;
|-----&lt;br /&gt;
|| Firefox || firefox || [http://en.www.mozilla.com/img/products/firefox-title.jpg Firefox logo] || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|| GIMP || gimp || [http://upload.wikimedia.org/wikipedia/commons/5/55/GIMP_Icon.png GIMP logo] || &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;No&amp;lt;/span&amp;gt; ||&lt;br /&gt;
|-----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Misc Icon Requests =&lt;br /&gt;
* Please see my request on http://www.nabble.com/Suggestion-for-Oxygen:-Highlight-difference-between-Kate-and-KWrite-t4447769.html and the bug report to help you track this wish at: https://bugs.kde.org/show_bug.cgi?id=138170.&lt;br /&gt;
&amp;lt;b&amp;gt;Update&amp;lt;/b&amp;gt;:Thanks Djmdave, for moving this here. Now the KWrite icon is totally missing. See: http://websvn.kde.org/trunk/KDE/kdebase/runtime/pics/oxygen/128x128/apps/kwrite.png?view=markup and other corresponding directories (scalable 64x64 etc). My request for two distinct icons for Kate and KWrite stands. Please see bug for more details and discussion.&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Projects/Oxygen/Missing_Icons</id>
		<title>Projects/Oxygen/Missing Icons</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Projects/Oxygen/Missing_Icons"/>
				<updated>2007-10-26T18:13:10Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: /* KDE main modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The page will help Oxygen team to track and produce icons that are currently missing in KDE4. Additionally it will help developers to make requests for icons that they need for KDE4 related projects. &lt;br /&gt;
&lt;br /&gt;
= Instructions to fill out the request =&lt;br /&gt;
&lt;br /&gt;
* This page, being a wiki, obviously does not validate your request. Please take care when providing information about the icons. Note that this page is mainly for the team to know where is mostly needed the work, we'll do our best to fullfill your requests for 4.0 but however we can't guarantee that. =)&lt;br /&gt;
&lt;br /&gt;
* When providing icon names please try to make them compatible with the actual naming scheme.&lt;br /&gt;
&lt;br /&gt;
* Please provide clear but short descriptions about the icons, it needs to help the artists in imagining a good metaphore to make your icon. '''This point is extremely important'''. You may obviously also link your description if it's going to be lengthy. This will help us to manage icon requests, and check if there are any possible duplicates. The most descriptive you are, the best it is for us.&lt;br /&gt;
&lt;br /&gt;
* Screenshots are sometimes a better way to easily show the usage of the icon. Provide metaphores when possible this will help the artist to visualize our reqest faster and give a better understanding of the reqest.&lt;br /&gt;
&lt;br /&gt;
* As someone already noted, this is not the right page to complain or make suggestions about existing icon, this is just to know the remaining work.&lt;br /&gt;
&lt;br /&gt;
* Please sort by module/application/priority&lt;br /&gt;
&lt;br /&gt;
= Missing Icons Table =&lt;br /&gt;
&lt;br /&gt;
== General purpose icons ==&lt;br /&gt;
For icons like the folder, or the desktop.&lt;br /&gt;
&lt;br /&gt;
{|rules=&amp;quot;all&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=center style=&amp;quot;border:1px solid #999; border-right:2px solid #999; border-bottom:2px solid #999;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Icon Name&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Description / Where can be found?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Done?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Assigned To&lt;br /&gt;
|-----&lt;br /&gt;
|| image-resize || an icon for an image resize action || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| move || move action [[http://websvn.kde.org/branches/KDE/3.5/kdelibs/pics/crystalsvg/cr16-action-move.png?revision=438982&amp;amp;view=markup]]  || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| javascript || Icon for *.js (application/javascript) files just like we have them for e.g. Python and Ruby. || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== KDE main modules ==&lt;br /&gt;
For apps in trunk/KDE/&lt;br /&gt;
&lt;br /&gt;
{|rules=&amp;quot;all&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=center style=&amp;quot;border:1px solid #999; border-right:2px solid #999; border-bottom:2px solid #999;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Module&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Application&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Icon Name&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Description / Where can be found?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Done?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Assigned To&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || filetypes-association || konqueror configuration dialog File Associations || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || filter-page || konqueror configuration dialog AdBlock Filters || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || enhanced_browsing || konqueror configuration dialog Web Shortcuts || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || cache || konqueror configuration dialog Cache || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || proxy || konqueror configuration dialog Proxy || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || fonts || konqueror configuration dialog Fonts || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || stylesheets || konqueror configuration dialog Stylesheets || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || cookies || konqueror configuration dialog Cookies || Done || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || browser_identification || konqueror configuration dialog Browser Identification || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || konqueror || text_to_speech || Konqueror text-to-speech plugin || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect || Generic effect icon || In progress || Pinheiro&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| preferences-desktop-effects || Desktop effects config module || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-boxswitch || Boxswitch (alt-tab) effect (low priority) || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-desktopgrid || Desktopgrid (desktop switcher) effect (low priority) || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-presentwindows || Presentwindows effect (low priority) || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwin|| kwin-effect-shadow || Shadow effect (low priority) || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwrite|| insert_file || KWrite insert file plugin || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdebase || kwrite || word_completion || KWrite word completion plugin || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdemultimedia || kmix|| kmix icons || KMix icons || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| koffice &lt;br /&gt;
|| (all)&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;| See http://wiki.koffice.org/index.php?title=Icons&lt;br /&gt;
|-----&lt;br /&gt;
|| kdeedu || kalgebra || application || Application Icon kdeedu/kalgebra/icons || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdeedu || kig || application || Application Icon kdeedu/kig/kig || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kalarm || kalarm || System tray icon, indicating alarms are enabled. Current icon is still the hicolor one. || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || kalarm || kalarm_disabled || System tray icon, indicating alarms are disabled. Current icon still is the hicolor one. || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || korganizer || timespent || Doesn't exist yet. an icon representing the new timespent view. || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdepim || korganizer || timeline || Doesn't exist yet. an icon representing the new timeline view. || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdesupport || strigi || strigi || Doesn't exist yet. It should be an owl.|| No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-config-options || Old ChooseGameType action, used in configuration panes, to specify game types, variations or options|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-solve || Solve action for games, used to be a wizard's wand|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkmahjongg || games-config-tiles || Configuration pane icon, used to select the tileset in kmahjongg and kshisen. Could be possibly created from the tilesets SVG graphics in kdegames/libkmahjongg/tilesets|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkmahjongg || games-config-background || Configuration pane icon, used to select the field background in kmahjongg and kshisen. Could be reused by other games as a generic background icon|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkmahjongg || games-config-board || Configuration pane icon, used to select the board layout in kmahjongg and kshisen. Could be reused by other games as a generic configure levels/boards icon|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-config-theme || Configuration pane icon, used to select the KGameTheme to be used|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-config-custom || Configuration pane icon, used to configure custom game options, or complex settings|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || libkdegames || games-endturn || End turn checkmark|| Done || piacentini&lt;br /&gt;
|-----&lt;br /&gt;
|| kdegames || ksquares|| ksquares || Game icon || No || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other 3rd party Application Icons ==&lt;br /&gt;
For all the other applications&lt;br /&gt;
&lt;br /&gt;
{|rules=&amp;quot;all&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=center style=&amp;quot;border:1px solid #999; border-right:2px solid #999; border-bottom:2px solid #999;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Application&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Icon Name&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Description / Where can be found?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Done?&lt;br /&gt;
! style=&amp;quot;background:#efefef;&amp;quot; | Assigned To&lt;br /&gt;
|-----&lt;br /&gt;
|| KSystemlog || KSystemLog icon || [http://websvn.kde.org/trunk/playground/sysadmin/ksystemlog/src/hi128-app-ksystemlog.png?view=markup App icon] - Made by a non-graphic designer developer ;-) || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| Tagua || tagua || [http://www.tagua-project.org/chrome/site/banner.png Tagua logo] || No ||&lt;br /&gt;
|-----&lt;br /&gt;
|| Tagua || tagua-movelist || toggle [http://www.tagua-project.org/attachment/wiki/Screenshots/nested1.png movelist] &amp;lt;i&amp;gt;Suggestion: I beleive the actions/history.png icon would be most suitable? - [[User:Djmdave|Djmdave]] 19:13, 26 October 2007 (CEST)&amp;lt;/i&amp;gt;|| Yes - Use actions/history.png ||&lt;br /&gt;
|-----&lt;br /&gt;
|| Amarok || amarok ||&lt;br /&gt;
[http://websvn.kde.org/trunk/extragear/multimedia/amarok/src/images/amarok_icon.svg App icon]. Needs Oxygen colors, we don't really want to change design.&lt;br /&gt;
|| No&lt;br /&gt;
||&lt;br /&gt;
|-----&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Misc Icon Requests =&lt;br /&gt;
* So sorry -- this is an Oxygen bug but not an Oxygen *style* bug -- I have asked twice publicly on the mailing list so I am doing this to grab attention -- sorry again. Please see my request on http://www.nabble.com/Suggestion-for-Oxygen:-Highlight-difference-between-Kate-and-KWrite-t4447769.html and the bug report to help you track this wish at: https://bugs.kde.org/show_bug.cgi?id=138170 Thanks for your work and sorry again for the out-of-place posting. &amp;lt;i&amp;gt;(I've moved this request from [[../StyleWinDec]]&amp;lt;/i&amp;gt; [[User:Djmdave|Djmdave]] 14:58, 18 October 2007 (CEST))&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(ru)</id>
		<title>Development/Tutorials/Using KXmlGuiWindow (ru)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(ru)"/>
				<updated>2007-08-04T14:53:34Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: KMainWindow → KXmlGuiWindow&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Использование KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program|Урок 1 - Hello World]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Урок 3 - KActions and XmlGui]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Введение==&lt;br /&gt;
Это продолжение [[Development/Tutorials/First_program|урока по созданию первой программы]], здесь представлена базовая информация по классу {{class|KXmlGuiWindow}}.&lt;br /&gt;
&lt;br /&gt;
В предыдущем уроке рассказывалось как создать всплывающее диалоговое окно, теперь мы сделаем первые шаги по созданию полноценного функционального приложения.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==Использование KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
Чтобы получить пользу on KXmlGuiWindow, следует создать производный от него класс. Наш код находится в двух файлах: &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt;. Класс KXmlGuiWindow выбран базовым, так как с помощью него можно использовать XML, например, чтобы определить структуру меню нашего приложения.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
		&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сначала в строке 7 мы объявляем производный от KXmlGuiWindow класс: &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;, а затем - конструктор &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
И наконец, объявляем указатель на объект, который станет главной частью нашей программы. {{class|KTextEdit}} является базовым редактором текста в формате richtext, поддерживающем некоторые вкусности KDE, как, например, автоматическое скрытие курсора.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сначала, конечно же, в строке 1 мы включаем заголовочный файл, содержащий объявление класса.&lt;br /&gt;
&lt;br /&gt;
В строке 5 создаётся объект нашего текстового редактора. Затем в строке 6 мы используем встроенную функцию setCentralWidget(), указывающую KXmlGuiWindow, что должно находиться в центральной секции нашего окна.&lt;br /&gt;
&lt;br /&gt;
Наконец, вызывается функция KXmlGuiWindow::setupGUI(), фоново выполняющая много различных действий по инициализации GUI и создающая панель меню по умолчанию (Settings, Help).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Создание main.cpp==&lt;br /&gt;
Чтобы завершить создание приложение, нужно написать пару строк в main.cpp:&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial2&amp;quot;, 0,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 2&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  &lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Новыми (по сравнению с Уроком 1) являются только строки 18 и 19. В строке 18 мы создаём объект MainWindow и в строке 17 делаем его видимым. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Наилучший способ собрать наше приложение - использовать CMake. Все изменения по сравнению с уроком 1 заключаются в добавлении файла &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; в список исходников и смене названия &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; на &amp;lt;tt&amp;gt;tutorial2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project (tutorial2)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set(tutorial2_SRCS &lt;br /&gt;
	main.cpp&lt;br /&gt;
	mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial2 ${tutorial2_SRCS})&lt;br /&gt;
target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Компиляция===&lt;br /&gt;
Чтобы скомпилировать, слинковать и запустить приложение, выполните:&lt;br /&gt;
 cmake . &amp;amp;&amp;amp; make &amp;amp;&amp;amp; ./tutorial2&lt;br /&gt;
&lt;br /&gt;
==Продолжим изучение==&lt;br /&gt;
Теперь можно перейти к статье о [[Development/Tutorials/Using_KActions|KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow</id>
		<title>Development/Tutorials/Using KXmlGuiWindow</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow"/>
				<updated>2007-08-04T14:52:36Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: KMainWindow → KXmlGuiWindow&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program|Tutorial 1 - Hello World]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions and XmlGui]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial carries on from [[Development/Tutorials/First_program|First Program Tutorial]] and will introduce the {{class|KXmlGuiWindow}} class.&lt;br /&gt;
&lt;br /&gt;
In the previous tutorial, the program caused a dialog box to pop up but we're going to take steps towards a functioning application.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==Using KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
In order to have a useful KXmlGuiWindow, we must subclass it. So we create two files, a &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; and a &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; which will contain our code. Our class inherits from KXmlGuiWindow because it uses XML e.g. to define the application's menu structure.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
		&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First we Subclass KXmlGuiWindow on line 7 with with &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Then we declare the constructor with &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
And finally we declare a pointer to the object that will make up the bulk of our program. {{class|KTextEdit}} is a generic richtext editor with some KDE niceties like cursor auto-hiding.&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
First, of course, on line 1 we have to include the header file containing the class declaration.&lt;br /&gt;
&lt;br /&gt;
On line 5, we initialise our text editor with an object. Then on line 6 we use the built-in setCentralWidget() function which tells the KXmlGuiWindow what should appear in the central section of the window.&lt;br /&gt;
&lt;br /&gt;
Finally, KXmlGuiWindow::setupGUI() is called which does a lot of behind-the-scenes stuff and creates the default menu bars (Settings, Help).&lt;br /&gt;
&lt;br /&gt;
==Back to main.cpp==&lt;br /&gt;
In order to actually run this window, we need to add a few lines in main.cpp:&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial2&amp;quot;, 0,&lt;br /&gt;
      ki18n(&amp;quot;Tutorial 2&amp;quot;), &amp;quot;1.0&amp;quot;,&lt;br /&gt;
      ki18n(&amp;quot;A simple text area&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2007 Developer&amp;quot;) );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  &lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The only new lines here (compared to Tutorial 1) are 18 and 19. On line 18, we create our MainWindow object and then on line 19, we display it.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
The best way to build the program is to use CMake. All that's changed since tutorial 1 is that &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; has been added to the sources list and any &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; has become &amp;lt;tt&amp;gt;tutorial2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
project (tutorial2)&lt;br /&gt;
&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include_directories( ${KDE4_INCLUDES} )&lt;br /&gt;
&lt;br /&gt;
set(tutorial2_SRCS &lt;br /&gt;
	main.cpp&lt;br /&gt;
	mainwindow.cpp&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
kde4_add_executable(tutorial2 ${tutorial2_SRCS})&lt;br /&gt;
target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Compile it===&lt;br /&gt;
To compile, link and run it, use:&lt;br /&gt;
 cmake . &amp;amp;&amp;amp; make &amp;amp;&amp;amp; ./tutorial2&lt;br /&gt;
&lt;br /&gt;
==Moving On==&lt;br /&gt;
Now you can move on to [[Development/Tutorials/Using_KActions|using KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Milliams</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions</id>
		<title>Development/Tutorials/Using KActions</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions"/>
				<updated>2007-06-28T15:57:34Z</updated>
		
		<summary type="html">&lt;p&gt;Milliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Beginner Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=How To Use KActions and XmlGui|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2 - KXmlGuiWindow]], Basic XML knowledge|&lt;br /&gt;
&lt;br /&gt;
next=TODO (milliams)| &lt;br /&gt;
&lt;br /&gt;
reading=None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Abstract==&lt;br /&gt;
We're going to introduce the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.&lt;br /&gt;
&lt;br /&gt;
Say, for example, we want to let the user clear the text box by clicking a button in the toolbar, from an option in the File menu or through a keyboard shortcut; we can provide all of those through one {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
A {{class|KAction}} is an object which contains all the information about the icon and shortcuts you want associated to a certain action. You then connect the action to a [http://doc.trolltech.com/latest/signalsandslots.html slot] which carries out the work of your action.&lt;br /&gt;
&lt;br /&gt;
===Creating Your Own===&lt;br /&gt;
&lt;br /&gt;
To create an action, you need to &amp;lt;tt&amp;gt;#include &amp;lt;KAction&amp;gt;&amp;lt;/tt&amp;gt; in your &amp;lt;tt&amp;gt;.cpp&amp;lt;/tt&amp;gt; file. &lt;br /&gt;
=====Creating the object=====&lt;br /&gt;
We're going to create an action which will clear the text area (see Tutorial 2). The KAction is built up in a number of steps. The first is creating the KAction&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KAction* clearAction = new KAction(this);&amp;lt;/code&amp;gt;&lt;br /&gt;
This creates a KAction called &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
=====Text=====&lt;br /&gt;
Now we have our KAction object, we can start setting its properties. First, we'll set the text that will be displayed in the menu and under its icon in the toolbar.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
As you can see, the text must be passed through the i18n() function if you want your UI to be translatable.&lt;br /&gt;
&lt;br /&gt;
=====Icon=====&lt;br /&gt;
If you're going to display the action in a toolbar, you're going to want to have an icon depicting the action. To set an icon we simply use the &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt; function thus:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setIcon(KIcon(&amp;quot;filenew&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Here we're setting the icon to the standard KDE &amp;lt;tt&amp;gt;filenew&amp;lt;/tt&amp;gt; icon.&lt;br /&gt;
=====Shortcut=====&lt;br /&gt;
We can also set a shortcut that will perform our action. It's as simple as a&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setShortcut(Qt::CTRL+Qt::Key_W);&amp;lt;/code&amp;gt;&lt;br /&gt;
to set Ctrl+W to be associated to this action.&lt;br /&gt;
=====Adding to the Collection=====&lt;br /&gt;
In order for our action to be accessable by the XmlGui framework it must be added to the application's ''action collection''. It is accessed via the &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt; function thus: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Here we add the &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; KAction to the collection and give it a name of ''clear''. This name is used by the XmlGui framework.&lt;br /&gt;
=====Connecting the action=====&lt;br /&gt;
Now our action is fully set up, we need to connect it to something useful. We're going to connect our action to the &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; action belonging to a KTextArea.&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
connect( clearAction, SIGNAL( triggered(bool) ), &lt;br /&gt;
         textArea, SLOT( clear() ) );&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This is the same as it would be done in Qt with a {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
&lt;br /&gt;
For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through {{class|KStandardAction}}.&lt;br /&gt;
&lt;br /&gt;
They are very simple to use. Once you've done &amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;, you simply need to supply it with what you want the function to do and which KActionCollection to add it to. For example,&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
Will Create a KAction with the correct icon, text and shortcut and will even add it to the File menu.&lt;br /&gt;
&lt;br /&gt;
==The Code==&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#ifndef MAINWINDOW_H&lt;br /&gt;
#define MAINWINDOW_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KXmlGuiWindow&amp;gt;&lt;br /&gt;
#include &amp;lt;KTextEdit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class MainWindow : public KXmlGuiWindow&lt;br /&gt;
{&lt;br /&gt;
  public:&lt;br /&gt;
    MainWindow(QWidget *parent=0);&lt;br /&gt;
	&lt;br /&gt;
  private:&lt;br /&gt;
    KTextEdit* textArea;&lt;br /&gt;
    void setupActions();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mainwindow.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAction&amp;gt;&lt;br /&gt;
#include &amp;lt;KLocale&amp;gt;&lt;br /&gt;
#include &amp;lt;KActionCollection&amp;gt;&lt;br /&gt;
#include &amp;lt;KStandardAction&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
    : KXmlGuiWindow(parent)&lt;br /&gt;
{&lt;br /&gt;
  textArea = new KTextEdit;&lt;br /&gt;
  setCentralWidget(textArea);&lt;br /&gt;
&lt;br /&gt;
  setupActions();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MainWindow::setupActions()&lt;br /&gt;
{&lt;br /&gt;
  KAction* clearAction = new KAction(this);&lt;br /&gt;
  clearAction-&amp;gt;setText(i18n(&amp;quot;Clear&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setIcon(KIcon(&amp;quot;filenew&amp;quot;));&lt;br /&gt;
  clearAction-&amp;gt;setShortcut(Qt::CTRL+Qt::Key_W);&lt;br /&gt;
  actionCollection()-&amp;gt;addAction(&amp;quot;clear&amp;quot;, clearAction);&lt;br /&gt;
  connect(clearAction, SIGNAL(triggered(bool)),&lt;br /&gt;
          textArea, SLOT(clear()));&lt;br /&gt;
&lt;br /&gt;
  KStandardAction::quit(kapp, SLOT(quit()),&lt;br /&gt;
                        actionCollection());&lt;br /&gt;
&lt;br /&gt;
  setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&amp;lt;code cppqt n&amp;gt;&lt;br /&gt;
#include &amp;lt;KApplication&amp;gt;&lt;br /&gt;
#include &amp;lt;KAboutData&amp;gt;&lt;br /&gt;
#include &amp;lt;KCmdLineArgs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;mainwindow.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  KAboutData aboutData( &amp;quot;tutorial3&amp;quot;, &amp;quot;Tutorial 3&amp;quot;,&lt;br /&gt;
      &amp;quot;1.0&amp;quot;, &amp;quot;A simple text area using KAction etc.&amp;quot;,&lt;br /&gt;
      KAboutData::License_GPL, &amp;quot;(c) 2006&amp;quot; );&lt;br /&gt;
  KCmdLineArgs::init( argc, argv, &amp;amp;aboutData );&lt;br /&gt;
  KApplication app;&lt;br /&gt;
 &lt;br /&gt;
  MainWindow* window = new MainWindow();&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
  return app.exec();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Putting the actions in the menus and toolbars==&lt;br /&gt;
Now, at the moment, we've only created our new &amp;quot;Clear&amp;quot; action. It won't yet show up in the menus or in the toolbars. To tell the program where to put our actions (and to allow the end-user to move them around) we use a KDE technology called XmlGui.&lt;br /&gt;
===XmlGui===&lt;br /&gt;
{{note|In a later version of KDE4, XmlGui may be replaced with a new framework called liveui. For now, XmlGui is the only and correct way to set up the UI.}}&lt;br /&gt;
&lt;br /&gt;
When you call &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; in your {{class|KXmlGuiWindow}} class, it calls the XmlGui system which reads an XML file description of your interface (which we will create in a minute) and creates the buttons and menus appropriately.&lt;br /&gt;
&lt;br /&gt;
Now obviously XmlGui needs to know which file is your description file, i.e. it needs to know its name and location. The rule for the naming is the file should be called &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt; (where &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; is the name you set in {{class|KAboutData}}), so in our example, the file will be called &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;. Where the file will be located is handled by CMake.&lt;br /&gt;
&lt;br /&gt;
===Writing your ''appname''ui.rc File===&lt;br /&gt;
&lt;br /&gt;
Since the description of our UI is being defined with XML, the layout of the description must follow strict rules. We won't go through all the rules in this tutorial but for more information, see the _detailed_XmlGui_page_ (once we have a full explanation of XmlGui (or possibly liveui if that's done soon :)) on the wiki, I'll link it up).&lt;br /&gt;
&lt;br /&gt;
===tutorial3ui.rc===&lt;br /&gt;
&amp;lt;code xml n&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE kpartgui SYSTEM &amp;quot;kpartgui.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gui name=&amp;quot;tutorial3&amp;quot; 