<?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=Edumardo&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=Edumardo&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Special:Contributions/Edumardo"/>
		<updated>2013-05-18T11:35:43Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-10-06T11:46:51Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Puedes contactar conmigo en aesalemolo at gmail dot com.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (10/09/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Session_Management_(es) (29/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Guidelines_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es) (18/03/09)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;br /&gt;
&lt;br /&gt;
=== Ediciones de otros usuarios ===&lt;br /&gt;
Usuario [http://techbase.kde.org/index.php?title=Special:Contributions&amp;amp;limit=250&amp;amp;target=92.56.11.161 anónimo] (si lees esto ponte en contacto conmigo!):&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/D-Bus/Introduction_%28es%29 (10/09/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/D-Bus/Autostart_Services_%28es%29 (10/09/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-10-06T11:46:32Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Puedes contactar conmigo en esalemolo at gmail dot com.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (10/09/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Session_Management_(es) (29/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Guidelines_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es) (18/03/09)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;br /&gt;
&lt;br /&gt;
=== Ediciones de otros usuarios ===&lt;br /&gt;
Usuario [http://techbase.kde.org/index.php?title=Special:Contributions&amp;amp;limit=250&amp;amp;target=92.56.11.161 anónimo] (si lees esto ponte en contacto conmigo!):&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/D-Bus/Introduction_%28es%29 (10/09/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/D-Bus/Autostart_Services_%28es%29 (10/09/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)</id>
		<title>Development/Tutorials/Saving and loading (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)"/>
				<updated>2009-03-31T16:27:24Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: links update&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Cargar y guardar archivos|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions_(es)|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/KCmdLineArgs_(es)|Tutorial 5 - Usar KCmdLineArgs]]| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos una interfaz básica del editor de textos, es hora de añadirle funcionalidad. Básicamente, un editor de textos  debe abrir archivos desde disco, guardar archivos que has creado/editado y crear nuevos archivos.&lt;br /&gt;
&lt;br /&gt;
KDE proporciona algunas clases para trabajar con archivos que hacen la vida mucho mas fácil a los desarrolladores. La biblioteca KIO te permite fácilmente tener acceso a archivos a través de protocolos de red transparentes, así como mediante cuadros de dialogo estándar.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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) 2008 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; no ha cambiado desde el tutorial 3, excepto el cambio de cualquier referencia de tutorial 3 a 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 //nuevo respecto al 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; //nuevo&lt;br /&gt;
&lt;br /&gt;
	private slots: //nuevo&lt;br /&gt;
		void newFile(); //nuevo&lt;br /&gt;
		void openFile(); //nuevo&lt;br /&gt;
		void saveFile(); //nuevo&lt;br /&gt;
		void saveFileAs(); //nuevo&lt;br /&gt;
		void saveFileAs(const QString &amp;amp;outputFileName); //nuevo &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Como queremos añadir la posibilidad de cargar y guardar archivos, debemos añadir las funciones que realizarán el trabajo. Ya que invocaremos a las funciones mediante el mecanismo de Qt [http://doc.trolltech.com/latest/signalsandslots.html signal/slot], debemos especificar que dichas funciones son slots, por lo que lo hacemos en la linea 19. Como estamos usando slots en el archivo cabecera, debemos también añadir la macro [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
También queremos llevar un registro del nombre del archivo abierto actual, por lo que declaramos &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; //nuevo&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //nuevo&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
	: KXmlGuiWindow(parent),&lt;br /&gt;
		fileName(QString()) //nuevo&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;Limpiar&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;limpiar&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()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Nuevo de aqui en adelante&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().toUtf8());&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, 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, 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;gui name=&amp;quot;tutorial4&amp;quot;&lt;br /&gt;
     version=&amp;quot;1&amp;quot;&lt;br /&gt;
     xmlns=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&amp;quot;&lt;br /&gt;
     xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
     xsi:schemaLocation=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&lt;br /&gt;
                         http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd&amp;quot; &amp;gt;&lt;br /&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;limpiar&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&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;limpiar&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es idéntico a &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; del tutorial 3 excepto &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;, que ha cambiado a 'tutorial4'. No necesitamos añadir ninguna información de las &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; ya que la posición de esas acciones las maneja KDE automaticamente.&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bien, ahora vamos a implementar el código que realizará el trabajo de cargar y guardar. Esto se lleva a cabo en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo primero que hacemos es añadir&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;
al constructor de &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; en la linea 16. Esto asegura que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; esté vacio desde el principio.&lt;br /&gt;
&lt;br /&gt;
===Añadir las acciones===&lt;br /&gt;
&lt;br /&gt;
La primera cosa que vamos a hacer es proporcionar al usuario la interfaz para decirle a la aplicación que cargue o guarde un archivo. Como ya hicimos con la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; en el tutorial 3, usaremos &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. En las lineas 37-47 añadimos las acciones de la misma manera que la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt;. Para cada una de ellas, la conectamos que el slot apropiado que hemos declarado en el archivo cabecera.&lt;br /&gt;
&lt;br /&gt;
===Crear un nuevo documento===&lt;br /&gt;
&lt;br /&gt;
La primera función que hemos definido es &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt;.&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;
Con &amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; ponemos la QString como &amp;quot;vacia&amp;quot; para reflejar el hecho de que el documento aún no está presente en disco. A continuación, &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; limpia el area de texto usando la misma función que conectaba con la &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; en el tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Guardar un archivo===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a escribir nuestro primer código que maneje archivos. Vamos a implementar una función que guardará el contenido del área de texto en un archivo con un nombre pasado como parámetro. KDE proporciona una clase llamada {{class|KSaveFile}} para guardar archivos de manera segura, que hereda de la clase de Qt {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
El prototipo de la función es:&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;
A continuación creamos nuestro objeto &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; y lo abrimos con:&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;
Ahora que tenemos nuestro &amp;quot;file&amp;quot; para escribir, necesitamos convertir el texto del area de texto a un formato que pueda ser escrito en el archivo. Para hacer esto, creamos un {{qt|QByteArray}} y lo rellenamos con la versión en texto plano de lo que haya en el area de texto:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Ahora que tenemos nuestro &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, lo usamos para escribir el archivo con &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. Si estuvieramos usando un &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, los cambios se reflejarían inmediatamente. Sin embargo, si se ha producido un problema parcial en la escritura, el archivo podría estar corrupto. Por esta razón, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; escribe primero en un archivo temporal y luego, en la llamada &amp;lt;tt&amp;gt;KSaveFile::Finalize&amp;lt;/tt&amp;gt;, refleja los cambios en el archivo actual.&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;
Por último, establecemos que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; apunte al nombre del archivo que acabamos de guardar.&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;
Esta es la función a la que está conectado el slot &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt;. Simplemente llama a la función genérica &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; pasandole el nombre del fichero devuelto por &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;
Este es nuestro primer uso de la biblioteca KIO. La clase {{class|KFileDialog}} proporciona diferentes funciones estáticas para mostrar cuadros de dialgo estandar, usados en todas las aplicaciones de KDE. La llamada a &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; mostrará un diálogo donde el usuario puede seleccionar en nombre del archivo a guardar o elegir un nuevo nombre. La función devuelve el nombre del archivo, con el cual luego llamamos a &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;
No hay nada destacable o nuevo en esta función, solamente la lógica para decidir si se muestra el dialogo para guardar el archivo. Si &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; no está vacio, el archivo es guardado como &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. Si lo está, se muestra el diálogo para permitir al usuario elegir el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===Cargar un archivo===&lt;br /&gt;
&lt;br /&gt;
Por último, el tutorial 4 debe ser capaz de cargar archivos desde disco. El código para llevarlo a cabo se encuentra en la función &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Primero debemos preguntar al usuario por en nombre del archivo que desea abrir. Esto lo hacemos usando otra de las funciones de &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt;, &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;
Luego usamos la biblioteca KIO para recuperar nuestro archivo. Esto nos permite abrir el archivo con QFile incluso si está almacenado en una ubicación remota, como un sitio FTP. Hacemos la siguiente llamada a la función &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; de la clase {{class|NetAccess}}:&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;
El primer argumento es el nombre del archivo que queremos descargar. El segundo es un QString el cual, una vez se haya completado la descarga, contendrá la localización de la copia temporal del archivo. Es con &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; con quien trabajaremos a partir de ahora.&lt;br /&gt;
&lt;br /&gt;
La función devuelve &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; dependiendo si la transferencia tuvo exito. Si falló, mostraremos un mensaje informando del 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;
En caso contrario, continuamos con la apertura del archivo.&lt;br /&gt;
&lt;br /&gt;
Creamos un QFile pasando a su constructor el archivo temporal creado por &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; y lo abrirmos en modo de solo lectura:&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;
Para mostrar el contenido del archivo debemos usar un {{qt|QTextStream}}. Creamos uno pasandole el contenido de nuestro archivo a su constructor, y llamamos a la función de QFile &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; para obtener el texto del archivo. Luego este texto se le pasa a la función &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; de nuestra área de texto.&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;
A continuación almacenamos la ruta de acceso del archivo que acabamos de abrir:&lt;br /&gt;
&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;
y por último, eliminamos el archivo temporal que fué creado por &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, instalar  y ejecutar==&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;
Como ahora estamos usando la biblioteca KIO, debemos decirselo a CMAKE para que la enlace. Hacemos esto pasándole &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; a la función &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con este archivo, puede construirse y ejecutar el tutorial de la misma forma que el tutorial 3. Para mas información, ve al 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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/KCmdLineArgs_(es)|Tutorial 5 - KCmdLineArgs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)</id>
		<title>Development/Tutorials/Saving and loading (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)"/>
				<updated>2009-03-31T16:26:57Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: links update&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Cargar y guardar archivos|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions_(es)|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/KCmdLineArgs_(es)|Tutorial 5 - Usar KCmdLineArgs]]| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos una interfaz básica del editor de textos, es hora de añadirle funcionalidad. Básicamente, un editor de textos  debe abrir archivos desde disco, guardar archivos que has creado/editado y crear nuevos archivos.&lt;br /&gt;
&lt;br /&gt;
KDE proporciona algunas clases para trabajar con archivos que hacen la vida mucho mas fácil a los desarrolladores. La biblioteca KIO te permite fácilmente tener acceso a archivos a través de protocolos de red transparentes, así como mediante cuadros de dialogo estándar.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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) 2008 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; no ha cambiado desde el tutorial 3, excepto el cambio de cualquier referencia de tutorial 3 a 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 //nuevo respecto al 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; //nuevo&lt;br /&gt;
&lt;br /&gt;
	private slots: //nuevo&lt;br /&gt;
		void newFile(); //nuevo&lt;br /&gt;
		void openFile(); //nuevo&lt;br /&gt;
		void saveFile(); //nuevo&lt;br /&gt;
		void saveFileAs(); //nuevo&lt;br /&gt;
		void saveFileAs(const QString &amp;amp;outputFileName); //nuevo &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Como queremos añadir la posibilidad de cargar y guardar archivos, debemos añadir las funciones que realizarán el trabajo. Ya que invocaremos a las funciones mediante el mecanismo de Qt [http://doc.trolltech.com/latest/signalsandslots.html signal/slot], debemos especificar que dichas funciones son slots, por lo que lo hacemos en la linea 19. Como estamos usando slots en el archivo cabecera, debemos también añadir la macro [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
También queremos llevar un registro del nombre del archivo abierto actual, por lo que declaramos &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; //nuevo&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //nuevo&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
	: KXmlGuiWindow(parent),&lt;br /&gt;
		fileName(QString()) //nuevo&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;Limpiar&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;limpiar&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()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Nuevo de aqui en adelante&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().toUtf8());&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, 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, 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;gui name=&amp;quot;tutorial4&amp;quot;&lt;br /&gt;
     version=&amp;quot;1&amp;quot;&lt;br /&gt;
     xmlns=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&amp;quot;&lt;br /&gt;
     xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
     xsi:schemaLocation=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&lt;br /&gt;
                         http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd&amp;quot; &amp;gt;&lt;br /&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;limpiar&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&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;limpiar&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es idéntico a &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; del tutorial 3 excepto &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;, que ha cambiado a 'tutorial4'. No necesitamos añadir ninguna información de las &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; ya que la posición de esas acciones las maneja KDE automaticamente.&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bien, ahora vamos a implementar el código que realizará el trabajo de cargar y guardar. Esto se lleva a cabo en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo primero que hacemos es añadir&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;
al constructor de &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; en la linea 16. Esto asegura que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; esté vacio desde el principio.&lt;br /&gt;
&lt;br /&gt;
===Añadir las acciones===&lt;br /&gt;
&lt;br /&gt;
La primera cosa que vamos a hacer es proporcionar al usuario la interfaz para decirle a la aplicación que cargue o guarde un archivo. Como ya hicimos con la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; en el tutorial 3, usaremos &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. En las lineas 37-47 añadimos las acciones de la misma manera que la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt;. Para cada una de ellas, la conectamos que el slot apropiado que hemos declarado en el archivo cabecera.&lt;br /&gt;
&lt;br /&gt;
===Crear un nuevo documento===&lt;br /&gt;
&lt;br /&gt;
La primera función que hemos definido es &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt;.&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;
Con &amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; ponemos la QString como &amp;quot;vacia&amp;quot; para reflejar el hecho de que el documento aún no está presente en disco. A continuación, &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; limpia el area de texto usando la misma función que conectaba con la &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; en el tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Guardar un archivo===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a escribir nuestro primer código que maneje archivos. Vamos a implementar una función que guardará el contenido del área de texto en un archivo con un nombre pasado como parámetro. KDE proporciona una clase llamada {{class|KSaveFile}} para guardar archivos de manera segura, que hereda de la clase de Qt {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
El prototipo de la función es:&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;
A continuación creamos nuestro objeto &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; y lo abrimos con:&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;
Ahora que tenemos nuestro &amp;quot;file&amp;quot; para escribir, necesitamos convertir el texto del area de texto a un formato que pueda ser escrito en el archivo. Para hacer esto, creamos un {{qt|QByteArray}} y lo rellenamos con la versión en texto plano de lo que haya en el area de texto:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Ahora que tenemos nuestro &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, lo usamos para escribir el archivo con &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. Si estuvieramos usando un &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, los cambios se reflejarían inmediatamente. Sin embargo, si se ha producido un problema parcial en la escritura, el archivo podría estar corrupto. Por esta razón, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; escribe primero en un archivo temporal y luego, en la llamada &amp;lt;tt&amp;gt;KSaveFile::Finalize&amp;lt;/tt&amp;gt;, refleja los cambios en el archivo actual.&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;
Por último, establecemos que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; apunte al nombre del archivo que acabamos de guardar.&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;
Esta es la función a la que está conectado el slot &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt;. Simplemente llama a la función genérica &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; pasandole el nombre del fichero devuelto por &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;
Este es nuestro primer uso de la biblioteca KIO. La clase {{class|KFileDialog}} proporciona diferentes funciones estáticas para mostrar cuadros de dialgo estandar, usados en todas las aplicaciones de KDE. La llamada a &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; mostrará un diálogo donde el usuario puede seleccionar en nombre del archivo a guardar o elegir un nuevo nombre. La función devuelve el nombre del archivo, con el cual luego llamamos a &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;
No hay nada destacable o nuevo en esta función, solamente la lógica para decidir si se muestra el dialogo para guardar el archivo. Si &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; no está vacio, el archivo es guardado como &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. Si lo está, se muestra el diálogo para permitir al usuario elegir el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===Cargar un archivo===&lt;br /&gt;
&lt;br /&gt;
Por último, el tutorial 4 debe ser capaz de cargar archivos desde disco. El código para llevarlo a cabo se encuentra en la función &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Primero debemos preguntar al usuario por en nombre del archivo que desea abrir. Esto lo hacemos usando otra de las funciones de &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt;, &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;
Luego usamos la biblioteca KIO para recuperar nuestro archivo. Esto nos permite abrir el archivo con QFile incluso si está almacenado en una ubicación remota, como un sitio FTP. Hacemos la siguiente llamada a la función &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; de la clase {{class|NetAccess}}:&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;
El primer argumento es el nombre del archivo que queremos descargar. El segundo es un QString el cual, una vez se haya completado la descarga, contendrá la localización de la copia temporal del archivo. Es con &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; con quien trabajaremos a partir de ahora.&lt;br /&gt;
&lt;br /&gt;
La función devuelve &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; dependiendo si la transferencia tuvo exito. Si falló, mostraremos un mensaje informando del 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;
En caso contrario, continuamos con la apertura del archivo.&lt;br /&gt;
&lt;br /&gt;
Creamos un QFile pasando a su constructor el archivo temporal creado por &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; y lo abrirmos en modo de solo lectura:&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;
Para mostrar el contenido del archivo debemos usar un {{qt|QTextStream}}. Creamos uno pasandole el contenido de nuestro archivo a su constructor, y llamamos a la función de QFile &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; para obtener el texto del archivo. Luego este texto se le pasa a la función &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; de nuestra área de texto.&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;
A continuación almacenamos la ruta de acceso del archivo que acabamos de abrir:&lt;br /&gt;
&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;
y por último, eliminamos el archivo temporal que fué creado por &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, instalar  y ejecutar==&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;
Como ahora estamos usando la biblioteca KIO, debemos decirselo a CMAKE para que la enlace. Hacemos esto pasándole &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; a la función &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con este archivo, puede construirse y ejecutar el tutorial de la misma forma que el tutorial 3. Para mas información, ve al 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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/KCmdLineArgs|Tutorial 5 - KCmdLineArgs_(es)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-29T19:26:02Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Session_Management_(es) (29/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Guidelines_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es) (18/03/09)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Session_Management_(es)</id>
		<title>Development/Tutorials/Session Management (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Session_Management_(es)"/>
				<updated>2009-03-28T23:46:44Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: traducción al español&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Session Management}}&lt;br /&gt;
&lt;br /&gt;
==KDE y el administrador de sesiones de X11==&lt;br /&gt;
&lt;br /&gt;
Desde KDE 1.0, están soportados los protocolos de administración de sesiones X11R4 e ICCCM. El legado de las aplicaciones que definen la propiedad &amp;lt;tt&amp;gt;WM_COMMAND&amp;lt;/tt&amp;gt; o soportan el protocolo &amp;lt;tt&amp;gt;WM_SAVE_YOURSELF&amp;lt;/tt&amp;gt; será restaurado con la orden específica. Es decir, se restaurará la geometría de las ventanas correctamente.&lt;br /&gt;
&lt;br /&gt;
A partir de KDE 2.0, también está soportado y en uso el protocolo XSMP del administrador de sesiones de X11R6. La documentación oficial del estándar puede descargarse desde el servidor FTP del consorcio de X [http://stuff.mit.edu/afs/sipb/contrib/doc/X11/hardcopy/SM/xsmp.PS.gz ftp.x.org]. A diferencia de los protocolos de legado, el nuevo administrador de sesiones X11R6 da la posibilidad de guardar la aplicación dependiendo de los ajustes establecidos al salir de ella. Un editor de texto, por ejemplo, guardaría los nombres de los archivos abiertos y los volvería a abrir cuando se iniciara de nuevo. Otra gran ventaja del nuevo protocolo es el soporte para poder cerrar la aplicación de manera normal y segura, incluso si el usuario decide no restaurar la sesión la próxima vez. El protocolo proporciona a las aplicaciones la posibilidad de interactuar con el usuario en el caso de que estén en peligro de perder algunos datos, y también de cancelar el proceso de cerrado si es necesario.&lt;br /&gt;
&lt;br /&gt;
==Lectura avanzada==&lt;br /&gt;
&lt;br /&gt;
En [http://doc.trolltech.com/4.4/session.html doc.trolltech.com] está disponible una introducción preliminar de la funcionalidad de administración de sesiones y de la API de Qt.&lt;br /&gt;
&lt;br /&gt;
En KDE, las clases [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication] y [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] abstraen al programador de todos los detalles de bajo nivel. Fundamentalmente, una [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication] maneja por ti la [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html#8f88369c240d6d90a04d29b2761989d9 sessionConfig()] de un objeto de configuración [http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKConfig.html KConfig], que tu aplicación puede usar para guardar los datos específicos de la sesión.&lt;br /&gt;
&lt;br /&gt;
Lee por favor la documentación respectiva de la clase, especialmente la de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] para una descripción detallada de la interfaz. Realmente sólo son necesarias unas cuantas lineas de código para tener una aplicación multi-ventana que almacene su estado entre distintas sesiones.&lt;br /&gt;
&lt;br /&gt;
== Implementar la administración de sesiones en tu aplicación==&lt;br /&gt;
&lt;br /&gt;
Aquí tienes una pequeña sinopsis sobre como llevarla a cabo. De nuevo lee la respectiva documentación de la clase para los detalles.&lt;br /&gt;
&lt;br /&gt;
Implementar la administración de sesiones en KDE es facil. Si tu ventana principal hereda de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], sólo tienes que hacer dos cosas:&lt;br /&gt;
* Reimplementar algunas funciones virtuales de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow].&lt;br /&gt;
* Añadir el soporte de administración de sesiones a tu función main().&lt;br /&gt;
Esto es todo :P.&lt;br /&gt;
&lt;br /&gt;
===Reimplementar algunas funciones virtuales de KMainWindow===&lt;br /&gt;
&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] guardará su posición, su geometría y la posición de las barras de herramientas y de menú al salir.&lt;br /&gt;
&lt;br /&gt;
* Para advertir al usuario de que la aplicación o alguna ventana tiene datos sin guardar al cerrarla o al salir (por ejemplo: mostrar un diálogo con los botones &amp;quot;Guardar cambios&amp;quot; y &amp;quot;Aplicar cambios&amp;quot;), reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()].&lt;br /&gt;
* Para guardar datos adicionales, reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()]. (Para un editor de textos, deberías guardar los archivos abiertos, por ejemplo). Date cuenta de que no está permitida ninguna interacción con el usuario!. Por ejemplo, no puedes mostrar ningún diálogo.&lt;br /&gt;
* Para leer datos adicionales en el siguiente inicio, reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 readProperties()].&lt;br /&gt;
Estas funciones son llamadas automáticamente por [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] y respectivamente por el administrador de sesiones. Ten en cuenta de que no se especifica si se invoca a [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()] antes o después de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()]! Lee por favor la documentación de dichas funciones antes de reimplementarlas.&lt;br /&gt;
&lt;br /&gt;
Para guardar las propiedades de tu aplicación (datos que solo necesitan una vez por aplicación, y no por cada ventana principal) reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#cf811d77a3acdcf2b61f8826429615a7 saveGlobalProperties()] y su homólogo [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#2d4da4f305f00e8a5c94f5b978334231 readGlobalProperties()].&lt;br /&gt;
Por norma general, no necesitas dichas funciones.&lt;br /&gt;
&lt;br /&gt;
===Añadir soporte para la administración de sesiones en tu función main()===&lt;br /&gt;
&lt;br /&gt;
Mientras que [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 KMainWindow::saveProperties()] y [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 KMainWindow::queryClose()] funcionarán tal cual, [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 KMainWindow::readProperties()] no. Tienes que añadir algo de código a tu función main() para implementar la administración de sesiones.&lt;br /&gt;
&lt;br /&gt;
Imagina que tienes una aplicación con una ventana principal MyWindows que hereda de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] (o de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKXmlGuiWindow.html KXmlGuiWindow], la cual hereda de KMainWindow). En tu función main() deberás crear/restaurar las ventanas de la aplicación con algo parecido a:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KApplication app;&lt;br /&gt;
if ( app.isSessionRestored() ) {&lt;br /&gt;
  kRestoreMainWindows&amp;lt; MyWindow &amp;gt;();&lt;br /&gt;
} else {&lt;br /&gt;
  // creamos la aplicación por defecto  de la forma habitual&lt;br /&gt;
  // por ejemplo&lt;br /&gt;
  MyWindow * window = new MyWindow();&lt;br /&gt;
  // la # se reemplazará por un numero, garantizadose&lt;br /&gt;
  // que sea único en la aplicación&lt;br /&gt;
  window-&amp;gt;setObjectName(&amp;quot;MyWindow#&amp;quot;);&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
}&lt;br /&gt;
return app.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows&amp;lt;&amp;gt;()] creará (en la &amp;quot;heap&amp;quot;) tantas instancias de tu ventana principal como hubiera en la última sesión y llamará a [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#46e01bd1aa6d488f1be2a5010030efb2 KMainWindow::restore()] con los argumentos adecuados. Date cuenta que la llamada a QWidget::show() se realiza de manera implícita.&lt;br /&gt;
&lt;br /&gt;
Sobre setObjectName(&amp;quot;MyWindow#&amp;quot;): para que el administrador de sesiones y el administrador de ventanas funcionen correctamente, todas las ventanas principales de la aplicación deben tener nombres diferentes. Si tu no lo haces, KMainWindow creará un nombre único, pero es recomendable usar explicitamente un nombre de ventana que también describa el tipo de la ventana. Si se da el caso de tener varias ventanas del mismo tipo, concatena una almohadilla ('#') al nombre y así KMainWindow la reemplazará con un número, de este modo harás los nombres únicos. Por ejemplo, en un cliente de correo que tiene una ventana principal en la que muestra los correos y las carpetas, y que además puede tener una o mas ventanas para redactar correos, el nombre para la ventana de las carpetas debería ser &amp;quot;mainwindow&amp;quot;, y el de las ventanas para redactar &amp;quot;redactor#&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
De esta forma puedes restaurar de manera sencilla las ventanas principales de tu aplicación.&lt;br /&gt;
&lt;br /&gt;
También es posible restaurar diferentes tipos de ventanas principales (cada una de ellas derivada de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], por supuesto) mediante una aplicación. Imagina que tienes tres clases de ventanas principales: childMW1, childMW2 y childMW3:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KApplication app;&lt;br /&gt;
if ( app.isSessionRestored() ) {&lt;br /&gt;
  kRestoreMainWindows&amp;lt; childMW1, childMW2, childMW3 &amp;gt;();&lt;br /&gt;
} else {&lt;br /&gt;
  // creamos la aplicación por defecto  de la forma habitual&lt;br /&gt;
  // por ejemplo&lt;br /&gt;
  childMW1* window1 = new childMW1();&lt;br /&gt;
  childMW2* window2 = new childMW2();&lt;br /&gt;
  childMW3* window3 = new childMW3();&lt;br /&gt;
  // la # se reemplazará por un numero, garantizadose&lt;br /&gt;
  // que sea único en la aplicación&lt;br /&gt;
  window1-&amp;gt;setObjectName(&amp;quot;type1mainWindow#&amp;quot;);&lt;br /&gt;
  window2-&amp;gt;setObjectName(&amp;quot;type2mainWindow#&amp;quot;);&lt;br /&gt;
  window3-&amp;gt;setObjectName(&amp;quot;type3mainWindow#&amp;quot;);&lt;br /&gt;
  window1-&amp;gt;show();&lt;br /&gt;
  window2-&amp;gt;show();&lt;br /&gt;
  window3-&amp;gt;show();&lt;br /&gt;
}&lt;br /&gt;
return app.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Actualmente, la plantilla [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows&amp;lt;&amp;gt;()] soporta hasta tres argumentos.&lt;br /&gt;
&lt;br /&gt;
== Apéndice: Arquitectura del administrador de sesiones de KDE==&lt;br /&gt;
&lt;br /&gt;
En KDE el servidor de administración de sesiones se llama ''ksmserver'' y es parte del paquete '''kdebase'''. El servidor interactua con el administrador de ventanas de KDE, '''kwin''', para guardar y restaurar la geometría de las ventanas. Para que el administrador de sesiones realice su trabajo, '''ksmserver''' debe iniciarse como el ultimo proceso del procedimiento de inicio de X. Esto se realiza de manera automática al final de script '''startkde'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Autor inicial:'' [mailto:ettrich@kde.org Matthias Ettrich]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:FAQs]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-19T19:03:59Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading_(es)|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs_(es)|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Session_Management_(es)|Administración de sesiones]]&lt;br /&gt;
:''Haz que tu aplicación sea consciente de las sesiones X''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
== Automatización de aplicaciones y 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;
=== Plugins para 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;
== Plugins y 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;
== Búsqueda y Metadatos ==&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;
== Conciencia del Hardware (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;
== Aplicaciones con privilegios (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_(es)]] for Plasma tutorials.&lt;br /&gt;
&lt;br /&gt;
== Comunicación (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;
== Administración de información personal (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;
== Impresión ==&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;
== Obtener nuevas características (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;
== Otros lenguajes de programación ==&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;
;[[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;
=== 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;
== Programación gráfica ==&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;
== Uso de las bibliotecas de KDE para juegos ==&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;
== Uso de las bibliotecas PIM de KDE ==&lt;br /&gt;
;[[Development/Tutorials/PIM/ical| iCalendar functionality]]&lt;br /&gt;
:''Using kcal to manage iCalendar files''&lt;br /&gt;
&lt;br /&gt;
== Otros tutoriales ==&lt;br /&gt;
&lt;br /&gt;
=== Dibujado de 2D (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;
=== Comprobación de ortografía y gramática (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;
=== Cache Pixmap (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;
=== Uso de  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;
=== Uso de SCM local para el desarrollo en KDE ===&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;
=== Implementación de un sensor para KSysGuard ===&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;
== Material para KDE2 y KDE3 ==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Session_Management_(es)</id>
		<title>Development/Tutorials/Session Management (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Session_Management_(es)"/>
				<updated>2009-03-19T19:02:31Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: new page, spanish (Tutorials/Session management)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Session Management}}&lt;br /&gt;
&lt;br /&gt;
==About KDE and X11 session management==&lt;br /&gt;
&lt;br /&gt;
Since KDE 1.0, the legacy X11R4 and ICCCM session management protocols&lt;br /&gt;
are supported. Legacy applications that define the &amp;lt;tt&amp;gt;WM_COMMAND&amp;lt;/tt&amp;gt;&lt;br /&gt;
property or support the &amp;lt;tt&amp;gt;WM_SAVE_YOURSELF&amp;lt;/tt&amp;gt; protocol will be restarted&lt;br /&gt;
with the specified command.  The window geometries will be restored on a best&lt;br /&gt;
effort basis.&lt;br /&gt;
&lt;br /&gt;
Since KDE 2.0, also the standard X11R6 session management protocol XSMP&lt;br /&gt;
is supported and used. The official documentation of the&lt;br /&gt;
standard can be download from the X Consortium's FTP server &lt;br /&gt;
[http://stuff.mit.edu/afs/sipb/contrib/doc/X11/hardcopy/SM/xsmp.PS.gz ftp.x.org]. Unlike the legacy protocols, the new X11R6&lt;br /&gt;
session management gives a chance to save application&lt;br /&gt;
dependent settings when you log out.  A text&lt;br /&gt;
editor, for instance, would save the names of the loaded files and would&lt;br /&gt;
reload them when you log in again.  Another major advantage of the new&lt;br /&gt;
protocol is the support for a clean and safe logout procedure even if the&lt;br /&gt;
users decides not to restore the session next time. The protocol gives&lt;br /&gt;
applications the possibility to interact with the user in case they are in&lt;br /&gt;
danger to lose some data, and to cancel the shutdown process if necessary.&lt;br /&gt;
&lt;br /&gt;
==Further Reading==&lt;br /&gt;
&lt;br /&gt;
An introductive overview of session management functionality and&lt;br /&gt;
the Qt API for it is available from [http://doc.trolltech.com/4.4/session.html doc.trolltech.com].&lt;br /&gt;
&lt;br /&gt;
In KDE, the classes [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication]&lt;br /&gt;
and [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow]&lt;br /&gt;
hide all the ugly details from the programmer. Basically, a&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication] manages a&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKConfig.html KConfig] configuration object&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html#8f88369c240d6d90a04d29b2761989d9 sessionConfig()]&lt;br /&gt;
for you, that your application can utilize to store session specific data.&lt;br /&gt;
&lt;br /&gt;
Please read the respective class documentation, especially the one of&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], for a detailed interface description. With the advanced&lt;br /&gt;
functionality in [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], it's really just a matter of a few lines to get even a multi-window application to retains its state between&lt;br /&gt;
different user sessions.&lt;br /&gt;
&lt;br /&gt;
==Implementing session management in your application==&lt;br /&gt;
&lt;br /&gt;
Here's just a brief overview how things are done. Again, see the&lt;br /&gt;
respective class documentation for details.&lt;br /&gt;
&lt;br /&gt;
Implementing session management in KDE is easy. If your main window inherits from [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], you have just 2 things to do:&lt;br /&gt;
* Reimplement some virtual functions of [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow].&lt;br /&gt;
* Add session management support to your main() function.&lt;br /&gt;
That's all.&lt;br /&gt;
&lt;br /&gt;
===Reimplement some virtual functions of KMainWindow===&lt;br /&gt;
&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] will save its position, geometry and positions of toolbars and menubar on logout.&lt;br /&gt;
* To warn the user that the application or some windows have unsaved data on close or logout (for example: show a dialog with the buttons &amp;quot;Save changes&amp;quot; and &amp;quot;Discard changes&amp;quot;), reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()].&lt;br /&gt;
* To save additional data, reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()]. (For a text editor, that would be the loaded files, for example.) Note that no user interaction is allowed in this function! For example, you may not display any dialog!&lt;br /&gt;
* To read the additional data again on next login, reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 readProperties()].&lt;br /&gt;
These functions are called automatically by [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] respectively by the session manager. Note that it is not determined if [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()] is called before or after [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()]! Please read documentation of the respective functions before reimplementing them.&lt;br /&gt;
&lt;br /&gt;
To save your application-wide properties (data that is only needed once per application, and not for each main window) reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#cf811d77a3acdcf2b61f8826429615a7 saveGlobalProperties()] and it's counterpart [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#2d4da4f305f00e8a5c94f5b978334231 readGlobalProperties].  Normally, you don't need these functions.&lt;br /&gt;
&lt;br /&gt;
===Add session management support to your main() function===&lt;br /&gt;
&lt;br /&gt;
While [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 KMainWindow::saveProperties()] and [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 KMainWindow::queryClose()] will work out of the box, [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 KMainWindow::readProperties()] will not. You have to add some code to your main() function to implement session restoring.&lt;br /&gt;
&lt;br /&gt;
Imagine you have an&lt;br /&gt;
application with a main window MyWindow inherited from&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] (or from&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKXmlGuiWindow.html KXmlGuiWindow], which inherits from&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow]). In your main() function, you would then create/restore the&lt;br /&gt;
application windows with something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KApplication app;&lt;br /&gt;
if ( app.isSessionRestored() ) {&lt;br /&gt;
  kRestoreMainWindows&amp;lt; MyWindow &amp;gt;();&lt;br /&gt;
} else {&lt;br /&gt;
  // create default application as usual&lt;br /&gt;
  // for example:&lt;br /&gt;
  MyWindow * window = new MyWindow();&lt;br /&gt;
  // # will be replaced with numbers that are guaranteed&lt;br /&gt;
  // to be unique in the application:&lt;br /&gt;
  window-&amp;gt;setObjectName(&amp;quot;MyWindow#&amp;quot;);&lt;br /&gt;
  window-&amp;gt;show();&lt;br /&gt;
}&lt;br /&gt;
return app.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows&amp;lt;&amp;gt;()] will create (on the heap) as many instances of your main windows as have existed in the last session and call [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#46e01bd1aa6d488f1be2a5010030efb2 KMainWindow::restore()] with the correct arguments. Note that also QWidget::show() is called implicitly.&lt;br /&gt;
&lt;br /&gt;
About setObjectName(&amp;quot;MyWindow#&amp;quot;): For session management and window management to work properly, all main windows in the application should have a different name. If you don't do it, KMainWindow will create a unique name, but it's recommended to explicitly pass a window name that will also describe the type of the window. If there can be several windows of the same type, append '#' (hash) to the name, and KMainWindow will replace it with numbers to make the names unique. For example, for a mail client which has one main window showing the mails and folders, and which can also have one or more windows for composing mails, the name for the folders window should be e.g. &amp;quot;mainwindow&amp;quot; and for the composer windows &amp;quot;composer#&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
With this you can easily restore all toplevel windows of your application.&lt;br /&gt;
&lt;br /&gt;
It is also possible to restore different types of toplevel windows (each&lt;br /&gt;
derived from [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], of course) within one application. Imagine you have three classes of main windows: childMW1, childMW2 and childMW3:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
KApplication app;&lt;br /&gt;
if ( app.isSessionRestored() ) {&lt;br /&gt;
  kRestoreMainWindows&amp;lt; childMW1, childMW2, childMW3 &amp;gt;();&lt;br /&gt;
} else {&lt;br /&gt;
  // create default application as usual&lt;br /&gt;
  // for example:&lt;br /&gt;
  childMW1* window1 = new childMW1();&lt;br /&gt;
  childMW2* window2 = new childMW2();&lt;br /&gt;
  childMW3* window3 = new childMW3();&lt;br /&gt;
  // # will be replaced with numbers that are guaranteed&lt;br /&gt;
  // to be unique in the application:&lt;br /&gt;
  window1-&amp;gt;setObjectName(&amp;quot;type1mainWindow#&amp;quot;);&lt;br /&gt;
  window2-&amp;gt;setObjectName(&amp;quot;type2mainWindow#&amp;quot;);&lt;br /&gt;
  window3-&amp;gt;setObjectName(&amp;quot;type3mainWindow#&amp;quot;);&lt;br /&gt;
  window1-&amp;gt;show();&lt;br /&gt;
  window2-&amp;gt;show();&lt;br /&gt;
  window3-&amp;gt;show();&lt;br /&gt;
}&lt;br /&gt;
return app.exec();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Currently, the [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows&amp;lt;&amp;gt;()] template functions are provided for up to three template arguments.&lt;br /&gt;
&lt;br /&gt;
==Appendix: Architecture of the KDE session manager==&lt;br /&gt;
&lt;br /&gt;
The session management server in KDE is called '''ksmserver''' and it is&lt;br /&gt;
part of the '''kdebase''' package.  The server interacts with the KDE window&lt;br /&gt;
manager '''kwin''' to save and restore the window geometries and to perform&lt;br /&gt;
legacy session management.  To make session management work, '''ksmserver'''&lt;br /&gt;
has to be started as last process of the X login procedure. This happens&lt;br /&gt;
automatically at the end of the '''startkde''' script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Initial Author:'' [mailto:ettrich@kde.org Matthias Ettrich]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:FAQs]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-19T19:01:16Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Session_Management|Administración de sesiones]]&lt;br /&gt;
:''Haz que tu aplicación sea consciente de las sesiones X''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
== Automatización de aplicaciones y 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;
=== Plugins para 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;
== Plugins y 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;
== Búsqueda y Metadatos ==&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;
== Conciencia del Hardware (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;
== Aplicaciones con privilegios (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_(es)]] for Plasma tutorials.&lt;br /&gt;
&lt;br /&gt;
== Comunicación (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;
== Administración de información personal (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;
== Impresión ==&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;
== Obtener nuevas características (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;
== Otros lenguajes de programación ==&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;
;[[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;
=== 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;
== Programación gráfica ==&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;
== Uso de las bibliotecas de KDE para juegos ==&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;
== Uso de las bibliotecas PIM de KDE ==&lt;br /&gt;
;[[Development/Tutorials/PIM/ical| iCalendar functionality]]&lt;br /&gt;
:''Using kcal to manage iCalendar files''&lt;br /&gt;
&lt;br /&gt;
== Otros tutoriales ==&lt;br /&gt;
&lt;br /&gt;
=== Dibujado de 2D (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;
=== Comprobación de ortografía y gramática (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;
=== Cache Pixmap (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;
=== Uso de  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;
=== Uso de SCM local para el desarrollo en KDE ===&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;
=== Implementación de un sensor para KSysGuard ===&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;
== Material para KDE2 y KDE3 ==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-18T20:54:28Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Guidelines_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es) (18/03/09)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-18T20:53:03Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es) (18/03/09)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-18T20:52:04Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-18T20:50:49Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-18T20:45:02Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación (y posible actualización) con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/CMake_(es)</id>
		<title>Development/CMake (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/CMake_(es)"/>
				<updated>2009-03-18T20:44:21Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/CMake}}&lt;br /&gt;
&lt;br /&gt;
Aquí está el directorio central de todas las paginas de TechBase relacionadas con [http://www.cmake.org CMake].&lt;br /&gt;
&lt;br /&gt;
== Documentación específica de CMake para KDE4 ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Tutorial de CMake]]&lt;br /&gt;
:''Una introducción del uso de CMake en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/CMake_FAQ|FAQ de CMake en KDE]]&lt;br /&gt;
:''Algunas preguntas frecuentes.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/CMake/Build Types|Tipos de construcción de CMake en KDE]]&lt;br /&gt;
:''Describe los tipos de contrucción (debugfull, release, etc)''&lt;br /&gt;
&lt;br /&gt;
;[[Development/CMake_KDE_4_2 |Cambios en el sistema de construcción con KDE 4.2]]&lt;br /&gt;
:''Que ha cambiado en KDE 4.2 respecto a KDE 4.0/4.1''&lt;br /&gt;
&lt;br /&gt;
;[[Policies/CMake_and_Source_Compatibility|Compatibilidad de las fuentes con CMake]]&lt;br /&gt;
:''En esta página se discute que tiene que tomarse en cuenta a la hora de establecer la compatibilidad de las fuentes con el nivel de CMake.''&lt;br /&gt;
&lt;br /&gt;
;[[Policies/CMake_Coding_Style|Estilo y directrices de los archivos CMake]]&lt;br /&gt;
:''Algunos consejos sobre como escribir scripts CMake en KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/Automoc4|Automoc4]]&lt;br /&gt;
:''Documentación de Automoc4.''&lt;br /&gt;
&lt;br /&gt;
;[http://api.kde.org/cmake/modules.html Módulos de la API de CMake en KDE]&lt;br /&gt;
:''Documentación de todos los módulos de CMake en kdelibs (generada desde el svn de kdelibs).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/CMake/Addons for KDE|Macros y variables de CMake en KDE4]]&lt;br /&gt;
:''Documentación de los macros y variables para construir software en KDE4, proporcionada por FindKDE4Internal.cmake (escrita manualmente).''&lt;br /&gt;
&lt;br /&gt;
==Mas lugares en donde obtener información sobre CMake==&lt;br /&gt;
&lt;br /&gt;
Algunos buenos sitios donde aprender sobre CMake en general:&lt;br /&gt;
* [http://www.cmake.org/HTML/Documentation.html Manual de CMake]&lt;br /&gt;
* [http://www.cmake.org/Wiki/CMake Wiki de CMake]&lt;br /&gt;
* [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks Comprobación del sistema para CMake]&lt;br /&gt;
* [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware Encontrar paquetes opcionales]&lt;br /&gt;
* [http://www.cmake.org/Wiki/HowToBuildKDE4Software Tutorial de KDE4 en el Wiki de CMake]&lt;br /&gt;
* [http://www.cmake.org/Wiki/CMake_FAQ FAQ de CMake]&lt;br /&gt;
* [http://www.elpauer.org/stuff/learning_cmake.pdf Diapositivas del seminario &amp;quot;Learning CMake&amp;quot;]&lt;br /&gt;
* [http://mail.kde.org/pipermail/kde-buildsystem/ Archivo de la lista de correo kde-buildsystem]&lt;br /&gt;
&lt;br /&gt;
Considera también unirte a la [http://www.cmake.org/mailman/listinfo/cmake lista de correo de CMake].&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-18T20:36:33Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es) (18/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Languages_(es)</id>
		<title>Development/Languages (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Languages_(es)"/>
				<updated>2009-03-18T20:36:04Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Languages}}&lt;br /&gt;
&lt;br /&gt;
KDE soporta varios lenguajes de programación para el desarrollo de KDE4.&lt;br /&gt;
&lt;br /&gt;
==Estable y maduro==&lt;br /&gt;
El soporte para estos lenguajes está maduro, completamente mantenido y listo para el desarrollo de aplicaciones:&lt;br /&gt;
&lt;br /&gt;
* [[Development/Languages/C++ |C++]]&lt;br /&gt;
* [[Development/Languages/Python|Python]]&lt;br /&gt;
* [[Development/Languages/Ruby|Ruby]]&lt;br /&gt;
&lt;br /&gt;
==En desarrollo==&lt;br /&gt;
&lt;br /&gt;
El soporte para estos lenguajes aun está en desarrollo:&lt;br /&gt;
&lt;br /&gt;
* [[Development/Languages/QtSharp|C#]]&lt;br /&gt;
* [[Development/Languages/PHP-Qt|PHP]]&lt;br /&gt;
* [[Development/Languages/Lqt|Lua]]&lt;br /&gt;
* [[Development/Languages/KBasic|KBasic]] - lenguaje BASIC similar a VB&lt;br /&gt;
&lt;br /&gt;
==Tecnologías para bindings y embebidos==&lt;br /&gt;
* [[Development/Languages/Smoke|Smoke]] - Proporciona una infraestructura usada para crear bindings para varios lenguajes como Ruby, C# y PHP.&lt;br /&gt;
* [[Development/Languages/Kross|Kross]] - Proporciona scripting embebido para aplicaciones en C++. Están soportados múltiples lenguajes como Python, Ruby, JavaScript, QtScript, Falcon y Java.&lt;br /&gt;
* [[Development/Languages/QtScript|QtScript]] - El generador de bindings QtScript.&lt;br /&gt;
* [[Development/Languages/SIP|SIP]] - Usado para generar bindings para Python.&lt;br /&gt;
&lt;br /&gt;
==Soporte de Qt3 / KDE3==&lt;br /&gt;
* [[Development/Languages/Perl|Perl]]&lt;br /&gt;
* [[Development/Languages/Java|Java]]&lt;br /&gt;
* [[Development/Languages/JavaScript|JavaScript (ECMAScript)]]&lt;br /&gt;
* [[Development/Languages/Tools|Herramientas de interacción con KDE]] (Shell)&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Languages_(es)</id>
		<title>Development/Languages (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Languages_(es)"/>
				<updated>2009-03-18T20:34:47Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Languages}}&lt;br /&gt;
&lt;br /&gt;
KDE soporta varios lenguajes de programación para el desarrollo de KDE4.&lt;br /&gt;
&lt;br /&gt;
==Estable y maduro==&lt;br /&gt;
El soporte para estos lenguajes está maduro, completamente mantenido y listo para el desarrollo de aplicaciones:&lt;br /&gt;
&lt;br /&gt;
* [[Development/Languages/C++ |C++]]&lt;br /&gt;
* [[Development/Languages/Python|Python]]&lt;br /&gt;
* [[Development/Languages/Ruby|Ruby]]&lt;br /&gt;
&lt;br /&gt;
==En desarrollo==&lt;br /&gt;
&lt;br /&gt;
El soporte para estos lenguajes aun está en desarrollo:&lt;br /&gt;
&lt;br /&gt;
* [[Development/Languages/QtSharp|C#]]&lt;br /&gt;
* [[Development/Languages/PHP-Qt|PHP]]&lt;br /&gt;
* [[Development/Languages/Lqt|Lua]]&lt;br /&gt;
* [[Development/Languages/KBasic|KBasic]] - lenguaje BASIC similar a VB&lt;br /&gt;
&lt;br /&gt;
==Tecnologías para bindings y embebidos==&lt;br /&gt;
* [[Development/Languages/Smoke|Smoke]] - Proporciona una infraestructura usada para crear bindings para varios lenguajes como Ruby, C# y PHP.&lt;br /&gt;
* [[Development/Languages/Kross|Kross]] - Proporciona scripting embebido para aplicaciones en C++. Están soportados múltiples lenguajes como Python, Ruby, JavaScript, QtScript, Falcon y Java.&lt;br /&gt;
* [[Development/Languages/QtScript|QtScript]] - El generador de bindings QtScript.&lt;br /&gt;
&lt;br /&gt;
==Soporte de Qt3 / KDE3==&lt;br /&gt;
* [[Development/Languages/Perl|Perl]]&lt;br /&gt;
* [[Development/Languages/Java|Java]]&lt;br /&gt;
* [[Development/Languages/JavaScript|JavaScript (ECMAScript)]]&lt;br /&gt;
* [[Development/Languages/Tools|Herramientas de interacción con KDE]] (Shell)&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-18T20:29:27Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/KDE_System_Administration_(es) (18/03/09)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/KDE_System_Administration_(es)</id>
		<title>KDE System Administration (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/KDE_System_Administration_(es)"/>
				<updated>2009-03-18T20:28:20Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|KDE System Administration}}&lt;br /&gt;
&lt;br /&gt;
Esta sección facilita a los administradores de sistemas, que están extendiendo sus sistemas a los nuevos desarrollos de KDE en sus respectivas organizaciones, con la información que ellos necesitan para hacerlo de forma efectiva.&lt;br /&gt;
&lt;br /&gt;
== Sistema de ficheros ==&lt;br /&gt;
;[[KDE System Administration/Configuration Files|Sintaxis de los archivos de configuración]]&lt;br /&gt;
:Los archivos de configuración de KDE están basados en texto plano. Contienen grupos de pares de clave-valor. Esta sección explica su sintaxis. Esta explicación cubre:&lt;br /&gt;
&lt;br /&gt;
* Locaclización.&lt;br /&gt;
* Variables de shell.&lt;br /&gt;
* Bloqueo parcial o total de archivos de configuración.&lt;br /&gt;
* Utilidades de editor,&lt;br /&gt;
* Otras posbilidades avanzadas.&lt;br /&gt;
&amp;lt;!--It covers localisation, use of shell variables, locking down configuration files (in whole or in part), and other advanced features. Read also about some useful editor utilities.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/KDE Filesystem Hierarchy|Jerarquía de KDE]]&lt;br /&gt;
:Este artículo describe cómo KDE usa el sistema de archivos, donde busca los archivos, y donde los almacena. También se explica como cambiar estas localizaciones. Se presenta también una breve descripción de las configuraciones por defecto que implementan la mayoría de los desarrolladores de sistemas operativos.&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/XDG Filesystem Hierarchy|Jerarquía de XDG]]&lt;br /&gt;
:Además de la [[KDE System Administration/KDE Filesystem Hierarchy|jerarquía del sistema de ficheros de KDE]], KDE también usa varios directorios, definidos en la especificación XDG [http://freedesktop.org freedesktop.org]. Este artículo documenta las directorios usados y sus propósitos.&lt;br /&gt;
&lt;br /&gt;
== Sesiones de escritorio ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/Environment Variables|Variables de entorno]]&lt;br /&gt;
:Una variedad de variables de entorno son documentadas en este artículo, y son capaces de influir en los aspectos de KDE, y en la ejecución de las aplicaciones de KDE.&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/Startup|Secuencia de inicio de escritorio]]&lt;br /&gt;
:Durante el arranque KDE inicia los componentes visibles del escritorio, así como  varios servicios que corren en segundo plano. Este artículo describe la secuencia de arranque, presentando un esbozo de algunos de los servicios iniciados, y explica como hacer cambios.&lt;br /&gt;
&lt;br /&gt;
;[http://docs.kde.org/stable/en/kdebase-workspace/kdm/ Administrador de inicio]&lt;br /&gt;
:El Administrador de inicio de KDE (KDE) proporciona los servicios normalmente asociados a la administración de inicio. Esta sección cubre los aspectos básicos sobre cómo configurar KDE, además de algunos aspectos avanzados como inicio remoto, inicio automático, etc.&lt;br /&gt;
&lt;br /&gt;
== Perfiles de usuario &amp;amp; grupo ==&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/Kiosk/Introduction|Introducción a Kiosk]]&lt;br /&gt;
:El framework Kiosk proporciona un conjunto de características que hacen posible, de una manera fácil y potente, restringir las capacidades de un escritorio KDE basándose en las credenciales de usuario y de grupo. Además de una introducción general, este artículo cubre el bloqueo de la configuración, la acción y la restricción de recursos, la asignación de perfiles a los usuarios y grupos, etc.&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/Kiosk/Keys|Opciones de Kiosk]]&lt;br /&gt;
:Este documento detalla las opciones de Kiosk tanto de forma global y como en aplicaciones especificas, para las acciones, recursos y restricciones de URL, sirviendo como guía de referencia para establecer un perfil de Kiosk.&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/Kiosk/Resources|Recursos adicionales]]&lt;br /&gt;
:Enlaces a herramientas, listas de correo y documentación adicional relevante de los perfiles de usuario y grupos en KDE.&lt;br /&gt;
&lt;br /&gt;
== Herramientas ==&lt;br /&gt;
&lt;br /&gt;
;[http://extragear.kde.org/apps/kiosktool/ KioskTool]&lt;br /&gt;
:Una aplicación gráfica que ayuda a gestionar mediante Kiosk los perfiles de los usuarios y grupos.&lt;br /&gt;
&lt;br /&gt;
;[http://docs.kde.org/development/en/kdenetwork/krfb/ Compartición de escritorio]&lt;br /&gt;
:La compartición de escritorio de KDE te permite compartir tu escritorio de forma remota con otros usuarios. También puede utilizarse para que personal de soporte dé asistencia directa a los usuarios.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Shell_Scripting_with_KDE_Dialogs|Usar cuadros de dialogos de KDE en shell scripts]]&lt;br /&gt;
:Puedes usar KDialog en shell scripts para mostrar diversos cuadros de dialogo de KDE. Esto te proporciona una integración perfecta con tu propia GUI.&lt;br /&gt;
&lt;br /&gt;
;[[KDE System Administration/Controlling_Access_To_Get_New_Stuff|Controlar el acceso al contenido proporcionado por &amp;quot;Get New Stuff&amp;quot;]]&lt;br /&gt;
:Proporciona información sobre como controlar el contenido descargable de Internet mediante la característica &amp;quot;Get New Stuff&amp;quot; de KDE.&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-17T17:38:22Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (17/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-17T17:36:13Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
== Automatización de aplicaciones y 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;
=== Plugins para 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;
== Plugins y 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;
== Búsqueda y Metadatos ==&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;
== Conciencia del Hardware (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;
== Aplicaciones con privilegios (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_(es)]] for Plasma tutorials.&lt;br /&gt;
&lt;br /&gt;
== Comunicación (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;
== Administración de información personal (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;
== Impresión ==&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;
== Obtener nuevas características (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;
== Otros lenguajes de programación ==&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;
;[[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;
=== 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;
== Programación gráfica ==&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;
== Uso de las bibliotecas de KDE para juegos ==&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;
== Uso de las bibliotecas PIM de KDE ==&lt;br /&gt;
;[[Development/Tutorials/PIM/ical| iCalendar functionality]]&lt;br /&gt;
:''Using kcal to manage iCalendar files''&lt;br /&gt;
&lt;br /&gt;
== Otros tutoriales ==&lt;br /&gt;
&lt;br /&gt;
=== Dibujado de 2D (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;
=== Comprobación de ortografía y gramática (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;
=== Cache Pixmap (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;
=== Uso de  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;
=== Uso de SCM local para el desarrollo en KDE ===&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;
=== Implementación de un sensor para KSysGuard ===&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;
== Material para KDE2 y KDE3 ==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-17T17:33:16Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish (update)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
== Automacización de aplicaciones y 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;
=== Plugins para 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;
== Plugins y 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;
== Búsqueda y Metadatos ==&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;
== Conciencia del Hardware (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;
== Aplicaciones con privilegios (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_(es)]] for Plasma tutorials.&lt;br /&gt;
&lt;br /&gt;
== Comunicación (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;
== Administración de información personal ==&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;
== Impresión ==&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;
== Obtener nuevas características (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;
== Otros lenguajes de programación ==&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;
;[[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;
=== 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;
== Programación gráfica ==&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;
== Uso de las bibliotecas de KDE para juegos ==&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;
== Uso de las bibliotecas PIM de KDE ==&lt;br /&gt;
;[[Development/Tutorials/PIM/ical| iCalendar functionality]]&lt;br /&gt;
:''Using kcal to manage iCalendar files''&lt;br /&gt;
&lt;br /&gt;
== Otros tutoriales ==&lt;br /&gt;
&lt;br /&gt;
=== Dibujado de 2D (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;
=== Comprobación de ortografía y gramática (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;
=== Cache Pixmap (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;
=== Uso de  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;
=== Uso de SCM local para el desarrollo en KDE ===&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;
=== Implementación de un sensor para KSysGuard y como añadirlo ===&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;
== Material para KDE2 y KDE3 ==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-09T23:13:56Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es) (10/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es) (10/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/03/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2009-03-09T23:12:25Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]], Conocimiento básico de XML|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading_(es)|Tutorial 4 - Guardar y Abrir]]| &lt;br /&gt;
&lt;br /&gt;
reading=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial introduce el concepto de las acciones. Las acciones son una forma unificada de proporcionar al usuario la forma de interactuar con tu programa.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si queremos permitir que el usuario del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]] pueda borrar la caja de texto pulsando un botón de la barra de herramientas, desde una entrada del menú File o a través de un atajo de teclado, podremos realizarlo mediante un {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3_(es).png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
Un {{class|KAction}} es un objeto que contiene toda la información sobre el icono y el atajo de teclado asociado a una determinada acción. La acción se conecta a un [http://doc.trolltech.com/latest/signalsandslots.html slot], que lleva a cabo el trabajo de la acción.&lt;br /&gt;
&lt;br /&gt;
== El código ==&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;Area de texto usando KAction.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2008 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;
Pocas cosas han cambiado en &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, solo se ha actualizado la declaración de KAboutData para indicar que ahora estamos en el 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;
Sólo se ha añadido la función &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt;, que realizará el trabajo de configurar los 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;Limpiar&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;limpiar&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;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
El archivo está basado en el código de KXmlGuiWindow del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]]. La mayoría de los cambios están en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, un cambio estructural importante es que el constructor de MainWindow ahora llama a &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; en vez de a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. En &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; va el nuevo código de KAction antes de llamar a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Creando el objeto KAction===&lt;br /&gt;
KAction se construye en varios pasos. El primero es incluir la biblioteca &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; y crear el 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;
Crear un KAction nuevo llamado &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&lt;br /&gt;
Ahora que tenemos nuestro objeto KAction, podemos empezar a establecer sus propiedades. El siguiente código establece el texto que se mostrará en el menú y el de debajo del icono del &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; en la barra de herramientas:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Limpiar&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Ten en cuenta que el texto se pasa a través de la función i18n(), esto es necesario para para que la UI pueda ser traducida (puedes encontrar mas información en el [[Development/Tutorials/Localization/i18n|tutorial de i18n]]).&lt;br /&gt;
&lt;br /&gt;
====Icono====&lt;br /&gt;
Si la acción va a mostrarse en el la barra de herramientas, estaría bien que tuviera un icono que la representara. El siguiente código establece como icono el icono estándar de KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; mediante el uso de la función &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt;:&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;
====Atajo de teclado====&lt;br /&gt;
Establecer un atajo de teclado para lanzar nuestra acción es igual de 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;
Asocia Ctrl+W a la acción.&lt;br /&gt;
&lt;br /&gt;
===Añadir a la colección===&lt;br /&gt;
Para que la acción sea accesible por el framework XMLGUI (explicado en profundidad mas adelante) debe añadirse a la ''colección de acciones'' de la aplicación. La colección de acciones es accesible mediante la función &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;limpiar&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Con esta llamada, la KAction &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; se añade a la colección y toma el nombre de ''limpiar''. Este nombre (''limpiar'') lo usa el framework XMLGUI para referirse a la acción.&lt;br /&gt;
&lt;br /&gt;
====Conectando la acción====&lt;br /&gt;
Ahora que hemos establecido la acción, es necesario conectarla a algo útil. En este caso (porque queremos limpiar el área de texto), conectamos nuestra acción con la acción &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; perteneciente a KTextEdit (que como era de esperar, limpia 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;
Es lo mismo que se llevaría a cabo en Qt con una {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
Para las acciones que normalmente aparecen en casi todas las aplicaciones KDE, como 'quit', 'save', y 'load', existen unas acciones ya creadas, accesibles a través de [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].&lt;br /&gt;
&lt;br /&gt;
Son muy sencillas de usar. Una vez que has incluido las bibliotecas (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simplemente añadelas con la función que quieras que realicen. Por ejemplo:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
Crea una KAction con el icono correcto, el texto y el atajo de teclado, e incluso la añade al menú File.&lt;br /&gt;
&lt;br /&gt;
==Añadir la acción a los menús y a las barras de herramientas==&lt;br /&gt;
Por el momento, hemos creado la nueva acción &amp;quot;Limpiar&amp;quot; pero no se ha asociado a ningún menú o barra de herramientas. Esto lo podemos hacer con una tecnología de KDE llamada XMLGUI, que hace cosas majas como barras de herramientas móviles.&lt;br /&gt;
&lt;br /&gt;
{{note|En una versión posterior de KDE4, XMLGUI puede ser reemplazada por un nuevo framework llamado liveui. Por ahora, XMLGUI es la única manera correcta de configurar la UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
La función &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; de la clase {{class|KXmlGuiWindow}} depende del sistema XMLGUI para construir la GUI, el cual la realiza analizando el archivo de descripción XML de la interfaz.&lt;br /&gt;
&lt;br /&gt;
La regla para establecer el nombre del archivo XML es &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, donde &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; es el nombre que estableces en {{class|KAboutData}} (en este caso, ''tutorial 3''). Por lo que en nuestro ejemplo, llamamos al archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, y está localizado en el directorio del código. Cmake maneja donde será puesto el archivo en última instancia. &lt;br /&gt;
&lt;br /&gt;
==Archivo ''appname''ui.rc==&lt;br /&gt;
Como la descripción de la UI está definida en el archivo XML, el layout debe seguir unas reglas estrictas. Este tutorial no profundizará en exceso en este aspecto, pero para mas información puedes echar un vistazo a la [[Development/Architecture/KDE4/XMLGUI_Technology|página de XMLGUI]] (aquí tienes un tutorial antiguo: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html])&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;gui name=&amp;quot;tutorial3&amp;quot;&lt;br /&gt;
     version=&amp;quot;1&amp;quot;&lt;br /&gt;
     xmlns=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&amp;quot;&lt;br /&gt;
     xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
     xsi:schemaLocation=&amp;quot;http://www.kde.org/standards/kxmlgui/1.0&lt;br /&gt;
                         http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd&amp;quot; &amp;gt;&lt;br /&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;limpiar&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Menu&amp;gt;&lt;br /&gt;
  &amp;lt;/MenuBar&amp;gt;&lt;br /&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;limpiar&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/ToolBar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gui&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La etiqueta &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; permite describir la barra de herramientas, que normalmente es la barra con los iconos de la parte superior de la ventana. Se le da el nombre único de ''mainToolBar'', y usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt;, es visible a los usuarios con el nombre ''Main Toolbar''. La acción limpiae se añade a la barra de herramientas usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt;,  el nombre del parámetro en esta etiqueta es la cadena que pasamos a KActionCollection con &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de tener la acción en la barra de herramientas, también se puede añadir a la barra de menú. Aquí la acción se ha añadido al menú ''File'' de &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; de la misma manera que la añadimos a la barra de herramientas.&lt;br /&gt;
&lt;br /&gt;
Cambia el atributo 'version' de la etiqueta &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; si cambiaste el archivo .rc desde la última instalación, para forzar una actualización de la cache del sistema. Asegurate de que sea un entero, si usas un valor decimal no funcionará, pero no notificará que no lo hizo.&lt;br /&gt;
&lt;br /&gt;
Algunas notas sobre la interacción entre el código y el archivo .rc: Los menús aparecen automáticamente y deberían tener una etiqueta hija &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; a menos que se refieran a los menús estándar. Las acciones deberán crearse manualmente y se insertarán mediante actionCollection() usando el nombre del archivo .rc. Las acciones pueden ocultarse o desactivarse, mientras que los menús no.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Por último, el &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; hay que ubicarlo en algún lugar donde KDE pueda encontrarlo (no lo puedes dejar en el directorio de las fuentes!). '''Esto significa que el proyecto tiene que ser instalado en algún sitio'''.&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;
Este archivo es casi idéntico al del tutorial2, peor con dos lineas extra al final que describen donde se instalará los archivos. En primer lugar, el objetivo &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; se instala en &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt;, entonces el archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; que describe el layout de la interfaz de usuario se instala en el directorio de datos de las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
===Make, instalar y ejecutar===&lt;br /&gt;
Si no tienes acceso de escritura a tu directorio de instalación de KDE4, puedes instalarlo en una carpeta de tu directorio personal.&lt;br /&gt;
&lt;br /&gt;
Para decirle a CMake donde instalar el programa, establece la variable &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt;. Probablemente quieras instalarlo en algún sitio local para testearlo (probablemente sea un poco tonto hacer el esfuerzo de instalar estos tutoriales en el directorio de KDE), por lo que podría ser el siguiente caso:&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;
Creará una estructura de directorios como la de KDE en tu directorio de usuario e instalara el ejecutable en {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Saving_and_loading_(es)|Tutorial 4 - Guardar y Abrir]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)</id>
		<title>Development/Architecture/KDE4/Providing Online Help (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)"/>
				<updated>2009-03-09T23:06:01Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Architecture/KDE4/Providing Online Help}}&lt;br /&gt;
&lt;br /&gt;
'''Arquitectura de KDE - Suministro de ayuda online'''&lt;br /&gt;
&lt;br /&gt;
La construcción de un programa fácil e intuitivo de usar implica un amplio rango de &lt;br /&gt;
facilidades que por lo general se llama ayuda online. La ayuda online persigue &lt;br /&gt;
varios objetivos parcialmente contradictorios: por un lado, debería dar respuesta a la pregunta del usuario &amp;quot;¿Como puedo realizar una cierta tarea?&amp;quot;, pero por el otro lado debería ayudar al usuario que explora la aplicación y se encuentra con características que aun desconoce. Es importante reconocer que esta situación sólo puede ser tratada ofreciendo varios niveles de ayuda: &lt;br /&gt;
&lt;br /&gt;
*Los tooltips son las pequeñas etiquetas que aparecen sobre los elementos de la interfaz de usuario cuando el ratón permanece sobre estos durante un periodo de tiempo largo. Son especialmente importantes en las &amp;quot;toolbars&amp;quot;, donde los iconos no siempre son suficientes para explicar el cometido de un botón.&lt;br /&gt;
&lt;br /&gt;
* La ayuda &amp;quot;¿Qué ese esto?&amp;quot; normalmente es una extensa explicación de un widget o de un ítem de un menú. También es mas patosa de usar: el los diálogos, puede ser invocada de dos maneras: presionando Shift+F1 o pulsando sobre el signo de interrogación en la barra de título (donde el soporte de este depende del administrador de ventanas). Entonces el puntero del ratón se convierte en una flecha con un signo de interrogación, y cuando se hace clic sobre un elemento de la interfaz de usuario aparece la ventana de ayuda. La ayuda &amp;quot;¿Que es esto?&amp;quot; de los ítems del menú se activa normalmente mediante un botón en la &amp;quot;toolbar&amp;quot;, que contiene una flecha y un signo de interrogación.&amp;lt;br/&amp;gt;El problema de este método es que el usuario no puede saber si un widget proporciona ayuda o no. Cuando el usuario activa el botón de signo de interrogación y pulsa sobre un elemento de la interfaz de usuario y no obtiene ayuda, se frustrará rápidamente.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;La ventaja de la ayuda &amp;quot;¿Qué es esto?&amp;quot; proporcionada por Qt y KDE es que puede contener [http://doc.trolltech.com/4.4/richtext.html texto enriquecido], es decir, puede contener diferentes tipos de letra, texto cursiva y negrita e incluso imágenes y tablas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Image:Kde4-queEsEsto.png‎|frame|center|Captura de pantalla ¿Qué es esto?]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
*Finalmente, cada programa debería tener un manual. Normalmente se consulta un manual en khelpcenter, activando el menú de ayuda. Esto significa cargar una nueva aplicación y desviar la atención del usuario. Por tanto, la consulta del manual solo debería ser necesaria si las otras facilidades como los tooltips o la ayuda &amp;quot;¿Qué es esto?&amp;quot; no son suficientes. Por supuesto, un manual tiene la ventaja de que no explica un aspecto aislado de la interfaz de usuario, sino que explica aspectos de la aplicación en un contexto mas amplio. Los manuales de KDE están escritos usando el lenguaje de etiquetado [http://i18n.kde.org DocBook]. &lt;br /&gt;
&lt;br /&gt;
Desde el punto de vista del programador, Qt proporciona una forma fácil de usar la API para la ayuda online. Para asignar un tooltip a un widget, simplemente usa el método setToolTip():&lt;br /&gt;
&amp;lt;code cppqt3&amp;gt;&lt;br /&gt;
widget-&amp;gt;setToolTip(i18n(&amp;quot;Este widget hace algo.&amp;quot;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si la barra de menú y la barra de herramientas han sido creadas usando [[../Action Pattern|action pattern]], la cadena usada como tooltip se hereda del primer argumento del constructor [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKAction.html KAction]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt3&amp;gt;&lt;br /&gt;
action = new KAction(i18n(&amp;quot;&amp;amp;Delete&amp;quot;), &amp;quot;editdelete&amp;quot;,&lt;br /&gt;
                     SHIFT+Key_Delete, actionCollection(), &amp;quot;del&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí también es posible asignar un texto que es mostrado en la barra de estado cuando el respectivo ítem del menú es &amp;quot;highlighted&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt3&amp;gt;&lt;br /&gt;
action-&amp;gt;setStatusText(i18n(&amp;quot;Borrar el fichero seleccionado&amp;quot;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La Api para la ayuda &amp;quot;¿Qué es esto?&amp;quot; es muy similar. En los diálogos, usa el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code cppqt3&amp;gt;&lt;br /&gt;
widget-&amp;gt;setWhatsThis(i18n(&amp;quot;&amp;lt;qt&amp;gt;This demonstrates &amp;lt;b&amp;gt;Qt&amp;lt;/b&amp;gt;'s&amp;quot;&lt;br /&gt;
                        &amp;quot; rich text engine.&amp;lt;ul&amp;gt;&amp;quot;&lt;br /&gt;
                        &amp;quot;&amp;lt;li&amp;gt;Foo&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
                        &amp;quot;&amp;lt;li&amp;gt;Bar&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
                        &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/qt&amp;gt;&amp;quot;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para los ítems del menú, usa:&lt;br /&gt;
&amp;lt;code cppqt3&amp;gt;&lt;br /&gt;
action-&amp;gt;setWhatsThis(i18n(&amp;quot;Borrar el fichero seleccionado&amp;quot;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La invocación de khelpcenter esta encapsulada en la clase [http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKToolInvocation.html KToolInvocation]. Para mostrar el manual de tu aplicación, usa simplemente el método estático:&lt;br /&gt;
&amp;lt;code cppqt3&amp;gt;&lt;br /&gt;
KToolInvocation::invokeHelp()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este código muestra la primera página con la tabla de contenidos. Cuando quieras mostrar solo una sección del manual, puedes invocar a invokeHelp() con un argumento adicional que determina la sección a saltar.&lt;br /&gt;
&lt;br /&gt;
''Initial Author:'' [mailto:bernd@kdevelop.org Bernd Gehrmann]&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;br /&gt;
[[Category:Architecture]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)</id>
		<title>Development/Architecture/KDE4/Phonon (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)"/>
				<updated>2009-03-09T23:03:32Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Architecture/KDE4/Phonon}}&lt;br /&gt;
&lt;br /&gt;
==Multimedia desatada==&lt;br /&gt;
Con Phonon, los desarrolladores de KDE serán capaces de escribir aplicaciones con funcionalidad multimedia en un tiempo menor del empleado con una de las otras infraestructuras/bibliotecas. Facilitará el uso de las capacidades multimedia en el escritorio KDE y en las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
Las aplicaciones no serán nunca mas responsables de la configuración del hardware multimedia. Los ajustes estarán disponibles un único lugar, y junto con el desarrollo de Solid, KDE tendrá un escritorio mas consistente respecto a la multimedia.&lt;br /&gt;
&lt;br /&gt;
[[Category:Architecture]]&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)</id>
		<title>Development/Architecture/KDE4/KParts (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)"/>
				<updated>2009-03-09T23:02:14Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Architecture/KDE4/KParts}}&lt;br /&gt;
'''KParts''' es el nombre de la infraestructura de componentes de KDE. Un componente individual se llama '''KPart'''. Por ejemplo, Konsole está disponible como KPart y es usado en aplicaciones como Konqueror y Kate. Un buen ejemplo de como son usados KParts es en Konqueror, que usa parte de KWord para mostrar documentos, parte de KMPlayer para reproducir multimedia, y Kontact, que intregra aplicaciones kdepim sobre un mismo techo.&lt;br /&gt;
&lt;br /&gt;
KParts también proporciona flexibilidad a la hora de seleccionar el software a usar. Por ejemplo, el kpart KHTML, el cual se usa por defecto en Konqueror para renderizar HTML, puede intercambiarse facilmente por el kpart WebKit.&lt;br /&gt;
&lt;br /&gt;
===Lectura avanzada===&lt;br /&gt;
* [http://api.kde.org/4.0-api/kdelibs-apidocs/kparts/html/index.html Api de Kparts]&lt;br /&gt;
* [http://api.kde.org/4.0-api/kdelibs-apidocs/kparts/html/classKParts_1_1Part.html Clases de KPart]&lt;br /&gt;
* [http://www-106.ibm.com/developerworks/library/l-kparts/ Coding with KParts] (from IBM)&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-09T22:55:50Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es) (09/03/09)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/02/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/02/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Architecture/KDE4_(es)</id>
		<title>Development/Architecture/KDE4 (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Architecture/KDE4_(es)"/>
				<updated>2009-03-09T22:55:34Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Architecture/KDE4}}&lt;br /&gt;
== Infraestructura de desarrollo ==&lt;br /&gt;
&lt;br /&gt;
# Escritorio&lt;br /&gt;
#* [[Development/Architecture/KDE4/Plasma_(es)|Plasma - El escritorio]]&lt;br /&gt;
#* [[Development/Architecture/KDE4/Sonnet|Sonnet - Tecnologia de corrección de gramática y vocabulario]]&lt;br /&gt;
#* [[Development/Architecture/KDE4/KParts_(es)|KParts - Arquitectura de componentes de KDE]]&lt;br /&gt;
# Hardware&lt;br /&gt;
#* [[Development/Architecture/KDE4/Solid_(es)|Solid - Capa de abstracción hardware y de red]]&lt;br /&gt;
#* [[Development/Architecture/KDE4/Phonon_(es)|Phonon - Infraestructura multimedia]]&lt;br /&gt;
# Comunicación&lt;br /&gt;
#* [[Development/Architecture/KDE4/Decibel_(es)|Decibel - Infraestructura para comunicaciones en tiempo real]]&lt;br /&gt;
#* [[Development/Architecture/KDE4/Akonadi|Akonadi - Solución de almacenamiento centralizado PIM]]&lt;br /&gt;
# Interfaz de usuario&lt;br /&gt;
#* [[Development/Architecture/KDE4/Providing_Online_Help_(es)|Suministro de ayuda en línea]]&lt;br /&gt;
# Servicios&lt;br /&gt;
#* [[Development/Architecture/KDE4/Starting_Other_Programs|Ejecutar otros programas]]&lt;br /&gt;
#* [[Development/Architecture/KDE4/Strigi|Strigi - Motor de busqueda para el escritorio]]&lt;br /&gt;
#* [[Projects/KNS2_(es)|KNewStuff2 - Compartición de datos colaborativo]] (podría moverse aqui desde proyectos)&lt;br /&gt;
&lt;br /&gt;
== Infraestructuras en otros modulos de KDE ==&lt;br /&gt;
&lt;br /&gt;
; [[Development/Architecture/KDE4/KGGZ_(es)|KGGZ]]&lt;br /&gt;
: Proporciona acceso a GGZ Gaming Zone, un centro de juego gratuito en línea&lt;br /&gt;
KOffice 2.0&lt;br /&gt;
&lt;br /&gt;
[[Category:KDE4]][[Category:Architecture]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-09T22:53:15Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/02/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/02/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development_(es)</id>
		<title>Development (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development_(es)"/>
				<updated>2009-03-09T22:52:55Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__ __NOTOC__ {{Template:I18n/Language Navigation Bar|Development}}&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=2|[[Image:Discover.png|noframe]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_launch.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Architecture_(es)|Arquitectura de KDE]]&lt;br /&gt;
:Documentos de diseño de la arquitectura de las tecnologías de KDE&lt;br /&gt;
:''Relacionado:'' [http://api.kde.org Documentación de la API]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Action_configure.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Tutorials_(es)|Tutoriales de programación]]&lt;br /&gt;
:Tutoriales paso a paso para el desarrollo de KDE.&lt;br /&gt;
:''Relacionado:'' [[Development/Tools_(es)|Herramientas de desarrollo]] | [[Development/FAQs_(es)|FAQs]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Action_rebuild.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Languages_(es)|Lenguajes de programación]]&lt;br /&gt;
:Lenguajes de programación soportados para el desarrollo de KDE.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:CMake-logo-48.png|noframe|left|48px]] ||&lt;br /&gt;
;[[Development/CMake_(es)|CMake]]&lt;br /&gt;
:Información relacionada con cmake.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_note.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Guidelines_(es)|Estándares y directrices]]&lt;br /&gt;
:Directrices de desarrollo y estándares técnicos usados por KDE.&lt;br /&gt;
:''Relacionado:'' [[Development/Further Information|Información avanzada]] (enlaces, libros, blogs, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_tool.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Software Engineering Framework|Framework para ingeniería del software]]&lt;br /&gt;
:Herramientas para ingeniería del software y procesos usados por KDE.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development_(es)</id>
		<title>Development (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development_(es)"/>
				<updated>2009-03-09T22:51:44Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__ __NOTOC__ {{Template:I18n/Language Navigation Bar|Development}}&lt;br /&gt;
{| style=&amp;quot;margin: 1em 2.5% 0 2.5%; padding: 0 5px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=2|[[Image:Discover.png|noframe]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_launch.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Architecture_(es)|Arquitectura de KDE]]&lt;br /&gt;
:Documentos de diseño de la arquitectura de las tecnologías de KDE&lt;br /&gt;
:''Relacionado:'' [http://api.kde.org Documentación de la API]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Action_configure.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Tutorials_(es)|Tutoriales de programación]]&lt;br /&gt;
:Tutoriales paso a paso para el desarrollo de KDE.&lt;br /&gt;
:''Relacionado:'' [[Development/Tools_(es)|Herramientas de desarrollo]] | [[Development/FAQs_(es)|FAQs]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:Action_rebuild.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Languages_(es)|Lenguajes de programación]]&lt;br /&gt;
:Lenguajes de programación soportados para el desarrollo de KDE.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot;|[[Image:CMake-logo-48.png|noframe|left|48px]] ||&lt;br /&gt;
;[[Development/CMake_(es)|CMake]]&lt;br /&gt;
:Información relacionada con cmake.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_note.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Guidelines_(es)|Estándares y directrices]]&lt;br /&gt;
:Directrices de desarrollo y estándares técnicos usados por KDE.&lt;br /&gt;
:''Relacionado:'' [[Development/Further Information|Información avanzada]] (enlaces, libros, blogs, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding-left: 50px;&amp;quot; |[[Image:Action_tool.svg|noframe|left|40px]] ||&lt;br /&gt;
;[[Development/Software Engineering Framework_(es)|Framework para ingeniería del software]]&lt;br /&gt;
:Herramientas para ingeniería del software y procesos usados por KDE.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:49:19Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Primeros pasos]]&lt;br /&gt;
:''Crea y ejecuta tu primer plasmoid en Python.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Usar widgets]]&lt;br /&gt;
:''Introducción sobre como usar widgets de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Usar DataEngines]]&lt;br /&gt;
:''Como usar DataEngines en un plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Escribir DataEngines]]&lt;br /&gt;
:''Como escribir tu propio DataEngine.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Escribir un Plasmoid en Python]]&lt;br /&gt;
:''Escribir un simple medidor de batería en Python.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Primeros pasos]]&lt;br /&gt;
:''Crea y ejecuta tu primer plasmoid en Ruby.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Usar widgets]]&lt;br /&gt;
:''Introducción sobre como usar widgets de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Escribir un simple applet para copiar texto]]&lt;br /&gt;
:''Un tutorial que explica como escribir un simple applet para copiar texto usando widgets.''&lt;br /&gt;
&lt;br /&gt;
== Desarrollo de temas ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Crear un tema de Plasma]]&lt;br /&gt;
:''Guía sobre como crear tu primer tema de Plasma.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recursos:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Documentación de la api de Plasma]&lt;br /&gt;
* La [https://mail.kde.org/mailman/listinfo/plasma-devel lista de correo de plasma-devel] y #plasma en IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutoriales en otros lenguajes''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-09T22:47:17Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/02/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es) (09/02/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)</id>
		<title>Development/Tutorials/Plasma/GettingStarted (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)"/>
				<updated>2009-03-09T22:46:50Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update translation (es)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma/GettingStarted}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial de Plasma|&lt;br /&gt;
&lt;br /&gt;
name=Creando tu primer Plasmoid|&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|entorno de desarrollo de KDE4]]|&lt;br /&gt;
&lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial necesita KDE 4.2 (trunk) para poder construirlo. &lt;br /&gt;
En este tutorial vamos a crear un simple plasmoid. Para hacer las cosas faciles, sólo crearemos un plasmoid estático que contendrá los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
* Una imagen SVG&lt;br /&gt;
* Icono&lt;br /&gt;
* Un texto&lt;br /&gt;
&lt;br /&gt;
[[image:creatingyourfirstplasmoid1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El Código ==&lt;br /&gt;
=== El archivo .desktop ===&lt;br /&gt;
Cada Plasmoid necesita un archivo .desktop para indicarle a Plasma como debe iniciarlo y que nombre tomará.&lt;br /&gt;
&lt;br /&gt;
'''plasma-applet-tutorial1.desktop'''&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Tutorial 1&lt;br /&gt;
Comment=Plasma Tutorial 1&lt;br /&gt;
Type=Service&lt;br /&gt;
&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
X-KDE-Library=plasma_applet_tutorial1&lt;br /&gt;
X-KDE-PluginInfo-Author=Bas Grolleman&lt;br /&gt;
X-KDE-PluginInfo-Email=bgrolleman@emendo-it.nl&lt;br /&gt;
X-KDE-PluginInfo-Name=tutorial1&lt;br /&gt;
X-KDE-PluginInfo-Version=0.1&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las partes mas importantes son '''X-KDE-Library''' y '''X-KDE-PluginInfo-Name''', ellas son el &amp;quot;pegamento&amp;quot; entre tu clase y plasma, sin ellos, no se iniciará nada. '''X-KDE-PluginInfo-Category''' se refiere a [[Projects/Plasma/PIG | PIG]].&lt;br /&gt;
&lt;br /&gt;
=== El archivo cabecera ===&lt;br /&gt;
Aquí tienes el archivo cabecera de este tutorial. Se han añadido Los comentarios por claridad.&lt;br /&gt;
&lt;br /&gt;
'''plasma-tutorial1.h'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
// Evitamos cargar la cabecera varias veces&lt;br /&gt;
#ifndef Tutorial1_HEADER&lt;br /&gt;
#define Tutorial1_HEADER&lt;br /&gt;
// Necesitamos las cabeceras de Plasma Applet&lt;br /&gt;
#include &amp;lt;Plasma/Applet&amp;gt;&lt;br /&gt;
#include &amp;lt;Plasma/Svg&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KIcon&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
class QSizeF;&lt;br /&gt;
 &lt;br /&gt;
// Definimos nuestro applet de plasma&lt;br /&gt;
class PlasmaTutorial1 : public Plasma::Applet&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
		// Constructor/Destructor básico&lt;br /&gt;
        PlasmaTutorial1(QObject *parent, const QVariantList &amp;amp;args);&lt;br /&gt;
        ~PlasmaTutorial1();&lt;br /&gt;
 &lt;br /&gt;
        // El procedimiento paintInterface dibuja el applet en la pantalla&lt;br /&gt;
        void paintInterface(QPainter *painter,&lt;br /&gt;
                const QStyleOptionGraphicsItem *option,&lt;br /&gt;
                const QRect&amp;amp; contentsRect);&lt;br /&gt;
	void init();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Plasma::Svg m_svg;&lt;br /&gt;
        KIcon m_icon;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
// Esta es la orden que enlaza el applet con el archivo .desktop&lt;br /&gt;
K_EXPORT_PLASMA_APPLET(tutorial1, PlasmaTutorial1)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== QRectF boundingRect() ====&lt;br /&gt;
La función &amp;lt;tt&amp;gt;boundingRect()&amp;lt;/tt&amp;gt; le dice a plasma el tamaño actual del plasmoid. Esto es importante porque necesitamos saber cuanto espacio se ocupa en la pantalla.&lt;br /&gt;
{{tip_(es)|&lt;br /&gt;
Si tienes problemas con tu plasmoid dejando pixeles atras cuando lo arrastras, se trata por lo general de un boundingRect() incorrecto.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== void paintInterface(QRectF contentsRect) ====&lt;br /&gt;
Puede considerarse la función principal, ya que dibuja el plasmoid en la pantalla. Aquí defines que aspecto quieres que tenga tu plasmoid.&lt;br /&gt;
Solo debes dibujar en los límites definidos por contentsRect y evitar usar geometry(). Cuando un plasmoid no tiene un fondo estándar, por ejemplo, si se ha desactivado mediante la llamada setBackgroundHints() o está en el panel, geometry() y boundingRect() se comportan igual; sin embargo, cuando el fondo estándar está activado (el caso habitual), el applet tendrá un margen donde no debería pintarse.&lt;br /&gt;
&lt;br /&gt;
==== K_EXPORT_PLASMA_APPLET ( &amp;lt;name&amp;gt;, &amp;lt;class&amp;gt; ) ====&lt;br /&gt;
Es una pequeña parte pero muy importante ya que enlaza tu clase con el nombre del applet del archivo .desktop. Si tu applet parece que no se carga, puede ser que haya una diferencia entre esta declaración y tu archivo .desktop.&lt;br /&gt;
&lt;br /&gt;
{{tip_(es)|K_EXPORT_PLASMA_APPLET añade &amp;quot;plasma_applet_&amp;quot;, por favor presta atención cuando establezcas el nombre en tu archivo .desktop para evitar una diferencia de nombres.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== plasma-tutorial1.cpp ===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;#include &amp;quot;plasma-tutorial1.h&amp;quot;&lt;br /&gt;
#include &amp;lt;QPainter&amp;gt;&lt;br /&gt;
#include &amp;lt;QFontMetrics&amp;gt;&lt;br /&gt;
#include &amp;lt;QSizeF&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;plasma/svg.h&amp;gt;&lt;br /&gt;
#include &amp;lt;plasma/theme.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
PlasmaTutorial1::PlasmaTutorial1(QObject *parent, const QVariantList &amp;amp;args)&lt;br /&gt;
	: Plasma::Applet(parent, args),&lt;br /&gt;
	m_svg(this),&lt;br /&gt;
	m_icon(&amp;quot;document&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
	m_svg.setImagePath(&amp;quot;widgets/background&amp;quot;);&lt;br /&gt;
	// Establecerá el fondo por defecto del applet, gratis!&lt;br /&gt;
	setBackgroundHints(DefaultBackground);&lt;br /&gt;
	resize(400, 400);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PlasmaTutorial1::~PlasmaTutorial1()&lt;br /&gt;
{&lt;br /&gt;
	if (hasFailedToLaunch()) {&lt;br /&gt;
		// Hacer algo de limpieza aquí&lt;br /&gt;
	} else {&lt;br /&gt;
		// Guardar la configuracion&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void PlasmaTutorial1::init()&lt;br /&gt;
{&lt;br /&gt;
	// Una pequeña demostracion de la función setFailedToLaunch&lt;br /&gt;
	if (m_icon.isNull()) {&lt;br /&gt;
		setFailedToLaunch(true, &amp;quot;Sin mundo al que decir hola&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void PlasmaTutorial1::paintInterface(QPainter *p,&lt;br /&gt;
        const QStyleOptionGraphicsItem *option, const QRect &amp;amp;contentsRect)&lt;br /&gt;
{&lt;br /&gt;
	p-&amp;gt;setRenderHint(QPainter::SmoothPixmapTransform);&lt;br /&gt;
	p-&amp;gt;setRenderHint(QPainter::Antialiasing);&lt;br /&gt;
	&lt;br /&gt;
	// Ahora dibujamos el applet, empezando por nuestro svg&lt;br /&gt;
	m_svg.resize((int)contentsRect.width(), (int)contentsRect.height());&lt;br /&gt;
	m_svg.paint(p, (int)contentsRect.left(), (int)contentsRect.top());&lt;br /&gt;
	&lt;br /&gt;
	// Colocamos el icono y el texto&lt;br /&gt;
	p-&amp;gt;drawPixmap(7, 0, m_icon.pixmap((int)contentsRect.width(), (int)contentsRect.width() - 14));&lt;br /&gt;
	p-&amp;gt;save();&lt;br /&gt;
	p-&amp;gt;setPen(Qt::white);&lt;br /&gt;
	p-&amp;gt;drawText(contentsRect, Qt::AlignBottom | Qt::AlignHCenter, &amp;quot;Hola Plasmoid!&amp;quot;);&lt;br /&gt;
	p-&amp;gt;restore();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;plasma-tutorial1.moc&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Plasma/Svg ====&lt;br /&gt;
Como se puede ver en el código de ejemplo estamos usando el objeto {{class|Plasma::Svg}}, que tiene algunas cosas importantes a señalar.&lt;br /&gt;
&lt;br /&gt;
En primer lugar estamos usando una ruta relativa a '''widgets/background''' que obliga a {{class|Plasma::Svg}} a usar {{class|Plasma::Theme}} para localizar el archivo SVG. Si bien {{class|Plasma::Svg}} da soporte para cargar archivos pasandole una ruta absoluta, usa rutas relativas para el tema siempre que sea posible, ya que esto hace que Plasma soporte estilos y que los plasmoids individuales tengan el mismo aspecto, en vez de un grupo de aplicaciones sin relación alguna. Puedes ver una lista de los componentes de imagen disponibles en [[Projects/Plasma/Theme|temas de Plasma]].&lt;br /&gt;
&lt;br /&gt;
Por otro lado, {{class|Plasma::Svg}} se puede usar para dibujar un subconjunto del archivo SVG pasandole un elemento identificador que aparezca en el documento SVG. Un buen ejemplo es el archivo clock.svg que viene en el tema por defecto, verás que tiene un fondo, tres agujas (hora, minuto y segundo) y un primer plano. Esto es mucho mas agradable para los artistas esta metodologia comparado con editar 5 archivos por separado, ya que tendrian que imaginar los archivos svg unos encima de otros, y mucho mejor para el rendimiento ya que solo se renderiza un archivo y solo se hace una lectura de archivo del disco.&lt;br /&gt;
&lt;br /&gt;
==== setBackgroundHints(DefaultBackground) ====&lt;br /&gt;
Desde que dibujar el fondo es una función común, esta es mas rapida y fácil de hacer. Añadiendo &amp;lt;tt&amp;gt;setBackgroundHints(DefaultBackground)&amp;lt;/tt&amp;gt; al código, el fondo por defecto de Plasma se dibuja detras de tu plasmoid. No solo te ahorra tiempo y código, sino que crea una presentación mas consistente para el usurario.&lt;br /&gt;
&lt;br /&gt;
==== El método init() ====&lt;br /&gt;
En el constructor solo notificas a Plasma el fondo y el archivo de configuración (si existiese). También puedes establecer el tamaño inicial en el constructor. Despues de esto, Plasma se ocupará de cualquier cambio de tamaño y de que nunca tengas que preocuparte por él. En el método &amp;lt;tt&amp;gt;init()&amp;lt;/tt&amp;gt; inicializas todo lo que necesite ser inicializado, como leer los datos del archivo de configuración por ejemplo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== hasFailedToLaunch() ====&lt;br /&gt;
Si por alguna razón el applet fallara al iniciarlo (la biblioteca no pudo cargarse, necesario soporte hardware que no se ha encontrado, etc..) este método devolvería true. Usar esta función proporciona a tu aplicación la oportunidad de limpiar lo que sea necesario antes de cerrarse.&lt;br /&gt;
&lt;br /&gt;
==== setFailedToLaunch(bool, QString) ====&lt;br /&gt;
Cuando tu aplicación no esta en condiciones de iniciarse, esta función te permite informar a Plasma y dar un motivo del porque. Entonces Plasma lanzará una interfaz estándar de error para informar al usuario de la situación y en tu applet no se dibujará nada mas a partir de ese punto. Si tu plasmoid se convierte en algo mas complejo y depende de multiples factores, este método es la manera mas adecuada para limpiar lo que sea necesario.&lt;br /&gt;
&lt;br /&gt;
==== dataUpdated ====&lt;br /&gt;
Si quisieras conectar tu applet a cualquiera de los data-engines de plasma, deberías implementar una función de nombre dataUpdate en tu plasmoid. Se llama a esta función si el data-engine te envia datos, es decir, tu plasmoid debería recalcular su contenido.&lt;br /&gt;
&lt;br /&gt;
==== Determinar el tamaño y la geometría del applet: geometry() y contentsRect() ====&lt;br /&gt;
Si necesitas saber, en tu código, que tamaño y geometria que tiene el applet, puedes llamar a contentsRect() y a contentsRect().size().&lt;br /&gt;
Evita llamar a geometry() y size() porque en el cálculo no se tiene en cuenta el tamaño del margen establecido por el fondo por defecto del applet.&lt;br /&gt;
También evita usar números absolutos para situar los elementos en el applet, como QPoint(0, 0) para indicar el punto superior izquierdo de tu applet, en vez de esto usa contentsRect().topLeft().&lt;br /&gt;
&lt;br /&gt;
=== Construir el applet: CMakeLists.txt ===&lt;br /&gt;
Por último, para poner todo junto necesitas construirlo todo. Para decirle a cmake que necesita tenemos el archivo CMakeLists.txt &lt;br /&gt;
&lt;br /&gt;
Para mas detalles de CMake lee por favor [[Development/Tutorials/CMake]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
# El proyecto necesita un nombre&lt;br /&gt;
project(plasma-tutorial1)&lt;br /&gt;
 &lt;br /&gt;
# Encuentra las bibliotecas necesarias&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
 &lt;br /&gt;
add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})&lt;br /&gt;
include_directories(&lt;br /&gt;
   ${CMAKE_SOURCE_DIR}&lt;br /&gt;
   ${CMAKE_BINARY_DIR}&lt;br /&gt;
   ${KDE4_INCLUDES}&lt;br /&gt;
   )&lt;br /&gt;
 &lt;br /&gt;
# Añadimos nuestro código fuente aqui&lt;br /&gt;
set(tutorial1_SRCS plasma-tutorial1.cpp)&lt;br /&gt;
 &lt;br /&gt;
# Ahora nos aseguramos de poner todos los archivos en su lugar&lt;br /&gt;
kde4_add_plugin(plasma_applet_tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(plasma_applet_tutorial1 &lt;br /&gt;
                      ${KDE4_PLASMA_LIBS} ${KDE4_KDEUI_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS plasma_applet_tutorial1&lt;br /&gt;
        DESTINATION ${PLUGIN_INSTALL_DIR})&lt;br /&gt;
 &lt;br /&gt;
install(FILES plasma-applet-tutorial1.desktop&lt;br /&gt;
        DESTINATION ${SERVICES_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testeando el Applet ==&lt;br /&gt;
Si tu actual entorno de desarrollo difiere de la instalacion de KDE4, tienes que ejecutar cmake con -DCMAKE_INSTALL_PREFIX=/usr/lib/kde4/ (reemplazar por tu $KDEDIR). Luego ejecuta make. Si todo fue bien, puedes instalar el applet ejecutando ''sudo make install'' o:&lt;br /&gt;
* cp ./lib/plasma_applet_tutorial1.so $KDEDIR/lib &lt;br /&gt;
* cp ./plasma-applet-tutorial1.desktop $KDEDIR/share/kde4/services/&lt;br /&gt;
&lt;br /&gt;
y ejecuta kbuildsycoca4 (hará que todas las aplicacionesde KDE se enteren de los nuevos arvhivos desktop).&lt;br /&gt;
Para testear tu Applet puedes usar el programa ''plasmoidviewer'':&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
plasmoidviewer nombre_applet&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Incluso puedes ver el applet en un pequeño escritorio mediante:&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
plasmoidviewer -c escritorio nombre_applet&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde ''nombre_applet'' es el valor especificado en el campo '''X-KDE-PluginsInfo-Name''' del archivo .desktop.&lt;br /&gt;
&lt;br /&gt;
También puedes reiniciar plasma, así el Applet se mostrará en el navegador de Applets:&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
kbuildsycoca4&lt;br /&gt;
kquitapp plasma # en trunk (KDE 4.3): kquitapp plasma-desktop&lt;br /&gt;
plasma          # en trunk (KDE 4.3): plasma-desktop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si esto no funciona tendras que reiniciar tu sesión KDE.&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-09T22:43:09Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma_(es) (09/02/09)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:41:59Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Primeros pasos]]&lt;br /&gt;
:''Crea y ejecuta tu primer plasmoid en Python.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Usar widgets]]&lt;br /&gt;
:''Introducción sobre como usar widgets de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Usar DataEngines]]&lt;br /&gt;
:''Como usar DataEngines en un plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Escribir DataEngines]]&lt;br /&gt;
:''Como escribir tu propio DataEngine.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Escribir un Plasmoid en Python]]&lt;br /&gt;
:''Escribir un simple medidor de batería en Python.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Ruby ==&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/GettingStarted|Primeros pasos]]&lt;br /&gt;
:''Crea y ejecuta tu primer plasmoid en Ruby.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Usar widgets]]&lt;br /&gt;
:''Introducción sobre como usar widgets de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Escribir un simple applet para copiar texto]]&lt;br /&gt;
:''Un tutorial que explica como escribir un simple applet para copiar texto usando widgets.''&lt;br /&gt;
&lt;br /&gt;
== Desarrollo de temas ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Crear un tema de Plasma]]&lt;br /&gt;
:''Guía sobre como crear tu primer tema de Plasma.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recursos:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Documentación de la api de Plasma]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel lista de correo de plasma-devel] y #plasma en IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutoriales en otros lenguajes''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:33:14Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:32:25Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:30:16Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:26:48Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:23:41Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:23:06Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma_(es)}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:22:33Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted_(es)|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:21:35Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:21:00Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted|Primeros pasos con Plasmoids]]&lt;br /&gt;
:''Crea tu primer plasmoid en C++ con un fondo SVG, un icono y un texto.''&lt;br /&gt;
&lt;br /&gt;
;[[/DataEngines|Escribir un DataEngine]]&lt;br /&gt;
:''Un DataEngine proporciona una interfaz estándar para acceder a varias fuentes de datos. Aprende que es un DataEngine y como escribir uno propio.''&lt;br /&gt;
&lt;br /&gt;
;[http://www.kdedevelopers.org/node/3247 Vídeo tutorial]&lt;br /&gt;
:''Vídeo y transparencias de una presentación de libplasma (enlace a las transparencias a continuación).''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Enlace a las transparencias del citado vídeo]&lt;br /&gt;
:''Transparencias de la presentación &amp;quot;Creación de interfaces de usuario con Plasma&amp;quot;, por Aaron Seigo.''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|Como usar extenders en tu Plasmoid]]&lt;br /&gt;
:''Un sencillo ejemplo que muestra como usar extenders en un Plasmoid.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los Runners son plugins que proporcionan una funcionalidad de búsqueda basada en acciónes en el dialogo &amp;quot;ejecutar orden&amp;quot; del área de trabajo de Plasma. Estos plugins pueden usarse en cualquier aplicación que enlace con libplasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/ComicPlugin|Crear un plugin para Comic]]&lt;br /&gt;
:''Esta guia te muestra como crear un plugin para el plasmoid Comic.''&lt;br /&gt;
&lt;br /&gt;
== Programación en Plasma con Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma</id>
		<title>Development/Tutorials/Plasma</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma"/>
				<updated>2009-03-09T22:02:47Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma}}&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[/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;
;[http://www.kdedevelopers.org/node/3247 Video tutorial]&lt;br /&gt;
:''Video and slides from a presentation on libplasma (link to Slides below)''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Link To Slides For The Above Video]&lt;br /&gt;
:''Slides For The Presentation Creating User Interfaces With Plasma by Aaron Seigo''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&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;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:02:25Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Programación en Plasma con C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[/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;
;[http://www.kdedevelopers.org/node/3247 Video tutorial]&lt;br /&gt;
:''Video and slides from a presentation on libplasma (link to Slides below)''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Link To Slides For The Above Video]&lt;br /&gt;
:''Slides For The Presentation Creating User Interfaces With Plasma by Aaron Seigo''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&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;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma_(es)</id>
		<title>Development/Tutorials/Plasma (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma_(es)"/>
				<updated>2009-03-09T22:01:00Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Plasma Programming with C++ ==&lt;br /&gt;
&lt;br /&gt;
;[[/GettingStarted|Getting Started With Plasmoids]]&lt;br /&gt;
:''Creating your first plasmoid in C++ with SVG background, icon and text''&lt;br /&gt;
&lt;br /&gt;
;[[/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;
;[http://www.kdedevelopers.org/node/3247 Video tutorial]&lt;br /&gt;
:''Video and slides from a presentation on libplasma (link to Slides below)''&lt;br /&gt;
&lt;br /&gt;
;[http://mirror.linux.org.au/pub/linux.conf.au/2008/slides/296-coolplasma.odp Link To Slides For The Above Video]&lt;br /&gt;
:''Slides For The Presentation Creating User Interfaces With Plasma by Aaron Seigo''&lt;br /&gt;
&lt;br /&gt;
;[[/UsingExtenders|How to use extenders in your Plasmoid]]&lt;br /&gt;
:''A simple example that shows how to use extenders in a Plasmoid.''&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;
;[[Development/Tutorials/Plasma/ComicPlugin|Creating Comic Plugins]]&lt;br /&gt;
:''This guide shows you how to create a comic plugin for the comic plasmoid.''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Python ==&lt;br /&gt;
&lt;br /&gt;
;[[/Python/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Python''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Using DataEngines|Using DataEngines]]&lt;br /&gt;
:''How to use DataEngines from a plasmoid''&lt;br /&gt;
&lt;br /&gt;
;[[/Python/Writing DataEngines|Writing DataEngines]]&lt;br /&gt;
:''How to write your own Plasma DataEngine''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/PythonPlasmoid|Writing a Plasmoid in Python]]&lt;br /&gt;
:''Writing a simple battery graph in python''&lt;br /&gt;
&lt;br /&gt;
== Plasma Programming with Ruby ==&lt;br /&gt;
;[[/Ruby/GettingStarted|Getting Started]]&lt;br /&gt;
:''Creating and running your first plasmoid in Ruby''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/Using widgets|Using widgets]]&lt;br /&gt;
:''Introduction to using Plasma widgets''&lt;br /&gt;
&lt;br /&gt;
;[[/Ruby/SimplePasteApplet|Writing a simple paste applet]]&lt;br /&gt;
:''A tutorial explaining how to write a simple paste applet using widgets''&lt;br /&gt;
&lt;br /&gt;
== Theme development ==&lt;br /&gt;
&lt;br /&gt;
;[[/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Resources:&lt;br /&gt;
&lt;br /&gt;
* http://techbase.kde.org/Projects/Plasma&lt;br /&gt;
* [http://api.kde.org/4.x-api/kdelibs-apidocs/plasma/html/index.html Plasma api documentation]&lt;br /&gt;
* The [https://mail.kde.org/mailman/listinfo/plasma-devel plasma-devel mailing list] and #plasma on IRC (irc.freenode.org).&lt;br /&gt;
&lt;br /&gt;
TODO: &lt;br /&gt;
&lt;br /&gt;
* '''tutorials for other languages''' (JavaScript, Ruby, etc...)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-09T21:59:51Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
=== Plugins para 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;
== 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_(es)]] 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;
;[[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;
=== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2009-03-09T21:59:01Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aquí tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. La fecha entre paréntesis indica la última comprobación con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es) (09/03/09)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-09T21:56:22Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
=== Plugins para 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;
== 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;
;[[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;
=== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-09T21:54:58Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 6, también está traducido el punto 13 (Plasma)}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
=== Plugins para 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;
== 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;
;[[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;
=== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2009-03-09T21:53:06Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 6, también está traducido el punto 13 (Plasma)}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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;
=== Plugins para 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;
== 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;
== 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_(es)|Primeros pasos con los Plasmoids]]&lt;br /&gt;
:''Crea tu primer widget de Plasma, o Plasmoid, en C++ con un fondo SVG, un icono y algo de texto''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir DataEngine]]&lt;br /&gt;
:''DataEngines proporcionan una [http://api.kde.org/4.0-api/kdebase-apidocs/workspace/libs/plasma/html/classPlasma_1_1DataEngine.html interfaz estandarizada] para varias fuentes de datos para usarlos en las visualizaciones. Aprende que es un DataEngine y como escribir uno''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Usar DataEngines en los Plasmoids]]&lt;br /&gt;
:''Con un DateEngine, es posible recuperar datos para mostrarlos de una forma simple y estandar. Este tutorial abarca el tema de como usar DataEngines en los Plasmoids''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los &amp;quot;Runners&amp;quot; son plugins que proporcionan la funcionalidad de busqueda basada en acciones mediante el dialogo &amp;quot;ejecutar orden&amp;quot; en el area de trabajo de Plasma. Estos plugins pueden ser usados por cualquier aplicación que enlace con libplasma''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guía para crear tu primer tema de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Usar Extenders]]&lt;br /&gt;
:''Esta guía te muestra como crear un simple applet (destripando el applet kuiserver) que use extenders''.&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/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;
== 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 KGet Hot New Stuff2]]&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;
;[[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_WebKit_Tutorial|PyKDE WebKit Tutorial]]&lt;br /&gt;
:''A simple web browser application in PyKDE''&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;
;[[Development/Tutorials/Games/KGLEngine2d| KGLEngine2d]]&lt;br /&gt;
:''Using KGLEngine2d for 2D games development''&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;
&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2008-12-31T16:50:21Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update index - spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 6, también está traducido el punto 13 (Plasma)}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide (es)|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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 ===&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;
== 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/NepomukServer|The Nepomuk Server]]&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;
&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;
== 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_(es)|Primeros pasos con los Plasmoids]]&lt;br /&gt;
:''Crea tu primer widget de Plasma, o Plasmoid, en C++ con un fondo SVG, un icono y algo de texto''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir DataEngine]]&lt;br /&gt;
:''DataEngines proporcionan una [http://api.kde.org/4.0-api/kdebase-apidocs/workspace/libs/plasma/html/classPlasma_1_1DataEngine.html interfaz estandarizada] para varias fuentes de datos para usarlos en las visualizaciones. Aprende que es un DataEngine y como escribir uno''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Usar DataEngines en los Plasmoids]]&lt;br /&gt;
:''Con un DateEngine, es posible recuperar datos para mostrarlos de una forma simple y estandar. Este tutorial abarca el tema de como usar DataEngines en los Plasmoids''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los &amp;quot;Runners&amp;quot; son plugins que proporcionan la funcionalidad de busqueda basada en acciones mediante el dialogo &amp;quot;ejecutar orden&amp;quot; en el area de trabajo de Plasma. Estos plugins pueden ser usados por cualquier aplicación que enlace con libplasma''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guía para crear tu primer tema de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Usar Extenders]]&lt;br /&gt;
:''Esta guía te muestra como crear un simple applet (destripando el applet kuiserver) que use extenders''.&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/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;
== 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 KGet Hot New Stuff2]]&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;
;[[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_WebKit_Tutorial|PyKDE WebKit Tutorial]]&lt;br /&gt;
:''A simple web browser application in PyKDE''&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;
;[[Development/Tutorials/Games/KGLEngine2d| KGLEngine2d]]&lt;br /&gt;
:''Using KGLEngine2d for 2D games development''&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;
&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-12-30T11:06:43Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)</id>
		<title>Development/Tutorials/Saving and loading (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)"/>
				<updated>2008-12-30T01:15:54Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update link - spanish&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Cargar y guardar archivos|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions_(es)|Tutorial 3 - KActions]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/KCmdLineArgs_(es)|Tutorial 5 - Usar KCmdLineArgs]]| &lt;br /&gt;
&lt;br /&gt;
reading=KIO::{{class|NetAccess}} {{qt|QFile}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos una interfaz básica del editor de textos, es hora de añadirle funcionalidad. Básicamente, un editor de textos  debe abrir archivos desde disco, guardar archivos que has creado/editado y crear nuevos archivos.&lt;br /&gt;
&lt;br /&gt;
KDE proporciona algunas clases para trabajar con archivos que hacen la vida mucho mas fácil a los desarrolladores. La biblioteca KIO te permite fácilmente tener acceso a archivos a través de protocolos de red transparentes, así como mediante cuadros de dialogo estándar.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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) 2008 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; no ha cambiado desde el tutorial 3, excepto el cambio de cualquier referencia de tutorial 3 a 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 //nuevo respecto al 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; //nuevo&lt;br /&gt;
&lt;br /&gt;
	private slots: //nuevo&lt;br /&gt;
		void newFile(); //nuevo&lt;br /&gt;
		void openFile(); //nuevo&lt;br /&gt;
		void saveFile(); //nuevo&lt;br /&gt;
		void saveFileAs(); //nuevo&lt;br /&gt;
		void saveFileAs(const QString &amp;amp;outputFileName); //nuevo &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Como queremos añadir la posibilidad de cargar y guardar archivos, debemos añadir las funciones que realizarán el trabajo. Ya que invocaremos a las funciones mediante el mecanismo de Qt [http://doc.trolltech.com/latest/signalsandslots.html signal/slot], debemos especificar que dichas funciones son slots, por lo que lo hacemos en la linea 19. Como estamos usando slots en el archivo cabecera, debemos también añadir la macro [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
También queremos llevar un registro del nombre del archivo abierto actual, por lo que declaramos &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; //nuevo&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //nuevo&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
	: KXmlGuiWindow(parent),&lt;br /&gt;
		fileName(QString()) //nuevo&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;Limpiar&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;limpiar&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()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Nuevo de aqui en adelante&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().toUtf8());&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, 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, 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;limpiar&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;limpiar&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;
Es idéntico a &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; del tutorial 3 excepto &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;, que ha cambiado a 'tutorial4'. No necesitamos añadir ninguna información de las &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; ya que la posición de esas acciones las maneja KDE automaticamente.&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bien, ahora vamos a implementar el código que realizará el trabajo de cargar y guardar. Esto se lleva a cabo en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo primero que hacemos es añadir&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;
al constructor de &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; en la linea 16. Esto asegura que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; esté vacio desde el principio.&lt;br /&gt;
&lt;br /&gt;
===Añadir las acciones===&lt;br /&gt;
&lt;br /&gt;
La primera cosa que vamos a hacer es proporcionar al usuario la interfaz para decirle a la aplicación que cargue o guarde un archivo. Como ya hicimos con la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; en el tutorial 3, usaremos &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. En las lineas 37-47 añadimos las acciones de la misma manera que la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt;. Para cada una de ellas, la conectamos que el slot apropiado que hemos declarado en el archivo cabecera.&lt;br /&gt;
&lt;br /&gt;
===Crear un nuevo documento===&lt;br /&gt;
&lt;br /&gt;
La primera función que hemos definido es &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt;.&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;
Con &amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; ponemos la QString como &amp;quot;vacia&amp;quot; para reflejar el hecho de que el documento aún no está presente en disco. A continuación, &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; limpia el area de texto usando la misma función que conectaba con la &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; en el tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Guardar un archivo===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a escribir nuestro primer código que maneje archivos. Vamos a implementar una función que guardará el contenido del área de texto en un archivo con un nombre pasado como parámetro. KDE proporciona una clase llamada {{class|KSaveFile}} para guardar archivos de manera segura, que hereda de la clase de Qt {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
El prototipo de la función es:&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;
A continuación creamos nuestro objeto &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; y lo abrimos con:&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;
Ahora que tenemos nuestro &amp;quot;file&amp;quot; para escribir, necesitamos convertir el texto del area de texto a un formato que pueda ser escrito en el archivo. Para hacer esto, creamos un {{qt|QByteArray}} y lo rellenamos con la versión en texto plano de lo que haya en el area de texto:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Ahora que tenemos nuestro &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, lo usamos para escribir el archivo con &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. Si estuvieramos usando un &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, los cambios se reflejarían inmediatamente. Sin embargo, si se ha producido un problema parcial en la escritura, el archivo podría estar corrupto. Por esta razón, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; escribe primero en un archivo temporal y luego, en la llamada &amp;lt;tt&amp;gt;KSaveFile::Finalize&amp;lt;/tt&amp;gt;, refleja los cambios en el archivo actual.&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;
Por último, establecemos que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; apunte al nombre del archivo que acabamos de guardar.&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;
Esta es la función a la que está conectado el slot &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt;. Simplemente llama a la función genérica &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; pasandole el nombre del fichero devuelto por &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;
Este es nuestro primer uso de la biblioteca KIO. La clase {{class|KFileDialog}} proporciona diferentes funciones estáticas para mostrar cuadros de dialgo estandar, usados en todas las aplicaciones de KDE. La llamada a &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; mostrará un diálogo donde el usuario puede seleccionar en nombre del archivo a guardar o elegir un nuevo nombre. La función devuelve el nombre del archivo, con el cual luego llamamos a &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;
No hay nada destacable o nuevo en esta función, solamente la lógica para decidir si se muestra el dialogo para guardar el archivo. Si &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; no está vacio, el archivo es guardado como &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. Si lo está, se muestra el diálogo para permitir al usuario elegir el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===Cargar un archivo===&lt;br /&gt;
&lt;br /&gt;
Por último, el tutorial 4 debe ser capaz de cargar archivos desde disco. El código para llevarlo a cabo se encuentra en la función &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Primero debemos preguntar al usuario por en nombre del archivo que desea abrir. Esto lo hacemos usando otra de las funciones de &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt;, &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;
Luego usamos la biblioteca KIO para recuperar nuestro archivo. Esto nos permite abrir el archivo con QFile incluso si está almacenado en una ubicación remota, como un sitio FTP. Hacemos la siguiente llamada a la función &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; de la clase {{class|NetAccess}}:&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;
El primer argumento es el nombre del archivo que queremos descargar. El segundo es un QString el cual, una vez se haya completado la descarga, contendrá la localización de la copia temporal del archivo. Es con &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; con quien trabajaremos a partir de ahora.&lt;br /&gt;
&lt;br /&gt;
La función devuelve &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; dependiendo si la transferencia tuvo exito. Si falló, mostraremos un mensaje informando del 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;
En caso contrario, continuamos con la apertura del archivo.&lt;br /&gt;
&lt;br /&gt;
Creamos un QFile pasando a su constructor el archivo temporal creado por &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; y lo abrirmos en modo de solo lectura:&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;
Para mostrar el contenido del archivo debemos usar un {{qt|QTextStream}}. Creamos uno pasandole el contenido de nuestro archivo a su constructor, y llamamos a la función de QFile &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; para obtener el texto del archivo. Luego este texto se le pasa a la función &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; de nuestra área de texto.&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;
A continuación almacenamos la ruta de acceso del archivo que acabamos de abrir:&lt;br /&gt;
&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;
y por último, eliminamos el archivo temporal que fué creado por &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, instalar  y ejecutar==&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;
Como ahora estamos usando la biblioteca KIO, debemos decirselo a CMAKE para que la enlace. Hacemos esto pasándole &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; a la función &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con este archivo, puede construirse y ejecutar el tutorial de la misma forma que el tutorial 3. Para mas información, ve al 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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/KCmdLineArgs|Tutorial 5 - KCmdLineArgs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)</id>
		<title>Development/Tutorials/KCmdLineArgs (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)"/>
				<updated>2008-12-30T01:15:14Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish, update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KCmdLineArgs}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Argumentos para la linea de ordenes|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Saving and loading_(es)|Tutorial 4 - Cargar y Guardar]]|&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;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos el editor de texto con el cual podemos cargar y guardar archivos, vamos a hacer que actúe mas como una aplicación de escritorio, permitiendo cargar archivos desde la linea de ordenes e incluso usar ''Abrir con'' en Dolphin.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial5.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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; //nuevo&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; //nuevo&lt;br /&gt;
	options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Document to open&amp;quot;)); //nuevo&lt;br /&gt;
	KCmdLineArgs::addCmdLineOptions(options); //nuevo&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(); //nuevo&lt;br /&gt;
	if(args-&amp;gt;count()) //nuevo&lt;br /&gt;
	{&lt;br /&gt;
		window-&amp;gt;openFile(args-&amp;gt;url(0).url()); //nuevo&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); //nuevo&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;Limpiar&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;limpiar&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() //cambiado&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) //nuevo&lt;br /&gt;
{&lt;br /&gt;
	QString tmpFile;&lt;br /&gt;
	if(KIO::NetAccess::download(inputFileName, tmpFile, 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;
===tutorial5ui.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;limpiar&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;limpiar&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;
Es idéntico al &amp;lt;tt&amp;gt;tutorial''x''ui.rc&amp;lt;/tt&amp;gt; de los dos tutoriales anteriores excepto que &amp;lt;tt&amp;gt;tutorial''x''&amp;lt;/tt&amp;gt; ahora es &amp;lt;tt&amp;gt;tutorial5&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
Lo único que hemos añadido a partir del tutorial 4 es la función &amp;lt;tt&amp;gt;openFile&amp;lt;/tt&amp;gt; que tiene como parámetro un &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;
No tenemos nuevo código, solo lo hemos reordenado. Todo lo de &amp;lt;tt&amp;gt;void openFile()&amp;lt;/tt&amp;gt; se ha movido a &amp;lt;tt&amp;gt;void openFile(const QString &amp;amp;inputFileName)&amp;lt;/tt&amp;gt; excepto la llamada a &amp;lt;tt&amp;gt;KFileDialog::getOpenFileName()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De esta manera, podemos llamar a &amp;lt;tt&amp;gt;openFile()&amp;lt;/tt&amp;gt; si queremos mostrar un diálogo, o podemos llamar a &amp;lt;tt&amp;gt;openFile(QString)&amp;lt;/tt&amp;gt; si ya conocemos el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&lt;br /&gt;
Aqui es donde la clase {{class|KCmdLineArgs}} realiza todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
==Make, Instalar y Ejecutar==&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;
Con este archivo, podemos construir y ejecutar este tutorial de la misma forma que los tutoriales 3 y 4. Para mas información, mira el 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;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)</id>
		<title>Development/Tutorials/KCmdLineArgs (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)"/>
				<updated>2008-12-30T01:13:55Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KCmdLineArgs}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Argumentos para la linea de ordenes&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;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos el editor de texto con el cual podemos cargar y guardar archivos, vamos a hacer que actúe mas como una aplicación de escritorio, permitiendo cargar archivos desde la linea de ordenes e incluso usar ''Abrir con'' en Dolphin.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial5.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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; //nuevo&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; //nuevo&lt;br /&gt;
	options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Document to open&amp;quot;)); //nuevo&lt;br /&gt;
	KCmdLineArgs::addCmdLineOptions(options); //nuevo&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(); //nuevo&lt;br /&gt;
	if(args-&amp;gt;count()) //nuevo&lt;br /&gt;
	{&lt;br /&gt;
		window-&amp;gt;openFile(args-&amp;gt;url(0).url()); //nuevo&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); //nuevo&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;Limpiar&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;limpiar&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() //cambiado&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) //nuevo&lt;br /&gt;
{&lt;br /&gt;
	QString tmpFile;&lt;br /&gt;
	if(KIO::NetAccess::download(inputFileName, tmpFile, 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;
===tutorial5ui.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;limpiar&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;limpiar&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;
Es idéntico al &amp;lt;tt&amp;gt;tutorial''x''ui.rc&amp;lt;/tt&amp;gt; de los dos tutoriales anteriores excepto que &amp;lt;tt&amp;gt;tutorial''x''&amp;lt;/tt&amp;gt; ahora es &amp;lt;tt&amp;gt;tutorial5&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
Lo único que hemos añadido a partir del tutorial 4 es la función &amp;lt;tt&amp;gt;openFile&amp;lt;/tt&amp;gt; que tiene como parámetro un &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;
No tenemos nuevo código, solo lo hemos reordenado. Todo lo de &amp;lt;tt&amp;gt;void openFile()&amp;lt;/tt&amp;gt; se ha movido a &amp;lt;tt&amp;gt;void openFile(const QString &amp;amp;inputFileName)&amp;lt;/tt&amp;gt; excepto la llamada a &amp;lt;tt&amp;gt;KFileDialog::getOpenFileName()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De esta manera, podemos llamar a &amp;lt;tt&amp;gt;openFile()&amp;lt;/tt&amp;gt; si queremos mostrar un diálogo, o podemos llamar a &amp;lt;tt&amp;gt;openFile(QString)&amp;lt;/tt&amp;gt; si ya conocemos el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&lt;br /&gt;
Aqui es donde la clase {{class|KCmdLineArgs}} realiza todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
==Make, Instalar y Ejecutar==&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;
Con este archivo, podemos construir y ejecutar este tutorial de la misma forma que los tutoriales 3 y 4. Para mas información, mira el 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;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)</id>
		<title>Development/Tutorials/KCmdLineArgs (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/KCmdLineArgs_(es)"/>
				<updated>2008-12-30T01:13:06Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/KCmdLineArgs}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Argumentos para la linea de ordenes&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Saving and loading_(es)|Tutorial 4 - Cargar y Guardar]]|&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;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos el editor de texto con el cual podemos cargar y guardar archivos, vamos a hacer que actúe mas como una aplicación de escritorio, permitiendo cargar archivos desde la linea de ordenes e incluso usar ''Abrir con'' en Dolphin.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial5.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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; //nuevo&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; //nuevo&lt;br /&gt;
	options.add(&amp;quot;+[file]&amp;quot;, ki18n(&amp;quot;Document to open&amp;quot;)); //nuevo&lt;br /&gt;
	KCmdLineArgs::addCmdLineOptions(options); //nuevo&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(); //nuevo&lt;br /&gt;
	if(args-&amp;gt;count()) //nuevo&lt;br /&gt;
	{&lt;br /&gt;
		window-&amp;gt;openFile(args-&amp;gt;url(0).url()); //nuevo&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); //nuevo&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;Limpiar&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;limpiar&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() //cambiado&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) //nuevo&lt;br /&gt;
{&lt;br /&gt;
	QString tmpFile;&lt;br /&gt;
	if(KIO::NetAccess::download(inputFileName, tmpFile, 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;
===tutorial5ui.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;limpiar&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;limpiar&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;
Es idéntico al &amp;lt;tt&amp;gt;tutorial''x''ui.rc&amp;lt;/tt&amp;gt; de los dos tutoriales anteriores excepto que &amp;lt;tt&amp;gt;tutorial''x''&amp;lt;/tt&amp;gt; ahora es &amp;lt;tt&amp;gt;tutorial5&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
&lt;br /&gt;
===mainwindow.h===&lt;br /&gt;
Lo único que hemos añadido a partir del tutorial 4 es la función &amp;lt;tt&amp;gt;openFile&amp;lt;/tt&amp;gt; que tiene como parámetro un &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;
No tenemos nuevo código, solo lo hemos reordenado. Todo lo de &amp;lt;tt&amp;gt;void openFile()&amp;lt;/tt&amp;gt; se ha movido a &amp;lt;tt&amp;gt;void openFile(const QString &amp;amp;inputFileName)&amp;lt;/tt&amp;gt; excepto la llamada a &amp;lt;tt&amp;gt;KFileDialog::getOpenFileName()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
De esta manera, podemos llamar a &amp;lt;tt&amp;gt;openFile()&amp;lt;/tt&amp;gt; si queremos mostrar un diálogo, o podemos llamar a &amp;lt;tt&amp;gt;openFile(QString)&amp;lt;/tt&amp;gt; si ya conocemos el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===main.cpp===&lt;br /&gt;
&lt;br /&gt;
Aqui es donde la clase {{class|KCmdLineArgs}} realiza todo el trabajo.&lt;br /&gt;
&lt;br /&gt;
==Make, Instalar y Ejecutar==&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;
Con este archivo, podemos construir y ejecutar este tutorial de la misma forma que los tutoriales 3 y 4. Para mas información, mira el 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;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-12-29T22:55:40Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)</id>
		<title>Development/Tutorials/Plasma/GettingStarted (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)"/>
				<updated>2008-12-29T00:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma/GettingStarted}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial de Plasma|&lt;br /&gt;
&lt;br /&gt;
name=Creando tu primer Plasmoid|&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|entorno de desarrollo de KDE4]]|&lt;br /&gt;
&lt;br /&gt;
next=| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial necesita KDE 4.1 (trunk) para poder construirlo. &lt;br /&gt;
En este tutorial vamos a crear un simple plasmoid. Para hacer las cosas faciles, sólo crearemos un plasmoid estático que contendrá los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
* Una imagen SVG&lt;br /&gt;
* Icono&lt;br /&gt;
* Un texto&lt;br /&gt;
&lt;br /&gt;
[[image:creatingyourfirstplasmoid1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El Código ==&lt;br /&gt;
=== El archivo .desktop ===&lt;br /&gt;
Cada Plasmoid necesita un archivo .desktop para indicarle a Plasma como debe iniciarlo y que nombre tomará.&lt;br /&gt;
&lt;br /&gt;
'''plasma-applet-tutorial1.desktop'''&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Tutorial 1&lt;br /&gt;
Comment=Plasma Tutorial 1&lt;br /&gt;
Type=Service&lt;br /&gt;
&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
X-KDE-Library=plasma_applet_tutorial1&lt;br /&gt;
X-KDE-PluginInfo-Author=Bas Grolleman&lt;br /&gt;
X-KDE-PluginInfo-Email=bgrolleman@emendo-it.nl&lt;br /&gt;
X-KDE-PluginInfo-Name=tutorial1&lt;br /&gt;
X-KDE-PluginInfo-Version=0.1&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las partes mas importantes son '''X-KDE-Library''' y '''X-KDE-PluginInfo-Name''', ellas son el &amp;quot;pegamento&amp;quot; entre tu clase y plasma, sin ellos, no se iniciará nada. '''X-KDE-PluginInfo-Category''' se refiere a [[Projects/Plasma/PIG | PIG]].&lt;br /&gt;
&lt;br /&gt;
=== El archivo cabecera ===&lt;br /&gt;
Aquí tienes el archivo cabecera de este tutorial. Se han añadido Los comentarios por claridad.&lt;br /&gt;
&lt;br /&gt;
'''plasma-tutorial1.h'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
// Evitamos cargar la cabecera varias veces&lt;br /&gt;
#ifndef Tutorial1_HEADER&lt;br /&gt;
#define Tutorial1_HEADER&lt;br /&gt;
// Necesitamos las cabeceras de Plasma Applet&lt;br /&gt;
#include &amp;lt;Plasma/Applet&amp;gt;&lt;br /&gt;
#include &amp;lt;Plasma/Svg&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;KIcon&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
class QSizeF;&lt;br /&gt;
 &lt;br /&gt;
// Definimos nuestro applet de plasma&lt;br /&gt;
class PlasmaTutorial1 : public Plasma::Applet&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
		// Constructor/Destructor básico&lt;br /&gt;
        PlasmaTutorial1(QObject *parent, const QVariantList &amp;amp;args);&lt;br /&gt;
        ~PlasmaTutorial1();&lt;br /&gt;
 &lt;br /&gt;
        // El procedimiento paintInterface dibuja el applet en la pantalla&lt;br /&gt;
        void paintInterface(QPainter *painter,&lt;br /&gt;
                const QStyleOptionGraphicsItem *option,&lt;br /&gt;
                const QRect&amp;amp; contentsRect);&lt;br /&gt;
	void init();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Plasma::Svg m_svg;&lt;br /&gt;
        KIcon m_icon;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
// Esta es la orden que enlaza el applet con el archivo .desktop&lt;br /&gt;
K_EXPORT_PLASMA_APPLET(tutorial1, PlasmaTutorial1)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== QRectF boundingRect() ====&lt;br /&gt;
La función &amp;lt;tt&amp;gt;boundingRect()&amp;lt;/tt&amp;gt; le dice a plasma el tamaño actual del plasmoid. Esto es importante porque necesitamos saber cuanto espacio se ocupa en la pantalla.&lt;br /&gt;
{{tip_(es)|&lt;br /&gt;
Si tienes problemas con tu plasmoid dejando pixeles atras cuando lo arrastras, se trata por lo general de un boundingRect() incorrecto.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== void paintInterface(QRectF contentsRect) ====&lt;br /&gt;
Puede considerarse la función principal, ya que dibuja el plasmoid en la pantalla. Aquí defines que aspecto quieres que tenga tu plasmoid.&lt;br /&gt;
Solo debes dibujar en los límites definidos por contentsRect y evitar usar geometry(). Cuando un plasmoid no tiene un fondo estándar, por ejemplo, si se ha desactivado mediante la llamada setBackgroundHints() o está en el panel, geometry() y boundingRect() se comportan igual; sin embargo, cuando el fondo estándar está activado (el caso habitual), el applet tendrá un margen donde no debería pintarse.&lt;br /&gt;
&lt;br /&gt;
==== K_EXPORT_PLASMA_APPLET ( &amp;lt;name&amp;gt;, &amp;lt;class&amp;gt; ) ====&lt;br /&gt;
Es una pequeña parte pero muy importante ya que enlaza tu clase con el nombre del applet del archivo .desktop. Si tu applet parece que no se carga, puede ser que haya una diferencia entre esta declaración y tu archivo .desktop.&lt;br /&gt;
&lt;br /&gt;
{{tip_(es)|K_EXPORT_PLASMA_APPLET añade &amp;quot;plasma_applet_&amp;quot;, por favor presta atención cuando establezcas el nombre en tu archivo .desktop para evitar una diferencia de nombres.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== plasma-tutorial1.cpp ===&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;#include &amp;quot;plasma-tutorial1.h&amp;quot;&lt;br /&gt;
#include &amp;lt;QPainter&amp;gt;&lt;br /&gt;
#include &amp;lt;QFontMetrics&amp;gt;&lt;br /&gt;
#include &amp;lt;QSizeF&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;plasma/svg.h&amp;gt;&lt;br /&gt;
#include &amp;lt;plasma/theme.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
PlasmaTutorial1::PlasmaTutorial1(QObject *parent, const QVariantList &amp;amp;args)&lt;br /&gt;
	: Plasma::Applet(parent, args),&lt;br /&gt;
	m_svg(this),&lt;br /&gt;
	m_icon(&amp;quot;document&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
	m_svg.setImagePath(&amp;quot;widgets/background&amp;quot;);&lt;br /&gt;
	// Establecerá el fondo por defecto del applet, gratis!&lt;br /&gt;
	setBackgroundHints(DefaultBackground);&lt;br /&gt;
	resize(400, 400);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PlasmaTutorial1::~PlasmaTutorial1()&lt;br /&gt;
{&lt;br /&gt;
	if (hasFailedToLaunch()) {&lt;br /&gt;
		// Hacer algo de limpieza aquí&lt;br /&gt;
	} else {&lt;br /&gt;
		// Guardar la configuracion&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void PlasmaTutorial1::init()&lt;br /&gt;
{&lt;br /&gt;
	// Una pequeña demostracion de la función setFailedToLaunch&lt;br /&gt;
	if (m_icon.isNull()) {&lt;br /&gt;
		setFailedToLaunch(true, &amp;quot;Sin mundo al que decir hola&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void PlasmaTutorial1::paintInterface(QPainter *p,&lt;br /&gt;
        const QStyleOptionGraphicsItem *option, const QRect &amp;amp;contentsRect)&lt;br /&gt;
{&lt;br /&gt;
	p-&amp;gt;setRenderHint(QPainter::SmoothPixmapTransform);&lt;br /&gt;
	p-&amp;gt;setRenderHint(QPainter::Antialiasing);&lt;br /&gt;
	&lt;br /&gt;
	// Ahora dibujamos el applet, empezando por nuestro svg&lt;br /&gt;
	m_svg.resize((int)contentsRect.width(), (int)contentsRect.height());&lt;br /&gt;
	m_svg.paint(p, (int)contentsRect.left(), (int)contentsRect.top());&lt;br /&gt;
	&lt;br /&gt;
	// Colocamos el icono y el texto&lt;br /&gt;
	p-&amp;gt;drawPixmap(7, 0, m_icon.pixmap((int)contentsRect.width(), (int)contentsRect.width() - 14));&lt;br /&gt;
	p-&amp;gt;save();&lt;br /&gt;
	p-&amp;gt;setPen(Qt::white);&lt;br /&gt;
	p-&amp;gt;drawText(contentsRect, Qt::AlignBottom | Qt::AlignHCenter, &amp;quot;Hola Plasmoid!&amp;quot;);&lt;br /&gt;
	p-&amp;gt;restore();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;plasma-tutorial1.moc&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Plasma/Svg ====&lt;br /&gt;
Como se puede ver en el código de ejemplo estamos usando el objeto {{class|Plasma::Svg}}, que tiene algunas cosas importantes a señalar.&lt;br /&gt;
&lt;br /&gt;
En primer lugar estamos usando una ruta relativa a '''widgets/background''' que obliga a {{class|Plasma::Svg}} a usar {{class|Plasma::Theme}} para localizar el archivo SVG. Si bien {{class|Plasma::Svg}} da soporte para cargar archivos pasandole una ruta absoluta, usa rutas relativas para el tema siempre que sea posible, ya que esto hace que Plasma soporte estilos y que los plasmoids individuales tengan el mismo aspecto, en vez de un grupo de aplicaciones sin relación alguna. Puedes ver una lista de los componentes de imagen disponibles en [[Projects/Plasma/Theme|temas de Plasma]].&lt;br /&gt;
&lt;br /&gt;
Por otro lado, {{class|Plasma::Svg}} se puede usar para dibujar un subconjunto del archivo SVG pasandole un elemento identificador que aparezca en el documento SVG. Un buen ejemplo es el archivo clock.svg que viene en el tema por defecto, verás que tiene un fondo, tres agujas (hora, minuto y segundo) y un primer plano. Esto es mucho mas agradable para los artistas esta metodologia comparado con editar 5 archivos por separado, ya que tendrian que imaginar los archivos svg unos encima de otros, y mucho mejor para el rendimiento ya que solo se renderiza un archivo y solo se hace una lectura de archivo del disco.&lt;br /&gt;
&lt;br /&gt;
==== setBackgroundHints(DefaultBackground) ====&lt;br /&gt;
Desde que dibujar el fondo es una función común, esta es mas rapida y fácil de hacer. Añadiendo &amp;lt;tt&amp;gt;setBackgroundHints(DefaultBackground)&amp;lt;/tt&amp;gt; al código, el fondo por defecto de Plasma se dibuja detras de tu plasmoid. No solo te ahorra tiempo y código, sino que crea una presentación mas consistente para el usurario.&lt;br /&gt;
&lt;br /&gt;
==== El método init() ====&lt;br /&gt;
En el constructor solo notificas a Plasma el fondo y el archivo de configuración (si existiese). También puedes establecer el tamaño inicial en el constructor. Despues de esto, Plasma se ocupará de cualquier cambio de tamaño y de que nunca tengas que preocuparte por él. En el método &amp;lt;tt&amp;gt;init()&amp;lt;/tt&amp;gt; inicializas todo lo que necesite ser inicializado, como leer los datos del archivo de configuración por ejemplo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== hasFailedToLaunch() ====&lt;br /&gt;
Si por alguna razón el applet fallara al iniciarlo (la biblioteca no pudo cargarse, necesario soporte hardware que no se ha encontrado, etc..) este método devolvería true. Usar esta función proporciona a tu aplicación la oportunidad de limpiar lo que sea necesario antes de cerrarse.&lt;br /&gt;
&lt;br /&gt;
==== setFailedToLaunch(bool, QString) ====&lt;br /&gt;
Cuando tu aplicación no esta en condiciones de iniciarse, esta función te permite informar a Plasma y dar un motivo del porque. Entonces Plasma lanzará una interfaz estándar de error para informar al usuario de la situación y en tu applet no se dibujará nada mas a partir de ese punto. Si tu plasmoid se convierte en algo mas complejo y depende de multiples factores, este método es la manera mas adecuada para limpiar lo que sea necesario.&lt;br /&gt;
&lt;br /&gt;
==== dataUpdated ====&lt;br /&gt;
Si quisieras conectar tu applet a cualquiera de los data-engines de plasma, deberías implementar una función de nombre dataUpdate en tu plasmoid. Se llama a esta función si el data-engine te envia datos, es decir, tu plasmoid debería recalcular su contenido.&lt;br /&gt;
&lt;br /&gt;
==== Determinar el tamaño y la geometría del applet: geometry() y contentsRect() ====&lt;br /&gt;
Si necesitas saber, en tu código, que tamaño y geometria que tiene el applet, puedes llamar a contentsRect() y a contentsRect().size().&lt;br /&gt;
Evita llamar a geometry() y size() porque en el cálculo no se tiene en cuenta el tamaño del margen establecido por el fondo por defecto del applet.&lt;br /&gt;
También evita usar números absolutos para situar los elementos en el applet, como QPoint(0, 0) para indicar el punto superior izquierdo de tu applet, en vez de esto usa contentsRect().topLeft().&lt;br /&gt;
&lt;br /&gt;
=== Construir el applet: CMakeLists.txt ===&lt;br /&gt;
Por último, para poner todo junto necesitas construirlo todo. Para decirle a cmake que necesita tenemos el archivo CMakeLists.txt &lt;br /&gt;
&lt;br /&gt;
Para mas detalles de CMake lee por favor [[Development/Tutorials/CMake]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
# El proyecto necesita un nombre&lt;br /&gt;
project(plasma-tutorial1)&lt;br /&gt;
 &lt;br /&gt;
# Encuentra las bibliotecas necesarias&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
find_package(Plasma REQUIRED)&lt;br /&gt;
 &lt;br /&gt;
add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})&lt;br /&gt;
include_directories(&lt;br /&gt;
   ${CMAKE_SOURCE_DIR}&lt;br /&gt;
   ${CMAKE_BINARY_DIR}&lt;br /&gt;
   ${KDE4_INCLUDES}&lt;br /&gt;
   )&lt;br /&gt;
 &lt;br /&gt;
# Añadimos nuestro código fuente aqui&lt;br /&gt;
set(tutorial1_SRCS plasma-tutorial1.cpp)&lt;br /&gt;
 &lt;br /&gt;
# Ahora nos aseguramos de poner todos los archivos en su lugar&lt;br /&gt;
kde4_add_plugin(plasma_applet_tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(plasma_applet_tutorial1 &lt;br /&gt;
                      ${PLASMA_LIBS} ${KDE4_KDEUI_LIBS})&lt;br /&gt;
 &lt;br /&gt;
install(TARGETS plasma_applet_tutorial1&lt;br /&gt;
        DESTINATION ${PLUGIN_INSTALL_DIR})&lt;br /&gt;
 &lt;br /&gt;
install(FILES plasma-applet-tutorial1.desktop&lt;br /&gt;
        DESTINATION ${SERVICES_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testeando el Applet ==&lt;br /&gt;
Si tu actual entorno de desarrollo difiere de la instalacion de KDE4, tienes que ejecutar cmake con -DCMAKE_INSTALL_PREFIX=/usr/lib/kde4/ (reemplazar por tu $KDEDIR). Luego ejecuta make. Si todo fue bien, puedes instalar el applet ejecutando ''sudo make install'' o:&lt;br /&gt;
* cp ./lib/plasma_applet_tutorial1.so $KDEDIR/lib &lt;br /&gt;
* cp ./plasma-applet-tutorial1.desktop $KDEDIR/share/kde4/services/&lt;br /&gt;
&lt;br /&gt;
y ejecuta kbuildsycoca4 (hará que todas las aplicacionesde KDE se enteren de los nuevos arvhivos desktop).&lt;br /&gt;
Para testear tu Applet puedes usar el programa ''plasmoidviewer'':&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
plasmoidviewer nombre_applet&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Incluso puedes ver el applet en un pequeño escritorio mediante:&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
plasmoidviewer -c escritorio nombre_applet&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Donde ''nombre_applet'' es el valor especificado en el campo '''X-KDE-PluginsInfo-Name''' del archivo .desktop.&lt;br /&gt;
&lt;br /&gt;
También puedes reiniciar plasma, así el Applet se mostrará en el navegador de Applets:&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
kbuildsycoca4&lt;br /&gt;
kquitapp plasma&lt;br /&gt;
plasma &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si esto no funciona tendras que reiniciar tu sesión KDE.&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)</id>
		<title>Development/Tutorials/Saving and loading (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)"/>
				<updated>2008-12-23T01:07:02Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Cargar y guardar archivos|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions_(es)|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;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos una interfaz básica del editor de textos, es hora de añadirle funcionalidad. Básicamente, un editor de textos  debe abrir archivos desde disco, guardar archivos que has creado/editado y crear nuevos archivos.&lt;br /&gt;
&lt;br /&gt;
KDE proporciona algunas clases para trabajar con archivos que hacen la vida mucho mas fácil a los desarrolladores. La biblioteca KIO te permite fácilmente tener acceso a archivos a través de protocolos de red transparentes, así como mediante cuadros de dialogo estándar.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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) 2008 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; no ha cambiado desde el tutorial 3, excepto el cambio de cualquier referencia de tutorial 3 a 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 //nuevo respecto al 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; //nuevo&lt;br /&gt;
&lt;br /&gt;
	private slots: //nuevo&lt;br /&gt;
		void newFile(); //nuevo&lt;br /&gt;
		void openFile(); //nuevo&lt;br /&gt;
		void saveFile(); //nuevo&lt;br /&gt;
		void saveFileAs(); //nuevo&lt;br /&gt;
		void saveFileAs(const QString &amp;amp;outputFileName); //nuevo &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Como queremos añadir la posibilidad de cargar y guardar archivos, debemos añadir las funciones que realizarán el trabajo. Ya que invocaremos a las funciones mediante el mecanismo de Qt [http://doc.trolltech.com/latest/signalsandslots.html signal/slot], debemos especificar que dichas funciones son slots, por lo que lo hacemos en la linea 19. Como estamos usando slots en el archivo cabecera, debemos también añadir la macro [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
También queremos llevar un registro del nombre del archivo abierto actual, por lo que declaramos &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; //nuevo&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //nuevo&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
	: KXmlGuiWindow(parent),&lt;br /&gt;
		fileName(QString()) //nuevo&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;Limpiar&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;limpiar&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()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Nuevo de aqui en adelante&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().toUtf8());&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, 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, 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;limpiar&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;limpiar&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;
Es idéntico a &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; del tutorial 3 excepto &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;, que ha cambiado a 'tutorial4'. No necesitamos añadir ninguna información de las &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; ya que la posición de esas acciones las maneja KDE automaticamente.&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bien, ahora vamos a implementar el código que realizará el trabajo de cargar y guardar. Esto se lleva a cabo en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo primero que hacemos es añadir&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;
al constructor de &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; en la linea 16. Esto asegura que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; esté vacio desde el principio.&lt;br /&gt;
&lt;br /&gt;
===Añadir las acciones===&lt;br /&gt;
&lt;br /&gt;
La primera cosa que vamos a hacer es proporcionar al usuario la interfaz para decirle a la aplicación que cargue o guarde un archivo. Como ya hicimos con la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; en el tutorial 3, usaremos &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. En las lineas 37-47 añadimos las acciones de la misma manera que la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt;. Para cada una de ellas, la conectamos que el slot apropiado que hemos declarado en el archivo cabecera.&lt;br /&gt;
&lt;br /&gt;
===Crear un nuevo documento===&lt;br /&gt;
&lt;br /&gt;
La primera función que hemos definido es &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt;.&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;
Con &amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; ponemos la QString como &amp;quot;vacia&amp;quot; para reflejar el hecho de que el documento aún no está presente en disco. A continuación, &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; limpia el area de texto usando la misma función que conectaba con la &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; en el tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Guardar un archivo===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a escribir nuestro primer código que maneje archivos. Vamos a implementar una función que guardará el contenido del área de texto en un archivo con un nombre pasado como parámetro. KDE proporciona una clase llamada {{class|KSaveFile}} para guardar archivos de manera segura, que hereda de la clase de Qt {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
El prototipo de la función es:&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;
A continuación creamos nuestro objeto &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; y lo abrimos con:&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;
Ahora que tenemos nuestro &amp;quot;file&amp;quot; para escribir, necesitamos convertir el texto del area de texto a un formato que pueda ser escrito en el archivo. Para hacer esto, creamos un {{qt|QByteArray}} y lo rellenamos con la versión en texto plano de lo que haya en el area de texto:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Ahora que tenemos nuestro &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, lo usamos para escribir el archivo con &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. Si estuvieramos usando un &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, los cambios se reflejarían inmediatamente. Sin embargo, si se ha producido un problema parcial en la escritura, el archivo podría estar corrupto. Por esta razón, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; escribe primero en un archivo temporal y luego, en la llamada &amp;lt;tt&amp;gt;KSaveFile::Finalize&amp;lt;/tt&amp;gt;, refleja los cambios en el archivo actual.&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;
Por último, establecemos que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; apunte al nombre del archivo que acabamos de guardar.&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;
Esta es la función a la que está conectado el slot &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt;. Simplemente llama a la función genérica &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; pasandole el nombre del fichero devuelto por &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;
Este es nuestro primer uso de la biblioteca KIO. La clase {{class|KFileDialog}} proporciona diferentes funciones estáticas para mostrar cuadros de dialgo estandar, usados en todas las aplicaciones de KDE. La llamada a &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; mostrará un diálogo donde el usuario puede seleccionar en nombre del archivo a guardar o elegir un nuevo nombre. La función devuelve el nombre del archivo, con el cual luego llamamos a &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;
No hay nada destacable o nuevo en esta función, solamente la lógica para decidir si se muestra el dialogo para guardar el archivo. Si &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; no está vacio, el archivo es guardado como &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. Si lo está, se muestra el diálogo para permitir al usuario elegir el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===Cargar un archivo===&lt;br /&gt;
&lt;br /&gt;
Por último, el tutorial 4 debe ser capaz de cargar archivos desde disco. El código para llevarlo a cabo se encuentra en la función &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Primero debemos preguntar al usuario por en nombre del archivo que desea abrir. Esto lo hacemos usando otra de las funciones de &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt;, &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;
Luego usamos la biblioteca KIO para recuperar nuestro archivo. Esto nos permite abrir el archivo con QFile incluso si está almacenado en una ubicación remota, como un sitio FTP. Hacemos la siguiente llamada a la función &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; de la clase {{class|NetAccess}}:&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;
El primer argumento es el nombre del archivo que queremos descargar. El segundo es un QString el cual, una vez se haya completado la descarga, contendrá la localización de la copia temporal del archivo. Es con &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; con quien trabajaremos a partir de ahora.&lt;br /&gt;
&lt;br /&gt;
La función devuelve &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; dependiendo si la transferencia tuvo exito. Si falló, mostraremos un mensaje informando del 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;
En caso contrario, continuamos con la apertura del archivo.&lt;br /&gt;
&lt;br /&gt;
Creamos un QFile pasando a su constructor el archivo temporal creado por &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; y lo abrirmos en modo de solo lectura:&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;
Para mostrar el contenido del archivo debemos usar un {{qt|QTextStream}}. Creamos uno pasandole el contenido de nuestro archivo a su constructor, y llamamos a la función de QFile &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; para obtener el texto del archivo. Luego este texto se le pasa a la función &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; de nuestra área de texto.&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;
A continuación almacenamos la ruta de acceso del archivo que acabamos de abrir:&lt;br /&gt;
&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;
y por último, eliminamos el archivo temporal que fué creado por &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, instalar  y ejecutar==&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;
Como ahora estamos usando la biblioteca KIO, debemos decirselo a CMAKE para que la enlace. Hacemos esto pasándole &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; a la función &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con este archivo, puede construirse y ejecutar el tutorial de la misma forma que el tutorial 3. Para mas información, ve al 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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/KCmdLineArgs|Tutorial 5 - KCmdLineArgs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-12-23T01:01:32Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)</id>
		<title>Development/Tutorials/Saving and loading (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)"/>
				<updated>2008-12-23T01:01:14Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: Minor fixes in translation&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Cargar y guardar archivos|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions_(es)|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;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos una interfaz básica del editor de textos, es hora de añadirle funcionalidad. Básicamente, un editor de textos  debe abrir archivos desde disco, guardar archivos que has creado/editado y crear nuevos archivos.&lt;br /&gt;
&lt;br /&gt;
KDE proporciona algunas clases para trabajar con archivos que hacen la vida mucho mas fácil a los desarrolladores. La biblioteca KIO te permite fácilmente tener acceso a archivos a través de protocolos de red transparentes, así como mediante cuadros de dialogo estándar.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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) 2008 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; no ha cambiado desde el tutorial 3, excepto el cambio de cualquier referencia de tutorial 3 a 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 //nuevo respecto al 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; //nuevo&lt;br /&gt;
&lt;br /&gt;
	private slots: //nuevo&lt;br /&gt;
		void newFile(); //nuevo&lt;br /&gt;
		void openFile(); //nuevo&lt;br /&gt;
		void saveFile(); //nuevo&lt;br /&gt;
		void saveFileAs(); //nuevo&lt;br /&gt;
		void saveFileAs(const QString &amp;amp;outputFileName); //nuevo &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Como queremos añadir la posibilidad de cargar y guardar archivos, debemos añadir las funciones que realizarán el trabajo. Ya que invocaremos a las funciones mediante el mecanismo de Qt [http://doc.trolltech.com/latest/signalsandslots.html signal/slot], debemos especificar que dichas funciones son slots, por lo que lo hacemos en la linea 19. Como estamos usando slots en el archivo cabecera, debemos también añadir la macro [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
También queremos llevar un registro del nombre del archivo abierto actual, por lo que declaramos &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; //nuevo&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //nuevo&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
	: KXmlGuiWindow(parent),&lt;br /&gt;
		fileName(QString()) //nuevo&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;Limpiar&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;limpiar&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()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Nuevo de aqui en adelante&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().toUtf8());&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, 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, 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;limpiar&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;limpiar&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;
Es idéntico a &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; del tutorial 3 excepto &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;, que ha cambiado a 'tutorial4'. No necesitamos añadir ninguna información de las &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; ya que la posición de esas acciones las maneja KDE automaticamente.&lt;br /&gt;
&lt;br /&gt;
==Explicaciónn==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bien, ahora vamos a implementar el código que realizará el trabajo de cargar y guardar. Esto se lleva a cabo en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo primero que hacemos es añadir&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;
al constructor de &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; en la linea 16. Esto asegura que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; esté vacio desde el principio.&lt;br /&gt;
&lt;br /&gt;
===Añadir las acciones===&lt;br /&gt;
&lt;br /&gt;
La primera cosa que vamos a hacer es proporcionar al usuario la interfaz para decirle a la aplicación que cargue o guarde un archivo. Como ya hicimos con la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; en el tutorial 3, usaremos &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. En las lineas 37-47 añadimos las acciones de la misma manera que la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt;. Para cada una de ellas, la conectamos que el slot apropiado que hemos declarado en el archivo cabecera.&lt;br /&gt;
&lt;br /&gt;
===Crear un nuevo documento===&lt;br /&gt;
&lt;br /&gt;
La primera función que hemos definido es &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt;.&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;
Con &amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; ponemos la QString como &amp;quot;vacia&amp;quot; para reflejar el hecho de que el documento aún no está presente en disco. A continuación, &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; limpia el area de texto usando la misma función que conectaba con la &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; en el tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Guardar un archivo===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a escribir nuestro primer código que maneje archivos. Vamos a implementar una función que guardará el contenido del área de texto en un archivo con un nombre pasado como parámetro. KDE proporciona una clase llamada {{class|KSaveFile}} para guardar archivos de manera segura, que hereda de la clase de Qt {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
El prototipo de la función es:&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;
A continuación creamos nuestro objeto &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; y lo abrimos con:&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;
Ahora que tenemos nuestro &amp;quot;file&amp;quot; para escribir, necesitamos convertir el texto del area de texto a un formato que pueda ser escrito en el archivo. Para hacer esto, creamos un {{qt|QByteArray}} y lo rellenamos con la versión en texto plano de lo que haya en el area de texto:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Ahora que tenemos nuestro &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, lo usamos para escribir el archivo con &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. Si estuvieramos usando un &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, los cambios se reflejarían inmediatamente. Sin embargo, si se ha producido un problema parcial en la escritura, el archivo podría estar corrupto. Por esta razón, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; escribe primero en un archivo temporal y luego, en la llamada &amp;lt;tt&amp;gt;KSaveFile::Finalize&amp;lt;/tt&amp;gt;, refleja los cambios en el archivo actual.&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;
Por último, establecemos que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; apunte al nombre del archivo que acabamos de guardar.&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;
Esta es la función a la que está conectado el slot &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt;. Simplemente llama a la función genérica &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; pasandole el nombre del fichero devuelto por &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;
Este es nuestro primer uso de la biblioteca KIO. La clase {{class|KFileDialog}} proporciona diferentes funciones estáticas para mostrar cuadros de dialgo estandar, usados en todas las aplicaciones de KDE. La llamada a &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; mostrará un diálogo donde el usuario puede seleccionar en nombre del archivo a guardar o elegir un nuevo nombre. La función devuelve el nombre del archivo, con el cual luego llamamos a &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;
No hay nada destacable o nuevo en esta función, solamente la lógica para decidir si se muestra el dialogo para guardar el archivo. Si &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; no está vacio, el archivo es guardado como &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. Si lo está, se muestra el diálogo para permitir al usuario elegir el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===Loading a file===&lt;br /&gt;
&lt;br /&gt;
Por último, el tutorial 4 debe ser capaz de cargar archivos desde disco. El código para llevarlo a cabo se encuentra en la función &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Primero debemos preguntar al usuario por en nombre del archivo que desea abrir. Esto lo hacemos usando otra de las funciones de &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt;, &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;
Luego usamos la biblioteca KIO para recuperar nuestro archivo. Esto nos permite abrir el archivo con QFile incluso si está almacenado en una ubicación remota, como un sitio FTP. Hacemos la siguiente llamada a la función &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; de la clase {{class|NetAccess}}:&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;
El primer argumento es el nombre del archivo que queremos descargar. El segundo es un QString el cual, una vez se haya completado la descarga, contendrá la localización de la copia temporal del archivo. Es con &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; con quien trabajaremos a partir de ahora.&lt;br /&gt;
&lt;br /&gt;
La función devuelve &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; dependiendo si la transferencia tuvo exito. Si falló, mostraremos un mensaje informando del 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;
En caso contrario, continuamos con la apertura del archivo.&lt;br /&gt;
&lt;br /&gt;
Creamos un QFile pasando a su constructor el archivo temporal creado por &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; y lo abrirmos en modo de solo lectura:&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;
Para mostrar el contenido del archivo debemos usar un {{qt|QTextStream}}. Creamos uno pasandole el contenido de nuestro archivo a su constructor, y llamamos a la función de QFile &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; para obtener el texto del archivo. Luego este texto se le pasa a la función &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; de nuestra área de texto.&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;
A continuación almacenamos la ruta de acceso del archivo que acabamos de abrir:&lt;br /&gt;
&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;
y por último, eliminamos el archivo temporal que fué creado por &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, instalar  y ejecutar==&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;
Como ahora estamos usando la biblioteca KIO, debemos decirselo a CMAKE para que la enlace. Hacemos esto pasándole &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; a la función &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con este archivo, puede construirse y ejecutar el tutorial de la misma forma que el tutorial 3. Para mas información, ve al 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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/KCmdLineArgs|Tutorial 5 - KCmdLineArgs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2008-12-23T01:00:25Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: link to tutorial 4 in spanish&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]], Conocimiento básico de XML|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading_(es)|Tutorial 4 - Guardar y Abrir]]| &lt;br /&gt;
&lt;br /&gt;
reading=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial introduce el concepto de las acciones. Las acciones son una forma unificada de proporcionar al usuario la forma de interactuar con tu programa.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si queremos permitir que el usuario del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]] pueda borrar la caja de texto pulsando un botón de la barra de herramientas, desde una entrada del menú File o a través de un atajo de teclado, podremos realizarlo mediante un {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3_(es).png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
Un {{class|KAction}} es un objeto que contiene toda la información sobre el icono y el atajo de teclado asociado a una determinada acción. La acción se conecta a un [http://doc.trolltech.com/latest/signalsandslots.html slot], que lleva a cabo el trabajo de la acción.&lt;br /&gt;
&lt;br /&gt;
== El código ==&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;Area de texto usando KAction.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2008 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;
Pocas cosas han cambiado en &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, solo se ha actualizado la declaración de KAboutData para indicar que ahora estamos en el 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;
Sólo se ha añadido la función &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt;, que realizará el trabajo de configurar los 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;Limpiar&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;limpiar&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;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
El archivo está basado en el código de KXmlGuiWindow del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]]. La mayoría de los cambios están en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, un cambio estructural importante es que el constructor de MainWindow ahora llama a &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; en vez de a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. En &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; va el nuevo código de KAction antes de llamar a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Creando el objeto KAction===&lt;br /&gt;
KAction se construye en varios pasos. El primero es incluir la biblioteca &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; y crear el 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;
Crear un KAction nuevo llamado &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&lt;br /&gt;
Ahora que tenemos nuestro objeto KAction, podemos empezar a establecer sus propiedades. El siguiente código establece el texto que se mostrará en el menú y el de debajo del icono del &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; en la barra de herramientas:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Limpiar&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Ten en cuenta que el texto se pasa a través de la función i18n(), esto es necesario para para que la UI pueda ser traducida (puedes encontrar mas información en el [[Development/Tutorials/Localization/i18n|tutorial de i18n]]).&lt;br /&gt;
&lt;br /&gt;
====Icono====&lt;br /&gt;
Si la acción va a mostrarse en el la barra de herramientas, estaría bien que tuviera un icono que la representara. El siguiente código establece como icono el icono estándar de KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; mediante el uso de la función &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt;:&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;
====Atajo de teclado====&lt;br /&gt;
Establecer un atajo de teclado para lanzar nuestra acción es igual de 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;
Asocia Ctrl+W a la acción.&lt;br /&gt;
&lt;br /&gt;
===Añadir a la colección===&lt;br /&gt;
Para que la acción sea accesible por el framework XMLGUI (explicado en profundidad mas adelante) debe añadirse a la ''colección de acciones'' de la aplicación. La colección de acciones es accesible mediante la función &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;limpiar&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Con esta llamada, la KAction &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; se añade a la colección y toma el nombre de ''limpiar''. Este nombre (''limpiar'') lo usa el framework XMLGUI para referirse a la acción.&lt;br /&gt;
&lt;br /&gt;
====Conectando la acción====&lt;br /&gt;
Ahora que hemos establecido la acción, es necesario conectarla a algo útil. En este caso (porque queremos limpiar el área de texto), conectamos nuestra acción con la acción &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; perteneciente a KTextEdit (que como era de esperar, limpia 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;
Es lo mismo que se llevaría a cabo en Qt con una {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
Para las acciones que normalmente aparecen en casi todas las aplicaciones KDE, como 'quit', 'save', y 'load', existen unas acciones ya creadas, accesibles a través de [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].&lt;br /&gt;
&lt;br /&gt;
Son muy sencillas de usar. Una vez que has incluido las bibliotecas (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simplemente añadelas con la función que quieras que realicen. Por ejemplo:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
Crea una KAction con el icono correcto, el texto y el atajo de teclado, e incluso la añade al menú File.&lt;br /&gt;
&lt;br /&gt;
==Añadir la acción a los menús y a las barras de herramientas==&lt;br /&gt;
Por el momento, hemos creado la nueva acción &amp;quot;Limpiar&amp;quot; pero no se ha asociado a ningún menú o barra de herramientas. Esto lo podemos hacer con una tecnología de KDE llamada XMLGUI, que hace cosas majas como barras de herramientas móviles.&lt;br /&gt;
&lt;br /&gt;
{{note|En una versión posterior de KDE4, XMLGUI puede ser reemplazada por un nuevo framework llamado liveui. Por ahora, XMLGUI es la única manera correcta de configurar la UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
La función &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; de la clase {{class|KXmlGuiWindow}} depende del sistema XMLGUI para construir la GUI, el cual la realiza analizando el archivo de descripción XML de la interfaz.&lt;br /&gt;
&lt;br /&gt;
La regla para establecer el nombre del archivo XML es &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, donde &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; es el nombre que estableces en {{class|KAboutData}} (en este caso, ''tutorial 3''). Por lo que en nuestro ejemplo, llamamos al archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, y está localizado en el directorio del código. Cmake maneja donde será puesto el archivo en última instancia. &lt;br /&gt;
&lt;br /&gt;
==Archivo ''appname''ui.rc==&lt;br /&gt;
Como la descripción de la UI está definida en el archivo XML, el layout debe seguir unas reglas estrictas. Este tutorial no profundizará en exceso en este aspecto, pero para mas información puedes echar un vistazo a la [[Development/Architecture/KDE4/XMLGUI_Technology|página de XMLGUI]] (aquí tienes un tutorial antiguo: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html])&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;limpiar&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;limpiar&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;
La etiqueta &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; permite describir la barra de herramientas, que normalmente es la barra con los iconos de la parte superior de la ventana. Se le da el nombre único de ''mainToolBar'', y usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt;, es visible a los usuarios con el nombre ''Main Toolbar''. La acción limpiae se añade a la barra de herramientas usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt;,  el nombre del parámetro en esta etiqueta es la cadena que pasamos a KActionCollection con &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de tener la acción en la barra de herramientas, también se puede añadir a la barra de menú. Aquí la acción se ha añadido al menú ''File'' de &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; de la misma manera que la añadimos a la barra de herramientas.&lt;br /&gt;
&lt;br /&gt;
Cambia el atributo 'version' de la etiqueta &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; si cambiaste el archivo .rc desde la última instalación, para forzar una actualización de la cache del sistema.&lt;br /&gt;
&lt;br /&gt;
Algunas notas sobre la interacción entre el código y el archivo .rc: Los menús aparecen automáticamente y deberían tener una etiqueta hija &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; a menos que se refieran a los menús estándar. Las acciones deberán crearse manualmente y se insertarán mediante actionCollection() usando el nombre del archivo .rc. Las acciones pueden ocultarse o desactivarse, mientras que los menús no.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Por último, el &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; hay que ubicarlo en algún lugar donde KDE pueda encontrarlo (no lo puedes dejar en el directorio de las fuentes!). '''Esto significa que el proyecto tiene que ser instalado en algún sitio'''.&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;
Este archivo es casi idéntico al del tutorial2, peor con dos lineas extra al final que describen donde se instalará los archivos. En primer lugar, el objetivo &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; se instala en &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt;, entonces el archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; que describe el layout de la interfaz de usuario se instala en el directorio de datos de las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
===Make, instalar y ejecutar===&lt;br /&gt;
Si no tienes acceso de escritura a tu directorio de instalación de KDE4, puedes instalarlo en una carpeta de tu directorio personal.&lt;br /&gt;
&lt;br /&gt;
Para decirle a CMake donde instalar el programa, establece la variable &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt;. Probablemente quieras instalarlo en algún sitio local para testearlo (probablemente sea un poco tonto hacer el esfuerzo de instalar estos tutoriales en el directorio de KDE), por lo que podría ser el siguiente caso:&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;
Creará una estructura de directorios como la de KDE en tu directorio de usuario e instalara el ejecutable en {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Saving_and_loading_(es)|Tutorial 4 - Guardar y Abrir]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2008-12-23T00:59:58Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: link to tutorial 4 in spanish&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]], Conocimiento básico de XML|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Guardar y Abrir]]| &lt;br /&gt;
&lt;br /&gt;
reading=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial introduce el concepto de las acciones. Las acciones son una forma unificada de proporcionar al usuario la forma de interactuar con tu programa.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si queremos permitir que el usuario del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]] pueda borrar la caja de texto pulsando un botón de la barra de herramientas, desde una entrada del menú File o a través de un atajo de teclado, podremos realizarlo mediante un {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3_(es).png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
Un {{class|KAction}} es un objeto que contiene toda la información sobre el icono y el atajo de teclado asociado a una determinada acción. La acción se conecta a un [http://doc.trolltech.com/latest/signalsandslots.html slot], que lleva a cabo el trabajo de la acción.&lt;br /&gt;
&lt;br /&gt;
== El código ==&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;Area de texto usando KAction.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2008 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;
Pocas cosas han cambiado en &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, solo se ha actualizado la declaración de KAboutData para indicar que ahora estamos en el 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;
Sólo se ha añadido la función &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt;, que realizará el trabajo de configurar los 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;Limpiar&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;limpiar&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;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
El archivo está basado en el código de KXmlGuiWindow del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]]. La mayoría de los cambios están en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, un cambio estructural importante es que el constructor de MainWindow ahora llama a &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; en vez de a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. En &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; va el nuevo código de KAction antes de llamar a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Creando el objeto KAction===&lt;br /&gt;
KAction se construye en varios pasos. El primero es incluir la biblioteca &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; y crear el 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;
Crear un KAction nuevo llamado &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&lt;br /&gt;
Ahora que tenemos nuestro objeto KAction, podemos empezar a establecer sus propiedades. El siguiente código establece el texto que se mostrará en el menú y el de debajo del icono del &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; en la barra de herramientas:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Limpiar&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Ten en cuenta que el texto se pasa a través de la función i18n(), esto es necesario para para que la UI pueda ser traducida (puedes encontrar mas información en el [[Development/Tutorials/Localization/i18n|tutorial de i18n]]).&lt;br /&gt;
&lt;br /&gt;
====Icono====&lt;br /&gt;
Si la acción va a mostrarse en el la barra de herramientas, estaría bien que tuviera un icono que la representara. El siguiente código establece como icono el icono estándar de KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; mediante el uso de la función &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt;:&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;
====Atajo de teclado====&lt;br /&gt;
Establecer un atajo de teclado para lanzar nuestra acción es igual de 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;
Asocia Ctrl+W a la acción.&lt;br /&gt;
&lt;br /&gt;
===Añadir a la colección===&lt;br /&gt;
Para que la acción sea accesible por el framework XMLGUI (explicado en profundidad mas adelante) debe añadirse a la ''colección de acciones'' de la aplicación. La colección de acciones es accesible mediante la función &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;limpiar&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Con esta llamada, la KAction &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; se añade a la colección y toma el nombre de ''limpiar''. Este nombre (''limpiar'') lo usa el framework XMLGUI para referirse a la acción.&lt;br /&gt;
&lt;br /&gt;
====Conectando la acción====&lt;br /&gt;
Ahora que hemos establecido la acción, es necesario conectarla a algo útil. En este caso (porque queremos limpiar el área de texto), conectamos nuestra acción con la acción &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; perteneciente a KTextEdit (que como era de esperar, limpia 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;
Es lo mismo que se llevaría a cabo en Qt con una {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
Para las acciones que normalmente aparecen en casi todas las aplicaciones KDE, como 'quit', 'save', y 'load', existen unas acciones ya creadas, accesibles a través de [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].&lt;br /&gt;
&lt;br /&gt;
Son muy sencillas de usar. Una vez que has incluido las bibliotecas (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simplemente añadelas con la función que quieras que realicen. Por ejemplo:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
Crea una KAction con el icono correcto, el texto y el atajo de teclado, e incluso la añade al menú File.&lt;br /&gt;
&lt;br /&gt;
==Añadir la acción a los menús y a las barras de herramientas==&lt;br /&gt;
Por el momento, hemos creado la nueva acción &amp;quot;Limpiar&amp;quot; pero no se ha asociado a ningún menú o barra de herramientas. Esto lo podemos hacer con una tecnología de KDE llamada XMLGUI, que hace cosas majas como barras de herramientas móviles.&lt;br /&gt;
&lt;br /&gt;
{{note|En una versión posterior de KDE4, XMLGUI puede ser reemplazada por un nuevo framework llamado liveui. Por ahora, XMLGUI es la única manera correcta de configurar la UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
La función &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; de la clase {{class|KXmlGuiWindow}} depende del sistema XMLGUI para construir la GUI, el cual la realiza analizando el archivo de descripción XML de la interfaz.&lt;br /&gt;
&lt;br /&gt;
La regla para establecer el nombre del archivo XML es &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, donde &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; es el nombre que estableces en {{class|KAboutData}} (en este caso, ''tutorial 3''). Por lo que en nuestro ejemplo, llamamos al archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, y está localizado en el directorio del código. Cmake maneja donde será puesto el archivo en última instancia. &lt;br /&gt;
&lt;br /&gt;
==Archivo ''appname''ui.rc==&lt;br /&gt;
Como la descripción de la UI está definida en el archivo XML, el layout debe seguir unas reglas estrictas. Este tutorial no profundizará en exceso en este aspecto, pero para mas información puedes echar un vistazo a la [[Development/Architecture/KDE4/XMLGUI_Technology|página de XMLGUI]] (aquí tienes un tutorial antiguo: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html])&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;limpiar&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;limpiar&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;
La etiqueta &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; permite describir la barra de herramientas, que normalmente es la barra con los iconos de la parte superior de la ventana. Se le da el nombre único de ''mainToolBar'', y usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt;, es visible a los usuarios con el nombre ''Main Toolbar''. La acción limpiae se añade a la barra de herramientas usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt;,  el nombre del parámetro en esta etiqueta es la cadena que pasamos a KActionCollection con &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de tener la acción en la barra de herramientas, también se puede añadir a la barra de menú. Aquí la acción se ha añadido al menú ''File'' de &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; de la misma manera que la añadimos a la barra de herramientas.&lt;br /&gt;
&lt;br /&gt;
Cambia el atributo 'version' de la etiqueta &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; si cambiaste el archivo .rc desde la última instalación, para forzar una actualización de la cache del sistema.&lt;br /&gt;
&lt;br /&gt;
Algunas notas sobre la interacción entre el código y el archivo .rc: Los menús aparecen automáticamente y deberían tener una etiqueta hija &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; a menos que se refieran a los menús estándar. Las acciones deberán crearse manualmente y se insertarán mediante actionCollection() usando el nombre del archivo .rc. Las acciones pueden ocultarse o desactivarse, mientras que los menús no.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Por último, el &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; hay que ubicarlo en algún lugar donde KDE pueda encontrarlo (no lo puedes dejar en el directorio de las fuentes!). '''Esto significa que el proyecto tiene que ser instalado en algún sitio'''.&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;
Este archivo es casi idéntico al del tutorial2, peor con dos lineas extra al final que describen donde se instalará los archivos. En primer lugar, el objetivo &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; se instala en &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt;, entonces el archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; que describe el layout de la interfaz de usuario se instala en el directorio de datos de las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
===Make, instalar y ejecutar===&lt;br /&gt;
Si no tienes acceso de escritura a tu directorio de instalación de KDE4, puedes instalarlo en una carpeta de tu directorio personal.&lt;br /&gt;
&lt;br /&gt;
Para decirle a CMake donde instalar el programa, establece la variable &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt;. Probablemente quieras instalarlo en algún sitio local para testearlo (probablemente sea un poco tonto hacer el esfuerzo de instalar estos tutoriales en el directorio de KDE), por lo que podría ser el siguiente caso:&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;
Creará una estructura de directorios como la de KDE en tu directorio de usuario e instalara el ejecutable en {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Saving_and_loading_(es)|Tutorial 4 - Guardar y Abrir]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)</id>
		<title>Development/Tutorials/Saving and loading (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Saving_and_loading_(es)"/>
				<updated>2008-12-23T00:59:07Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Cargar y guardar archivos|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KActions_(es)|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;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos una interfaz básica del editor de textos, es hora de añadirle funcionalidad. Básicamente, un editor de textos  debe abrir archivos desde disco, guardar archivos que has creado/editado y crear nuevos archivos.&lt;br /&gt;
&lt;br /&gt;
KDE proporciona algunas clases para trabajar con archivos que hacen la vida mucho mas fácil a los desarrolladores. La biblioteca KIO te permite fácilmente tener acceso a archivos a través de protocolos de red transparentes, así como mediante cuadros de dialogo estándar.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial4_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== El código ==&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) 2008 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; no ha cambiado desde el tutorial 3, excepto el cambio de cualquier referencia de tutorial 3 a 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 //nuevo respecto al 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; //nuevo&lt;br /&gt;
&lt;br /&gt;
	private slots: //nuevo&lt;br /&gt;
		void newFile(); //nuevo&lt;br /&gt;
		void openFile(); //nuevo&lt;br /&gt;
		void saveFile(); //nuevo&lt;br /&gt;
		void saveFileAs(); //nuevo&lt;br /&gt;
		void saveFileAs(const QString &amp;amp;outputFileName); //nuevo &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Como queremos añadir la posibilidad de cargar y guardar archivos, debemos añadir las funciones que realizarán el trabajo. Ya que invocaremos a las funciones mediante el mecanismo de Qt [http://doc.trolltech.com/latest/signalsandslots.html signal/slot], debemos especificar que dichas funciones son slots, por lo que lo hacemos en la linea 19. Como estamos usando slots en el archivo cabecera, debemos también añadir la macro [http://doc.trolltech.com/latest/qobject.html#Q_OBJECT &amp;lt;tt&amp;gt;Q_OBJECT&amp;lt;/tt&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
También queremos llevar un registro del nombre del archivo abierto actual, por lo que declaramos &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; //nuevo&lt;br /&gt;
#include &amp;lt;KMessageBox&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KIO/NetAccess&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;KSaveFile&amp;gt; //nuevo&lt;br /&gt;
#include &amp;lt;QTextStream&amp;gt; //nuevo&lt;br /&gt;
 &lt;br /&gt;
MainWindow::MainWindow(QWidget *parent)&lt;br /&gt;
	: KXmlGuiWindow(parent),&lt;br /&gt;
		fileName(QString()) //nuevo&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;Limpiar&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;limpiar&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()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::save(this, SLOT(saveFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::saveAs(this, SLOT(saveFileAs()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	KStandardAction::openNew(this, SLOT(newFile()),&lt;br /&gt;
						actionCollection()); //nuevo&lt;br /&gt;
&lt;br /&gt;
	setupGUI();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Nuevo de aqui en adelante&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().toUtf8());&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, 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, 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;limpiar&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;limpiar&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;
Es idéntico a &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; del tutorial 3 excepto &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;, que ha cambiado a 'tutorial4'. No necesitamos añadir ninguna información de las &amp;lt;tt&amp;gt;KStandardAction&amp;lt;/tt&amp;gt; ya que la posición de esas acciones las maneja KDE automaticamente.&lt;br /&gt;
&lt;br /&gt;
==Explicaciónn==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bien, ahora vamos a implementar el código que realizará el trabajo de cargar y guardar. Esto se lleva a cabo en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo primero que hacemos es añadir&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;
al constructor de &amp;lt;tt&amp;gt;MainWindow&amp;lt;/tt&amp;gt; en la linea 16. Esto asegura que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; esté vacio desde el principio.&lt;br /&gt;
&lt;br /&gt;
===Añadir las acciones===&lt;br /&gt;
&lt;br /&gt;
La primera cosa que vamos a hacer es proporcionar al usuario la interfaz para decirle a la aplicación que cargue o guarde un archivo. Como ya hicimos con la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt; en el tutorial 3, usaremos &amp;lt;tt&amp;gt;KStandardActions&amp;lt;/tt&amp;gt;. En las lineas 37-47 añadimos las acciones de la misma manera que la acción &amp;lt;tt&amp;gt;quit&amp;lt;/tt&amp;gt;. Para cada una de ellas, la conectamos que el slot apropiado que hemos declarado en el archivo cabecera.&lt;br /&gt;
&lt;br /&gt;
===Crear un nuevo documento===&lt;br /&gt;
&lt;br /&gt;
La primera función que hemos definido es &amp;lt;tt&amp;gt;newFile()&amp;lt;/tt&amp;gt;.&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;
Con &amp;lt;tt&amp;gt;fileName.clear()&amp;lt;/tt&amp;gt; ponemos la QString como &amp;quot;vacia&amp;quot; para reflejar el hecho de que el documento aún no está presente en disco. A continuación, &amp;lt;tt&amp;gt;textArea-&amp;gt;clear()&amp;lt;/tt&amp;gt; limpia el area de texto usando la misma función que conectaba con la &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;clear&amp;lt;/tt&amp;gt; en el tutorial 3.&lt;br /&gt;
&lt;br /&gt;
===Guardar un archivo===&lt;br /&gt;
&lt;br /&gt;
====saveFileAs(QString)====&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a escribir nuestro primer código que maneje archivos. Vamos a implementar una función que guardará el contenido del área de texto en un archivo con un nombre pasado como parámetro. KDE proporciona una clase llamada {{class|KSaveFile}} para guardar archivos de manera segura, que hereda de la clase de Qt {{qt|QFile}}.&lt;br /&gt;
&lt;br /&gt;
El prototipo de la función es:&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;
A continuación creamos nuestro objeto &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; y lo abrimos con:&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;
Ahora que tenemos nuestro &amp;quot;file&amp;quot; para escribir, necesitamos convertir el texto del area de texto a un formato que pueda ser escrito en el archivo. Para hacer esto, creamos un {{qt|QByteArray}} y lo rellenamos con la versión en texto plano de lo que haya en el area de texto:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
QByteArray outputByteArray;&lt;br /&gt;
outputByteArray.append(textArea-&amp;gt;toPlainText().toUtf8());&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Ahora que tenemos nuestro &amp;lt;tt&amp;gt;QByteArray&amp;lt;/tt&amp;gt;, lo usamos para escribir el archivo con &amp;lt;tt&amp;gt;KSaveFile::write()&amp;lt;/tt&amp;gt;. Si estuvieramos usando un &amp;lt;tt&amp;gt;QFile&amp;lt;/tt&amp;gt;, los cambios se reflejarían inmediatamente. Sin embargo, si se ha producido un problema parcial en la escritura, el archivo podría estar corrupto. Por esta razón, &amp;lt;tt&amp;gt;KSaveFile&amp;lt;/tt&amp;gt; escribe primero en un archivo temporal y luego, en la llamada &amp;lt;tt&amp;gt;KSaveFile::Finalize&amp;lt;/tt&amp;gt;, refleja los cambios en el archivo actual.&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;
Por último, establecemos que &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; apunte al nombre del archivo que acabamos de guardar.&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;
Esta es la función a la que está conectado el slot &amp;lt;tt&amp;gt;saveAs&amp;lt;/tt&amp;gt;. Simplemente llama a la función genérica &amp;lt;tt&amp;gt;saveFileAs(QString)&amp;lt;/tt&amp;gt; pasandole el nombre del fichero devuelto por &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;
Este es nuestro primer uso de la biblioteca KIO. La clase {{class|KFileDialog}} proporciona diferentes funciones estáticas para mostrar cuadros de dialgo estandar, usados en todas las aplicaciones de KDE. La llamada a &amp;lt;tt&amp;gt;KFileDialog::getSaveFileName()&amp;lt;/tt&amp;gt; mostrará un diálogo donde el usuario puede seleccionar en nombre del archivo a guardar o elegir un nuevo nombre. La función devuelve el nombre del archivo, con el cual luego llamamos a &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;
No hay nada destacable o nuevo en esta función, solamente la lógica para decidir si se muestra el dialogo para guardar el archivo. Si &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt; no está vacio, el archivo es guardado como &amp;lt;tt&amp;gt;fileName&amp;lt;/tt&amp;gt;. Si lo está, se muestra el diálogo para permitir al usuario elegir el nombre del archivo.&lt;br /&gt;
&lt;br /&gt;
===Loading a file===&lt;br /&gt;
&lt;br /&gt;
Por último, el tutorial 4 debe ser capaz de cargar archivos desde disco. El código para llevarlo a cabo se encuentra en la función &amp;lt;tt&amp;gt;MainWindow::openFile()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Primero debemos preguntar al usuario por en nombre del archivo que desea abrir. Esto lo hacemos usando otra de las funciones de &amp;lt;tt&amp;gt;KFileDialog&amp;lt;/tt&amp;gt;, &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;
Luego usamos la biblioteca KIO para recuperar nuestro archivo. Esto nos permite abrir el archivo con QFile incluso si está almacenado en una ubicación remota, como un sitio FTP. Hacemos la siguiente llamada a la función &amp;lt;tt&amp;gt;download()&amp;lt;/tt&amp;gt; de la clase {{class|NetAccess}}:&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;
El primer argumento es el nombre del archivo que queremos descargar. El segundo es un QString el cual, una vez se haya completado la descarga, contendrá la localización de la copia temporal del archivo. Es con &amp;lt;tt&amp;gt;tmpFile&amp;lt;/tt&amp;gt; con quien trabajaremos a partir de ahora.&lt;br /&gt;
&lt;br /&gt;
La función devuelve &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; dependiendo si la transferencia tuvo exito. Si falló, mostraremos un mensaje informando del 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;
En caso contrario, continuamos con la apertura del archivo.&lt;br /&gt;
&lt;br /&gt;
Creamos un QFile pasando a su constructor el archivo temporal creado por &amp;lt;tt&amp;gt;NetAccess::download()&amp;lt;/tt&amp;gt; y lo abrirmos en modo de solo lectura:&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;
Para mostrar el contenido del archivo debemos usar un {{qt|QTextStream}}. Creamos uno pasandole el contenido de nuestro archivo a su constructor, y llamamos a la función de QFile &amp;lt;tt&amp;gt;readAll()&amp;lt;/tt&amp;gt; para obtener el texto del archivo. Luego este texto se le pasa a la función &amp;lt;tt&amp;gt;setPlainText()&amp;lt;/tt&amp;gt; de nuestra área de texto.&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;
A continuación almacenamos la ruta de acceso del archivo que acabamos de abrir:&lt;br /&gt;
&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;
y por último, eliminamos el archivo temporal que fué creado por &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, instalar  y ejecutar==&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;
Como ahora estamos usando la biblioteca KIO, debemos decirselo a CMAKE para que la enlace. Hacemos esto pasándole &amp;lt;tt&amp;gt;${KDE4_KIO_LIBS}&amp;lt;/tt&amp;gt; a la función &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con este archivo, puede construirse y ejecutar el tutorial de la misma forma que el tutorial 3. Para mas información, ve al 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;
Ahora puedes continuar con el [[Development/Tutorials/KCmdLineArgs|Tutorial 5 - KCmdLineArgs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</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>2008-12-23T00:23:15Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: {{class|QTextStream}} ---&amp;gt; {{qt|QTextStream}}&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().toUtf8());&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().toUtf8());&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 is 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 {{qt|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 be 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial4_es.png</id>
		<title>File:Introtokdetutorial4 es.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial4_es.png"/>
				<updated>2008-12-21T23:14:48Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-12-16T23:05:58Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro de http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-12-16T23:04:51Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
Los tutoriales de programación también están disponibles en el foro http://kdehispano.es/ para poder realizar comentarios, dudas, apuntes, etc.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program_(es)</id>
		<title>Development/Tutorials/First program (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program_(es)"/>
				<updated>2008-12-16T00:37:56Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish, update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Hola Mundo|&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|Entorno de desarrollo en KDE4]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
Tu primer programa consistirá en saludar al mundo con el amigable &amp;quot;Hola Mundo&amp;quot;, Para ello, usaremos {{class|KMessageBox}} y personalizaremos uno de los botones.&lt;br /&gt;
[[image:HolaMundo.png|frame|center]]&lt;br /&gt;
{{tip_(es)|Si deseas obtener más información respecto a cualquier clase con la que te topes, Konqueror te ofrece un acceso rápido. Por ejemplo, si estás buscando información sobre KMessageBox, simplemente teclea &amp;quot;kde:kmessagebox&amp;quot; en la barra de direcciones de Konqueror y éste te llevará a la documentación.}}&lt;br /&gt;
{{tip_(es)|Quizás quieras usar KDevelop para tus proyectos, ya que ofrece muchas ventajas como completado de código, fácil acceso a la documentación de la API o soporte para depurar.&lt;br /&gt;
&lt;br /&gt;
Lee [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|este tutorial]] para configurar correctamente KDevelop para esta tarea. Probablemente querrás comprobar si la configuración es correcta abriendo primero una aplicación en KDE4 que ya exista. &lt;br /&gt;
&lt;br /&gt;
Quizás necesites editar los archivos CMake a mano.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==El Código==&lt;br /&gt;
Todo el Código Fuente que necesitaremos estará en un solo archivo, que se llamará &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;.. Crea este archivo con el siguiente código:&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;
	// Guarda informacion sobre el programa&lt;br /&gt;
	KAboutData aboutData(&lt;br /&gt;
		// Nombre de la aplicacion usado internamente.&lt;br /&gt;
		&amp;quot;tutorial1&amp;quot;,	&lt;br /&gt;
		// Si el nombre del catalogo es NULL&lt;br /&gt;
		// se usará el nombre interno.&lt;br /&gt;
		0,&lt;br /&gt;
		// Nombre de la aplicacion.&lt;br /&gt;
		ki18n(&amp;quot;Tutorial 1&amp;quot;),&lt;br /&gt;
		// Versión del programa&lt;br /&gt;
		&amp;quot;1.0&amp;quot;,&lt;br /&gt;
		// Pequeña descripcion de lo que hace el programa.&lt;br /&gt;
		ki18n(&amp;quot;Muestra una ventana KMessageBox&amp;quot;),&lt;br /&gt;
		// La licencia del codigo es&lt;br /&gt;
		KAboutData::License_GPL,&lt;br /&gt;
		// Derechos de autor.&lt;br /&gt;
		ki18n(&amp;quot;(c) 2008&amp;quot;),&lt;br /&gt;
		// Texto opcional mostrado en &amp;quot;Acerca de&amp;quot;&lt;br /&gt;
		// Puede contener toda la informacion deseada.&lt;br /&gt;
		ki18n(&amp;quot;Algun texto...&amp;quot;),&lt;br /&gt;
		// Pagina web del proyecto&lt;br /&gt;
		&amp;quot;http://tutorial.com/&amp;quot;,&lt;br /&gt;
		// Direccion de email de reporte de bugs&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;Hola Mundo&amp;quot;), &lt;br /&gt;
				QString(),&lt;br /&gt;
				i18n(&amp;quot;Esto es un tooltip&amp;quot;),&lt;br /&gt;
				i18n(&amp;quot;Esto es el texto de la ayuda ¿Qué es esto?.&amp;quot;));&lt;br /&gt;
	KMessageBox::questionYesNo(0, &lt;br /&gt;
				i18n(&amp;quot;Hola Mundo&amp;quot;),&lt;br /&gt;
				i18n(&amp;quot;Hola&amp;quot;), &lt;br /&gt;
				yesButton);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La primera sentencia específica de KDE en el programa es {{class|KAboutData}}. KAboutData es la clase que se usa para almacenar la información del programa, como una breve descripción, información sobre el autor y licencia, etc. La mayoria de aplicaciones de KDE deberían usar esta clase.&lt;br /&gt;
&lt;br /&gt;
Después viene {{class|KCmdLineArgs}}. Esta es la clase que se podría usar para realizar acciones desde la línea de ordenes, por ejemplo, abrir el programa con un archivo específico. Sin embargo, en este tutorial, simplemente la inicializamos con el objeto {{class|KAboutData}} que hemos creado para que podamos usar &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; en la línea de ordenes.&lt;br /&gt;
&lt;br /&gt;
Creamos un objeto {{class|KApplication}}. Es imprescindible hacerlo una vez en cada programa, ya que es necesario para cosas como [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Ahora que ya hemos establecido toda la configuración necesaria para KDE, podemos pasar a hacer cosas interesantes en nuestra aplicación. Vamos a crear una ventana emergente, y personalizaremos uno de los botones. Para hacer esto, necesitamos usar un objeto {{class|KGuiItem}}. El primer argumento del constructor de {{class|KGuiItem}} es el texto que aparecerá en el ítem (en nuestro caso, un botón), luego tenemos la opción de establecer un icono para el botón pero como no queremos uno simplemente llamamos a &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;, establecemos el tooltip (que aparece cuando detienes el cursor sobre un ítem), y por último el texto &amp;quot;¿Qué es esto?&amp;quot; (accesible mediante el botón derecho o Shift+F1).&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos nuestro item, podemos crear la ventana emergente. Llamamos a la función &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt;, la cual por defecto crea una &amp;quot;caja de mensaje&amp;quot; (message box) con los botones &amp;quot;Si&amp;quot; y &amp;quot;No&amp;quot;. El segundo argumento es el texto que aparecerá en la caja de mensaje encima de los botones. El tercero es el título que tendrá la ventana, y por último establecemos en el botón &amp;quot;Si&amp;quot; el &amp;lt;tt&amp;gt;KGuiItem&amp;lt;/tt&amp;gt; que hemos creado (es decir, yesButton).&lt;br /&gt;
&lt;br /&gt;
Ten en cuenta que todo el texto visible al usuario se pasa a través de la función i18n(); necesaria para que la UI sea traducida. Puedes encontrar mas información sobre la localización en el [[Development/Tutorials/Localization/i18n|tutorial de localización]].&lt;br /&gt;
&lt;br /&gt;
Hemos hecho todo lo concerniente al código. Es hora de compilarlo y probarlo.&lt;br /&gt;
&lt;br /&gt;
==Compilar la aplicación==&lt;br /&gt;
Tienes que [[Development/Tutorials/CMake|usar CMake]] para construir la apliación. CMake usará el archivo CMakeLists.txt para generar el Makefile.&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
Crea un archivo con el nombre CMakeLists.txt en el mismo directorio que main.cpp con este contenido:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include (KDE4Defaults)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
install(TARGETS tutorial1  ${INSTALL_TARGETS_DEFAULT_ARGS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La función &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; localiza el paquete por el que se está preguntando (en este caso KDE4) y establece algunas variables con la localización de los paquetes de cabeceras y bibliotecas. En este caso usaremos la variable &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt;, que contiene la ruta de los archivos de cabecera de KDE4.&lt;br /&gt;
&lt;br /&gt;
A fin de permitir al compilador encontrar esos archivos, pasamos esa variable a la función &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt;, que añade las cabeceras de KDE4 a la ruta de búsqueda de cabeceras.&lt;br /&gt;
&lt;br /&gt;
El siguiente paso es crear una variable llamada &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; mediante la función &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt;. En este caso simplemente debemos poner el nombre de nuestro único archivo fuente.&lt;br /&gt;
&lt;br /&gt;
Luego usamos &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; para crear un ejecutable llamado &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; desde los archivos fuente listados en nuestra variable &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt;. Por último enlazamos nuestro ejecutable con la biblioteca kdeui de KDE4 usando &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; y la variable &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt;, la cual fue ajustada por la función &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt;. La linea que comienza con &amp;lt;tt&amp;gt;install&amp;lt;/tt&amp;gt; establece un destino de instalación por defecto.&lt;br /&gt;
&lt;br /&gt;
===Make y Ejecutar===&lt;br /&gt;
Puedes invocar a CMake y a make manualmente:&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. # Nota: los dos puntos indican el directorio padre, no es una errata!&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
O si has configurado el entorno tal como está descrito en [[Getting_Started/Build/KDE4|Getting Started/Build/KDE4]], puedes compilar el código con:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y ejecutarlo con:&lt;br /&gt;
 ./tutorial1&lt;br /&gt;
&lt;br /&gt;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - Usar KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/First_program_(es)</id>
		<title>Development/Tutorials/First program (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/First_program_(es)"/>
				<updated>2008-12-16T00:31:10Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish, update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Hola Mundo|&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|Entorno de desarrollo en KDE4]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]]| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
&lt;br /&gt;
Tu primer programa consistirá en saludar al mundo con el amigable &amp;quot;Hola Mundo&amp;quot;, Para ello, usaremos {{class|KMessageBox}} y personalizaremos uno de los botones.&lt;br /&gt;
[[image:HolaMundo.png|frame|center]]&lt;br /&gt;
{{tip_(es)|Si deseas obtener más información respecto a cualquier clase con la que te topes, Konqueror te ofrece un acceso rápido. Por ejemplo, si estás buscando información sobre KMessageBox, simplemente teclea &amp;quot;kde:kmessagebox&amp;quot; en la barra de direcciones de Konqueror y éste te llevará a la documentación.}}&lt;br /&gt;
{{tip_(es)|Quizás quieras usar KDevelop para tus proyectos, ya que ofrece muchas ventajas como completado de código, fácil acceso a la documentación de la API o soporte para depurar.&lt;br /&gt;
&lt;br /&gt;
Lee [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|este tutorial]] para configurar correctamente KDevelop para esta tarea. Probablemente querrás comprobar si la configuración es correcta abriendo primero una aplicación en KDE4 que ya exista. &lt;br /&gt;
&lt;br /&gt;
Quizás necesites editar los archivos CMake a mano.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==El Código==&lt;br /&gt;
Todo el Código Fuente que necesitaremos estará en un solo archivo, que se llamará &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;.. Crea este archivo con el siguiente código:&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;
	// Guarda informacion sobre el programa&lt;br /&gt;
	KAboutData aboutData(&lt;br /&gt;
		// Nombre de la aplicacion usado internamente.&lt;br /&gt;
		&amp;quot;tutorial1&amp;quot;,	&lt;br /&gt;
		// Si el nombre del catalogo es NULL&lt;br /&gt;
		// se usará el nombre interno.&lt;br /&gt;
		0,&lt;br /&gt;
		// Nombre de la aplicacion.&lt;br /&gt;
		ki18n(&amp;quot;Tutorial 1&amp;quot;),&lt;br /&gt;
		// Versión del programa&lt;br /&gt;
		&amp;quot;1.0&amp;quot;,&lt;br /&gt;
		// Pequeña descripcion de lo que hace el programa.&lt;br /&gt;
		ki18n(&amp;quot;Muestra una ventana KMessageBox&amp;quot;),&lt;br /&gt;
		// La licencia del codigo es&lt;br /&gt;
		KAboutData::License_GPL,&lt;br /&gt;
		// Derechos de autor.&lt;br /&gt;
		ki18n(&amp;quot;(c) 2008&amp;quot;),&lt;br /&gt;
		// Texto opcional mostrado en &amp;quot;Acerca de&amp;quot;&lt;br /&gt;
		// Puede contener toda la informacion deseada.&lt;br /&gt;
		ki18n(&amp;quot;Algun texto...&amp;quot;),&lt;br /&gt;
		// Pagina web del proyecto&lt;br /&gt;
		&amp;quot;http://tutorial.com/&amp;quot;,&lt;br /&gt;
		// Direccion de email de reporte de bugs&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;Hola Mundo&amp;quot;), &lt;br /&gt;
				QString(),&lt;br /&gt;
				i18n(&amp;quot;Esto es un tooltip&amp;quot;),&lt;br /&gt;
				i18n(&amp;quot;Esto es el texto de la ayuda ¿Qué es esto?.&amp;quot;));&lt;br /&gt;
	KMessageBox::questionYesNo(0, &lt;br /&gt;
				i18n(&amp;quot;Hola Mundo&amp;quot;),&lt;br /&gt;
				i18n(&amp;quot;Hola&amp;quot;), &lt;br /&gt;
				yesButton);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La primera sentencia específica de KDE en el programa es {{class|KAboutData}}. KAboutData es la clase que se usa para almacenar la información del programa, como una breve descripción, información sobre el autor y licencia, etc. La mayoria de aplicaciones de KDE deberían usar esta clase.&lt;br /&gt;
&lt;br /&gt;
Después viene {{class|KCmdLineArgs}}. Esta es la clase que se podría usar para realizar acciones desde la línea de ordenes, por ejemplo, abrir el programa con un archivo específico. Sin embargo, en este tutorial, simplemente la inicializamos con el objeto {{class|KAboutData}} que hemos creado para que podamos usar &amp;lt;tt&amp;gt;--version&amp;lt;/tt&amp;gt; o &amp;lt;tt&amp;gt;--author&amp;lt;/tt&amp;gt; en la línea de ordenes.&lt;br /&gt;
&lt;br /&gt;
Creamos un objeto {{class|KApplication}}. Es imprescindible hacerlo una vez en cada programa, ya que es necesario para cosas como [[Development/Tutorials/Localization/i18n|i18n]].&lt;br /&gt;
&lt;br /&gt;
Ahora que ya hemos establecido toda la configuración necesaria para KDE, podemos pasar a hacer cosas interesantes en nuestra aplicación. Vamos a crear una ventana emergente, y personalizaremos uno de los botones. Para hacer esto, necesitamos usar un objeto {{class|KGuiItem}}. El primer argumento del constructor de {{class|KGuiItem}} es el texto que aparecerá en el ítem (en nuestro caso, un botón), luego tenemos la opción de establecer un icono para el botón pero como no queremos uno simplemente llamamos a &amp;lt;tt&amp;gt;QString()&amp;lt;/tt&amp;gt;, establecemos el tooltip (que aparece cuando detienes el cursor sobre un ítem), y por último el texto &amp;quot;¿Qué es esto?&amp;quot; (accesible mediante el botón derecho o Shift+F1).&lt;br /&gt;
&lt;br /&gt;
Ahora que tenemos nuestro item, podemos crear la ventana emergente. Llamamos a la función &amp;lt;tt&amp;gt;{{class|KMessageBox}}::questionYesNo()&amp;lt;/tt&amp;gt;, la cual por defecto crea una &amp;quot;caja de mensaje&amp;quot; (message box) con los botones &amp;quot;Si&amp;quot; y &amp;quot;No&amp;quot;. El segundo argumento es el texto que aparecerá en la caja de mensaje encima de los botones. El tercero es el título que tendrá la ventana, y por último establecemos en el botón &amp;quot;Si&amp;quot; el &amp;lt;tt&amp;gt;KGuiItem&amp;lt;/tt&amp;gt; que hemos creado (es decir, yesButton).&lt;br /&gt;
&lt;br /&gt;
Ten en cuenta que todo el texto visible al usuario se pasa a través de la función i18n(); necesaria para que la UI sea traducida. Puedes encontrar mas información sobre la localización en el [[Development/Tutorials/Localization/i18n|tutorial de localización]].&lt;br /&gt;
&lt;br /&gt;
Hemos hecho todo lo concerniente al código. Es hora de compilarlo y probarlo.&lt;br /&gt;
&lt;br /&gt;
==Compilar la aplicación==&lt;br /&gt;
Tienes que [[Development/Tutorials/CMake|usar CMake]] para construir la apliación. CMake usará el archivo CMakeLists.txt para generar el Makefile.&lt;br /&gt;
&lt;br /&gt;
===CMakeLists.txt===&lt;br /&gt;
Crea un archivo con el nombre CMakeLists.txt en el mismo directorio que main.cpp con este contenido:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
project (tutorial1)&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include (KDE4Defaults)&lt;br /&gt;
include_directories(${KDE4_INCLUDES})&lt;br /&gt;
set(tutorial1_SRCS main.cpp)&lt;br /&gt;
kde4_add_executable(tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})&lt;br /&gt;
install(TARGETS tutorial1  ${INSTALL_TARGETS_DEFAULT_ARGS})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
La función &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt; localiza el paquete por el que se está preguntando (en este caso KDE4) y establece algunas variables con la localización de los paquetes de cabeceras y bibliotecas. En este caso usaremos la variable &amp;lt;tt&amp;gt;KDE4_INCLUDES&amp;lt;/tt&amp;gt;, que contiene la ruta de los archivos de cabecera de KDE4.&lt;br /&gt;
&lt;br /&gt;
A fin de permitir al compilador encontrar esos archivos, pasamos esa variable a la función &amp;lt;tt&amp;gt;include_directories()&amp;lt;/tt&amp;gt;, que añade las cabeceras de KDE4 a la ruta de búsqueda de cabeceras.&lt;br /&gt;
&lt;br /&gt;
El siguiente paso es crear una variable llamada &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt; mediante la función &amp;lt;tt&amp;gt;set()&amp;lt;/tt&amp;gt;. En este caso simplemente debemos poner el nombre de nuestro único archivo fuente.&lt;br /&gt;
&lt;br /&gt;
Luego usamos &amp;lt;tt&amp;gt;kde4_add_executable()&amp;lt;/tt&amp;gt; para crear un ejecutable llamado &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; desde los archivos fuente listados en nuestra variable &amp;lt;tt&amp;gt;tutorial1_SRCS&amp;lt;/tt&amp;gt;. Por último enlazamos nuestro ejecutable con la biblioteca kdeui de KDE4 usando &amp;lt;tt&amp;gt;target_link_libraries()&amp;lt;/tt&amp;gt; y la variable &amp;lt;tt&amp;gt;KDE4_KDEUI_LIBS&amp;lt;/tt&amp;gt;, la cual fue ajustada por la función &amp;lt;tt&amp;gt;find_package()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Make y Ejecutar===&lt;br /&gt;
Puedes invocar a CMake y a make manualmente:&lt;br /&gt;
&lt;br /&gt;
 mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 cmake .. # Nota: los dos puntos indican el directorio padre, no es una errata!&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
O si has configurado el entorno tal como está descrito en [[Getting_Started/Build/KDE4|Getting Started/Build/KDE4]], puedes compilar el código con:&lt;br /&gt;
 cmakekde&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Y ejecutarlo con:&lt;br /&gt;
 ./tutorial1&lt;br /&gt;
&lt;br /&gt;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - Usar KXmlGuiWindow]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</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>2008-11-26T00:49:03Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: update spanish team&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;
=== Spanish Team ===&lt;br /&gt;
* [[User:Martin J. Ponce|Martin J. Ponce]], mjp dot ttc at gmail dot com&lt;br /&gt;
* [[User:edumardo| Eduardo Delgado Díaz (edumardo)]], aesalemolo at gmail dot com&lt;br /&gt;
* name, &amp;lt;email&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== German Team ===&lt;br /&gt;
* [[User:DrSlowDecay|DrSlowDecay]], kde at metalhorde dot de&lt;br /&gt;
* [[User:Rememberme|rememberme]] redict dot info at gmx dot net&lt;br /&gt;
* [[User:sschloenvoigt|Steffen Schloenvoigt]], steffen at schloenvoigt 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;
* [[User:Panda84|Panda84]], panda84 at inwind dot it&lt;br /&gt;
* name, &amp;lt;email&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tamil Team ===&lt;br /&gt;
* [[User:Shriramadhas|Shriramadhas]], shriramadhas 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tools_(es)</id>
		<title>Development/Tools (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tools_(es)"/>
				<updated>2008-10-07T14:28:43Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tools}}&lt;br /&gt;
Esta sección contiene informacion sobre las herramientas para el desarrollo de KDE.&lt;br /&gt;
&lt;br /&gt;
== Depurado y análisis ==&lt;br /&gt;
Lista de herramientas usadas para analizar un programa. Incluye depuradores y perfiles (profilers), por ejemplo:&lt;br /&gt;
&lt;br /&gt;
; Valgrind&lt;br /&gt;
: [[Development/Tools/Valgrind|Valgrind]] te ayuda a encontrar fugas de memoria y bloques de memoria sin inicializar. Como funcionalidades avanzadas tenemos un profiler y más. Valgrind es una de las herramientas de desarrollo mas importante!.&lt;br /&gt;
&lt;br /&gt;
; The GNU Project Debugger (GDB)&lt;br /&gt;
: [http://sources.redhat.com/gdb/ GDB] te ayuda a depurar código fuente. Como GDB está en desarrollo todo el tiempo, es recomendable usar la versión 6.x. Exsiten interfaces de usuario. Mira también el tutorial de depurado [[../Tutorials/Debugging/Debugging with GDB|Debugging with GDB]].&lt;br /&gt;
&lt;br /&gt;
; KDbg&lt;br /&gt;
: [http://www.kdbg.org/ KDbg] es una interfaz gráfica de usuario de GDB, con la cual puedes establecer breakpoints, ir paso a paso a través del código, etc.&lt;br /&gt;
&lt;br /&gt;
; MS Windows tools (Process Explorer, Console, WinDbg, DebugView...)&lt;br /&gt;
: Mas información en la [[Projects/KDE_on_Windows/Tools|página de KDE en Windows]].&lt;br /&gt;
&lt;br /&gt;
== Herramientas de desarrollo ==&lt;br /&gt;
; KDevelop&lt;br /&gt;
: [http://www.kdevelop.org KDevelop] es un excelente IDE para el desarrollo de aplicaciones KDE y Qt en C++. Incluye un depurador integrado, un potente editor con realce de sintaxis, un ''Project Wizard'' para crear aplicaciones desde plantillas, automake/autoconf, e incluso la documentación de clases. Puedes encontrar mas detalles en [http://kdevelop.org/mediawiki/index.php/Main_Page KDevelop wiki].&lt;br /&gt;
&lt;br /&gt;
:Las instrucciones sobre como usar KDevelop con aplicaciones KDE4 están disponibles en [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|esta página]].&lt;br /&gt;
&lt;br /&gt;
; Qt Designer&lt;br /&gt;
: Con Trolltech [http://www.trolltech.com/products/qt/features/designer Qt Designer] es fácil diseñar interfaces con botones y &amp;quot;checkboxes&amp;quot;. Tiene características adicionales como deshacer/rehacer, comprobación de conflictos, etc. Puedes encontrar mas detalles en el tutorial [[Development/Tutorials/Using_Qt_Designer|Usar Qt Designer]] y en la [http://doc.trolltech.com/4.2/designer-manual.html documentación de Qt].&lt;br /&gt;
&lt;br /&gt;
; MS Visual Studio® Express 2005 IDE (solo Windows)&lt;br /&gt;
: Visual C++® 2005 Express Edition [http://www.microsoft.com/germany/msdn/vstudio/products/express/visualc/default.mspx] es la verión gratuita del compilador Microsoft Visual Studio 2005 de Microsoft, soportado oficialmente por Trolltech desde Qt 4.3.2. Es una opción para compilar Qt y aplicaciones KDE en Windows. [[Projects/KDE_on_Windows/Issues/MSVC|Mas información]].&lt;br /&gt;
&lt;br /&gt;
== Herramientas de internacionalización (i18n) ==&lt;br /&gt;
&lt;br /&gt;
; KBabel&lt;br /&gt;
: [http://kbabel.kde.org/ KBabel] es un conjunto de herramientas para editar y administrar archivos PO. Es un potente y cómodo editor de archivos PO que proporciona navegación entre archivos, edición, posibilidad de buscar traducciones en diferentes diccionarios, comprobación de vocabulario y sintaxis, mostrar diferencias y mucho mas. &lt;br /&gt;
&lt;br /&gt;
: También incluye un &amp;quot;administrador de catálogo&amp;quot;, una vista de administración de archivos que ayuda a mantener y observar archivos PO.  Por último, pero no por ello menos importante, incluye una aplicación de diccionario independiente que ofrece la posibilidad adicional de acceder a los potentes diccionarios de KBabel. KBabel te ayudará a traducir rápido y también a conseguir traducciones coherentes.&lt;br /&gt;
&lt;br /&gt;
; Dr. Klash&lt;br /&gt;
: Esta pequeña utilidad, una vez activada, puede presentar un informe sobre los conflictos de teclado en los menús. No solo es útil para los traductores, sino también los para desarrolladores. Una pequeña edición de {{path|`kde-config --localprefix`/share/config/kdeglobals}} activa esta funcionalidad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Development]&lt;br /&gt;
CheckAccelerators=F12&lt;br /&gt;
AutoCheckAccelerators=false&lt;br /&gt;
AlwaysShowCheckAccelerators=false&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Al pulsar F12 se mostrará un diálogo que contendrá que atajos de teclado de la interfaz activa crean conflictos y proporcionará sugerencias para unos nuevos. Si no existen conflictos o Dr. Klash no tiene ninguna sugerencia, no se mostrará nada.&lt;br /&gt;
&lt;br /&gt;
: Con &amp;lt;tt&amp;gt;AutoCheckAccelerators&amp;lt;/tt&amp;gt; activado, se mostrará automáticamente el diálogo si existe un conflicto, y &amp;lt;tt&amp;gt;AlwaysShowCheckAccelerators&amp;lt;/tt&amp;gt; puede forzar a que el dialogo siempre aparezca aunque no existan conflictos.&lt;br /&gt;
&lt;br /&gt;
; El lenguaje x-test &lt;br /&gt;
: Este lenguaje de ayuda actúa como un depurador que permite a la gente encontrar cadenas no traducidas. Si inicias tu aplicación con &amp;quot;x-test&amp;quot;, todas las cadenas traducidas aparecerán marcadas con xx's al principio. En primer lugar tienes que comprobar dichas &amp;quot;traducciones&amp;quot; en l10n-kde4/x-test, e instalarlas después.&lt;br /&gt;
&lt;br /&gt;
: Despues de haber compilado e instalado l10n-kde4/x-test, ejecuta tu aplicación usando &amp;quot;x-test&amp;quot;. Esto lo puedes hacer lanzandola desde la linea de ordenes de esta manera:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; KDE_LANG=x-test kspread&lt;br /&gt;
&lt;br /&gt;
: De esta forma, arrancará KSpread usando &amp;quot;x-test&amp;quot;, sin importar cual sea la configuración del idioma. Observa las cadenas que no tienen xx's. Si una cadena no tiene xx's, podría deberse a que faltan llamadas a i18n o incluso archivos .pot desaparecidos o generados incorrectamente. Consulta los tutoriales de i18n para mas información.&lt;br /&gt;
&lt;br /&gt;
: Cuando compruebes cadenas sin traducir, asegurate que compruebas toda la ayuda &amp;quot;¿Qué es esto?&amp;quot; y los tooltips.&lt;br /&gt;
&lt;br /&gt;
=== Examinando archivos .po ===&lt;br /&gt;
&lt;br /&gt;
Puedes mirar en los archivos .po traducidos para comprobar si una cadena está presente y ha sido traducida. Por ejemplo, aquí tienes una porción de {{path|l10n/es/messages/kdebase/kdesu.po}}: &lt;br /&gt;
&lt;br /&gt;
 #: kdesu.cpp:100 kdesu.cpp:101&lt;br /&gt;
 msgid &amp;quot;Specifies the command to run&amp;quot;&lt;br /&gt;
 msgstr &amp;quot;Indica la orden a ejecutar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La cadena a traducir empieza en la línea msgid. La cadena traducida está en la línea msgstr. Ten en cuenta que la cadena a traducir puede necesitarse en dos partes del código diferentes. Los archivos .po ahorran a los traductores tener que traducir la misma cadena dos veces.&lt;br /&gt;
&lt;br /&gt;
Puedes usar también KBabel para examinar archivos {{path|.po}}. KBabel es parte del módulo kdesdk.&lt;br /&gt;
{{note|Puedes encontrar mas información sobre la escritura y traducción de documentación en el [http://l10n.kde.org/ sitio web de l10n].}}&lt;br /&gt;
&lt;br /&gt;
== Herramientas de ayuda ==&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tools/Using kde-config|Obtener información sobre la instalación de KDE - kde-config]] &lt;br /&gt;
: La herramienta kde-config te ayuda a saber más acerca de una instalación de KDE&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tools/Using kfmclient|Manejar Konqueror mediante scripts - kfmclient]] &lt;br /&gt;
: kfmclient es una pequeña herramienta para comunicarse con Konqueror.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/Using kconf_update|Actualizar archivos de configuración del usuario - kconf_update]]&lt;br /&gt;
: kconf_update es una herramienta diseñada para actualizar archivos de configuración del usuario.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/apidox|Generar apidox]]&lt;br /&gt;
: Herramientas que ayudan a desarrollar y generar la documentación de la API de tu código.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/Automoc4|Automoc4]]&lt;br /&gt;
: Es una herramienta de ayuda necesaria para construir KDE4. Genera automáticamente archivos moc.&lt;br /&gt;
&lt;br /&gt;
== Asegurar la calidad ==&lt;br /&gt;
&lt;br /&gt;
; Construcción continua - Dashboard &lt;br /&gt;
: [http://developer.kde.org/~dirk/dashboard/ Todos los módulos de kde en Dirk's dashboard]&lt;br /&gt;
: [http://public.kitware.com/dashboard.php?name=kde kdelibs en kitware]&lt;br /&gt;
&lt;br /&gt;
; [http://englishbreakfastnetwork.org/ English Breakfast Network] - Análisis estático&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/krazy/ Krazy ] - Análisis de código, [[Development/Tutorials/Code_Checking|Tutorial de uso]]&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/apidocs/ APIDOX] - Estadísticas de la documentación de la API&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/sanitizer/ Sanitizer] - Verificador de DocBook&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/usability/ Comprobación de usabilidad]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tools_(es)</id>
		<title>Development/Tools (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tools_(es)"/>
				<updated>2008-10-07T14:26:40Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tools}}&lt;br /&gt;
Esta sección contiene informacion sobre las herramientas para el desarrollo de KDE.&lt;br /&gt;
&lt;br /&gt;
== Depurado y análisis ==&lt;br /&gt;
Lista de herramientas usadas para analizar un programa. Incluye depuradores y perfiles (profilers), por ejemplo:&lt;br /&gt;
&lt;br /&gt;
; Valgrind&lt;br /&gt;
: [[Development/Tools/Valgrind|Valgrind]] te ayuda a encontrar fugas de memoria y bloques de memoria sin inicializar. Como funcionalidades avanzadas tenemos un profiler y más. Valgrind es una de las herramientas de desarrollo mas importante!.&lt;br /&gt;
&lt;br /&gt;
; The GNU Project Debugger (GDB)&lt;br /&gt;
: [http://sources.redhat.com/gdb/ GDB] te ayuda a depurar código fuente. Como GDB está en desarrollo todo el tiempo, es recomendable usar la versión 6.x. Exsiten interfaces de usuario. Mira también el tutorial de depurado [[../Tutorials/Debugging/Debugging with GDB|Debugging with GDB]].&lt;br /&gt;
&lt;br /&gt;
; KDbg&lt;br /&gt;
: [http://www.kdbg.org/ KDbg] es una interfaz gráfica de usuario de GDB, con la cual puedes establecer breakpoints, ir paso a paso a través del código, etc.&lt;br /&gt;
&lt;br /&gt;
; MS Windows tools (Process Explorer, Console, WinDbg, DebugView...)&lt;br /&gt;
: Mas información en la [[Projects/KDE_on_Windows/Tools|página de KDE en Windows]].&lt;br /&gt;
&lt;br /&gt;
== Herramientas de desarrollo ==&lt;br /&gt;
; KDevelop&lt;br /&gt;
: [http://www.kdevelop.org KDevelop] es un excelente IDE para el desarrollo de aplicaciones KDE y Qt en C++. Incluye un depurador integrado, un potente editor con realce de sintaxis, un ''Project Wizard'' para crear aplicaciones desde plantillas, automake/autoconf, e incluso la documentación de clases. Puedes encontrar mas detalles en [http://kdevelop.org/mediawiki/index.php/Main_Page KDevelop wiki].&lt;br /&gt;
&lt;br /&gt;
:Las instrucciones sobre como usar KDevelop con aplicaciones KDE4 están disponibles en [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this page]].&lt;br /&gt;
&lt;br /&gt;
; Qt Designer&lt;br /&gt;
: Con Trolltech [http://www.trolltech.com/products/qt/features/designer Qt Designer] es fácil diseñar interfaces con botones y &amp;quot;checkboxes&amp;quot;. Tiene características adicionales como deshacer/rehacer, comprobación de conflictos, etc. Puedes encontrar mas detalles en el tutorial [[Development/Tutorials/Using_Qt_Designer|Using Qt Designer]] y en la [http://doc.trolltech.com/4.2/designer-manual.html documentación de Qt].&lt;br /&gt;
&lt;br /&gt;
; MS Visual Studio® Express 2005 IDE (solo Windows)&lt;br /&gt;
: Visual C++® 2005 Express Edition [http://www.microsoft.com/germany/msdn/vstudio/products/express/visualc/default.mspx] es la verión gratuita del compilador Microsoft Visual Studio 2005 de Microsoft, soportado oficialmente por Trolltech desde Qt 4.3.2. Es una opción para compilar Qt y aplicaciones KDE en Windows. [[Projects/KDE_on_Windows/Issues/MSVC|Mas información]].&lt;br /&gt;
&lt;br /&gt;
== Herramientas de internacionalización (i18n) ==&lt;br /&gt;
&lt;br /&gt;
; KBabel&lt;br /&gt;
: [http://kbabel.kde.org/ KBabel] es un conjunto de herramientas para editar y administrar archivos PO. Es un potente y cómodo editor de archivos PO que proporciona navegación entre archivos, edición, posibilidad de buscar traducciones en diferentes diccionarios, comprobación de vocabulario y sintaxis, mostrar diferencias y mucho mas. &lt;br /&gt;
&lt;br /&gt;
: También incluye un &amp;quot;administrador de catálogo&amp;quot;, una vista de administración de archivos que ayuda a mantener y observar archivos PO.  Por último, pero no por ello menos importante, incluye una aplicación de diccionario independiente que ofrece la posibilidad adicional de acceder a los potentes diccionarios de KBabel. KBabel te ayudará a traducir rápido y también a conseguir traducciones coherentes.&lt;br /&gt;
&lt;br /&gt;
; Dr. Klash&lt;br /&gt;
: Esta pequeña utilidad, una vez activada, puede presentar un informe sobre los conflictos de teclado en los menús. No solo es útil para los traductores, sino también los para desarrolladores. Una pequeña edición de {{path|`kde-config --localprefix`/share/config/kdeglobals}} activa esta funcionalidad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Development]&lt;br /&gt;
CheckAccelerators=F12&lt;br /&gt;
AutoCheckAccelerators=false&lt;br /&gt;
AlwaysShowCheckAccelerators=false&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Al pulsar F12 se mostrará un diálogo que contendrá que atajos de teclado de la interfaz activa crean conflictos y proporcionará sugerencias para unos nuevos. Si no existen conflictos o Dr. Klash no tiene ninguna sugerencia, no se mostrará nada.&lt;br /&gt;
&lt;br /&gt;
: Con &amp;lt;tt&amp;gt;AutoCheckAccelerators&amp;lt;/tt&amp;gt; activado, se mostrará automáticamente el diálogo si existe un conflicto, y &amp;lt;tt&amp;gt;AlwaysShowCheckAccelerators&amp;lt;/tt&amp;gt; puede forzar a que el dialogo siempre aparezca aunque no existan conflictos.&lt;br /&gt;
&lt;br /&gt;
; El lenguaje x-test &lt;br /&gt;
: Este lenguaje de ayuda actúa como un depurador que permite a la gente encontrar cadenas no traducidas. Si inicias tu aplicación con &amp;quot;x-test&amp;quot;, todas las cadenas traducidas aparecerán marcadas con xx's al principio. En primer lugar tienes que comprobar dichas &amp;quot;traducciones&amp;quot; en l10n-kde4/x-test, e instalarlas después.&lt;br /&gt;
&lt;br /&gt;
: Despues de haber compilado e instalado l10n-kde4/x-test, ejecuta tu aplicación usando &amp;quot;x-test&amp;quot;. Esto lo puedes hacer lanzandola desde la linea de ordenes de esta manera:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; KDE_LANG=x-test kspread&lt;br /&gt;
&lt;br /&gt;
: De esta forma, arrancará KSpread usando &amp;quot;x-test&amp;quot;, sin importar cual sea la configuración del idioma. Observa las cadenas que no tienen xx's. Si una cadena no tiene xx's, podría deberse a que faltan llamadas a i18n o incluso archivos .pot desaparecidos o generados incorrectamente. Consulta los tutoriales de i18n para mas información.&lt;br /&gt;
&lt;br /&gt;
: Cuando compruebes cadenas sin traducir, asegurate que compruebas toda la ayuda &amp;quot;¿Qué es esto?&amp;quot; y los tooltips.&lt;br /&gt;
&lt;br /&gt;
=== Examinando archivos .po ===&lt;br /&gt;
&lt;br /&gt;
Puedes mirar en los archivos .po traducidos para comprobar si una cadena está presente y ha sido traducida. Por ejemplo, aquí tienes una porción de {{path|l10n/es/messages/kdebase/kdesu.po}}: &lt;br /&gt;
&lt;br /&gt;
 #: kdesu.cpp:100 kdesu.cpp:101&lt;br /&gt;
 msgid &amp;quot;Specifies the command to run&amp;quot;&lt;br /&gt;
 msgstr &amp;quot;Indica la orden a ejecutar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La cadena a traducir empieza en la línea msgid. La cadena traducida está en la línea msgstr. Ten en cuenta que la cadena a traducir puede necesitarse en dos partes del código diferentes. Los archivos .po ahorran a los traductores tener que traducir la misma cadena dos veces.&lt;br /&gt;
&lt;br /&gt;
Puedes usar también KBabel para examinar archivos {{path|.po}}. KBabel es parte del módulo kdesdk.&lt;br /&gt;
{{note|Puedes encontrar mas información sobre la escritura y traducción de documentación en el [http://l10n.kde.org/ sitio web de l10n].}}&lt;br /&gt;
&lt;br /&gt;
== Herramientas de ayuda ==&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tools/Using kde-config|Obtener información sobre la instalación de KDE - kde-config]] &lt;br /&gt;
: La herramienta kde-config te ayuda a saber más acerca de una instalación de KDE&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tools/Using kfmclient|Manejar Konqueror mediante scripts - kfmclient]] &lt;br /&gt;
: kfmclient es una pequeña herramienta para comunicarse con Konqueror.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/Using kconf_update|Actualizar archivos de configuración del usuario - kconf_update]]&lt;br /&gt;
: kconf_update es una herramienta diseñada para actualizar archivos de configuración del usuario.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/apidox|Generar apidox]]&lt;br /&gt;
: Herramientas que ayudan a desarrollar y generar la documentación de la API de tu código.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/Automoc4|Automoc4]]&lt;br /&gt;
: Es una herramienta de ayuda necesaria para construir KDE4. Genera automáticamente archivos moc.&lt;br /&gt;
&lt;br /&gt;
== Asegurar la calidad ==&lt;br /&gt;
&lt;br /&gt;
; Construcción continua - Dashboard &lt;br /&gt;
: [http://developer.kde.org/~dirk/dashboard/ Todos los módulos de kde en Dirk's dashboard]&lt;br /&gt;
: [http://public.kitware.com/dashboard.php?name=kde kdelibs en kitware]&lt;br /&gt;
&lt;br /&gt;
; [http://englishbreakfastnetwork.org/ English Breakfast Network] - Análisis estático&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/krazy/ Krazy ] - Análisis de código, [[Development/Tutorials/Code_Checking|Tutorial de uso]]&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/apidocs/ APIDOX] - Estadísticas de la documentación de la API&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/sanitizer/ Sanitizer] - Verificador de DocBook&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/usability/ Comprobación de usabilidad]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2008-10-06T23:44:17Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish, update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 6, también está traducido el punto 13 (Plasma)}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&lt;br /&gt;
&lt;br /&gt;
== Servicios: Aplicaciones y Plugins ==&lt;br /&gt;
;[[Development/Tutorials/Services/Introduction|Introducción al framework de Servicios]]&lt;br /&gt;
:''Una visión general del framework de Servicios en KDE y qué proporciona a los desarrolladores de aplicaciones. Trata sobre la cache de configuración del sistema (SyCoCa), los archivos de datos fuente y el uso que puede darse a la información indexada.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Traders|Encontrar Servicios usando consultas con operadores (Trader Queries)]]&lt;br /&gt;
:''Como encontrar servicios, como plugins o mimetypes, que están indexados en SyCoCa, usando la sintaxis de preguntas con operadores (Trader Query Syntax).''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Services/Plugins|Crear y cargar Plugins mediante KService]]&lt;br /&gt;
:''Aprende como definir plugins propios, encontrar plugins instalados (incluidos plugins de terceras partes) y cargarlos de forma fácil y portable usando KService.''&lt;br /&gt;
&lt;br /&gt;
== Localización ==&lt;br /&gt;
Véase también el [[Localization|Portal de Localización]].&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/Unicode|Introducción a Unicode]]&lt;br /&gt;
:''Una introducción a Unicode, así como la forma de manejar datos Unicode en las aplicaciones de KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n|Escribir aplicaciones teniendo en cuenta la Localización]]&lt;br /&gt;
:''Este tutorial trata sobre que es la localización, por que es importante y como asegurarse de que tu aplicación está lista para ser localizada. Una lectura obligatoria para todos los desarrolladores de aplicaciones.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Localization/i18n Mistakes|Evitar errores comunes en la localización]]&lt;br /&gt;
:''Existen algunos errores comunes que impiden que las aplicaciones sean localizadas correctamente. Descubre cuales son y como evitarlos facilmente en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/Building KDE's l10n Module|Construir el modulo de Localización de KDE]]&lt;br /&gt;
:''Construir e instalar el soporte de idiomas del módulo de localización de KDE (l10n) es una buena idea para aquellos que están trabajando en aplicaciones del repositorio principal de KDE.  Si lo haces, te permitirá probar tu aplicación en otro idioma y tratar los posibles errores. Aprende como llevarlo a cabo en este tutorial.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Build Systems|Incorporar l18n a la construcción del sistema]]&lt;br /&gt;
:''Una vez que tu aplicación está lista para ser localizada, el siguiente paso es asegurarse que los archivos de traducción se construyen automáticamente y que estos estén actualizados. Este tutorial cubre los añadidos necesarios en CMakeLists.txt, así como el proceso de distribuir el catálogo de mensajes resultante junto a tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Challenges|Retos comunes en i18n y soluciones]]&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|Marcado semántico de los mensajes]]&lt;br /&gt;
:''Para garantizar una presentación consistente y una representación más significativa de los mensajes en las aplicaciones, el marcado semántico puede aplicarse a los mensajes marcados para la traducción utilizando el sistema KUIT. Este tutorial describe como trabaja este sistema.''&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tutorials/Localization/i18n Krazy|Comprobación automática de código i18n]]&lt;br /&gt;
:''El &amp;quot;Krazy code checker&amp;quot; comprueba el código e informa de los errores comunes de i18n.''&lt;br /&gt;
&lt;br /&gt;
== Documentación ==&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 ===&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;
== 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/NepomukServer|The Nepomuk Server]]&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;
&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;
== 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_(es)|Primeros pasos con los Plasmoids]]&lt;br /&gt;
:''Crea tu primer widget de Plasma, o Plasmoid, en C++ con un fondo SVG, un icono y algo de texto''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir DataEngine]]&lt;br /&gt;
:''DataEngines proporcionan una [http://api.kde.org/4.0-api/kdebase-apidocs/workspace/libs/plasma/html/classPlasma_1_1DataEngine.html interfaz estandarizada] para varias fuentes de datos para usarlos en las visualizaciones. Aprende que es un DataEngine y como escribir uno''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Usar DataEngines en los Plasmoids]]&lt;br /&gt;
:''Con un DateEngine, es posible recuperar datos para mostrarlos de una forma simple y estandar. Este tutorial abarca el tema de como usar DataEngines en los Plasmoids''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los &amp;quot;Runners&amp;quot; son plugins que proporcionan la funcionalidad de busqueda basada en acciones mediante el dialogo &amp;quot;ejecutar orden&amp;quot; en el area de trabajo de Plasma. Estos plugins pueden ser usados por cualquier aplicación que enlace con libplasma''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guía para crear tu primer tema de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Usar Extenders]]&lt;br /&gt;
:''Esta guía te muestra como crear un simple applet (destripando el applet kuiserver) que use extenders''.&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/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;
== 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;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/K_Hot_New_Stuff2|New introduction to KGet Hot New Stuff2]]&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;
== 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;
;[[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;
&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;
== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tools_(es)</id>
		<title>Development/Tools (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tools_(es)"/>
				<updated>2008-10-06T22:35:37Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tools}}&lt;br /&gt;
Esta sección contiene informacion sobre las herramientas para el desarrollo de KDE.&lt;br /&gt;
&lt;br /&gt;
== Depurado y análisis ==&lt;br /&gt;
Lista de herramientas usadas para analizar un programa. Incluye depuradores y perfiles (profilers), por ejemplo:&lt;br /&gt;
&lt;br /&gt;
; Valgrind&lt;br /&gt;
: [[Development/Tools/Valgrind|Valgrind]] te ayuda a encontrar fugas de memoria y bloques de memoria sin inicializar. Como funcionalidades avanzadas tenemos un profiler y más. Valgrind es una de las herramientas de desarrollo mas importante!.&lt;br /&gt;
&lt;br /&gt;
; The GNU Project Debugger (GDB)&lt;br /&gt;
: [http://sources.redhat.com/gdb/ GDB] te ayuda a depurar código fuente. Como GDB está en desarrollo todo el tiempo, es recomendable usar la versión 6.x. Exsiten interfaces de usuario. Mira también el tutorial de depurado [[../Tutorials/Debugging/Debugging with GDB|Debugging with GDB]].&lt;br /&gt;
&lt;br /&gt;
; KDbg&lt;br /&gt;
: [http://www.kdbg.org/ KDbg] es una interfaz gráfica de usuario de GDB, con la cual puedes establecer breakpoints, ir paso a paso a través del código, etc.&lt;br /&gt;
&lt;br /&gt;
; MS Windows tools (Process Explorer, Console, WinDbg, DebugView...)&lt;br /&gt;
: Mas información en la[[Projects/KDE_on_Windows/Tools|página de KDE en Windows]].&lt;br /&gt;
&lt;br /&gt;
== Herramientas de desarrollo ==&lt;br /&gt;
; KDevelop&lt;br /&gt;
: [http://www.kdevelop.org KDevelop] es un excelente IDE para el desarrollo de aplicaciones KDE y Qt en C++. Incluye un depurador integrado, un potente editor con realce de sintaxis, un ''Project Wizard'' para crear aplicaciones desde plantillas, automake/autoconf, e incluso la documentación de clases. Puedes encontrar mas detalles en [http://kdevelop.org/mediawiki/index.php/Main_Page KDevelop wiki].&lt;br /&gt;
&lt;br /&gt;
:Las instrucciones sobre como usar KDevelop con aplicaciones KDE4 están disponibles en [[Getting_Started/Set_up_KDE_4_for_development#KDevelop|this page]].&lt;br /&gt;
&lt;br /&gt;
; Qt Designer&lt;br /&gt;
: Con Trolltech [http://www.trolltech.com/products/qt/features/designer Qt Designer] es fácil diseñar interfaces con botones y &amp;quot;checkboxes&amp;quot;. Tiene características adicionales como deshacer/rehacer, comprobación de conflictos, etc. Puedes encontrar mas detalles en el tutorial [[Development/Tutorials/Using_Qt_Designer|Using Qt Designer]] y en la [http://doc.trolltech.com/4.2/designer-manual.html documentación de Qt].&lt;br /&gt;
&lt;br /&gt;
; MS Visual Studio® Express 2005 IDE (solo Windows)&lt;br /&gt;
: Visual C++® 2005 Express Edition [http://www.microsoft.com/germany/msdn/vstudio/products/express/visualc/default.mspx] es la verión gratuita del compilador Microsoft Visual Studio 2005 de Microsoft, soportado oficialmente por Trolltech desde Qt 4.3.2. Es una opción para compilar Qt y aplicaciones KDE en Windows. [[Projects/KDE_on_Windows/Issues/MSVC|Mas información]].&lt;br /&gt;
&lt;br /&gt;
== Herramientas de internacionalización (i18n) ==&lt;br /&gt;
&lt;br /&gt;
; KBabel&lt;br /&gt;
: [http://kbabel.kde.org/ KBabel] es un conjunto de herramientas para editar y administrar archivos PO. Es un potente y cómodo editor de archivos PO que proporciona navegación entre archivos, edición, posibilidad de buscar traducciones en diferentes diccionarios, comprobación de vocabulario y sintaxis, mostrar diferencias y mucho mas. &lt;br /&gt;
&lt;br /&gt;
: También incluye un &amp;quot;administrador de catálogo&amp;quot;, una vista de administración de archivos que ayuda a mantener y observar archivos PO.  Por último, pero no por ello menos importante, incluye una aplicación de diccionario independiente que ofrece la posibilidad adicional de acceder a los potentes diccionarios de KBabel. KBabel te ayudará a traducir rápido y también a conseguir traducciones coherentes.&lt;br /&gt;
&lt;br /&gt;
; Dr. Klash&lt;br /&gt;
: Esta pequeña utilidad, una vez activada, puede presentar un informe sobre los conflictos de teclado en los menús. No solo es útil para los traductores, sino también los para desarrolladores. Una pequeña edición de {{path|`kde-config --localprefix`/share/config/kdeglobals}} activa esta funcionalidad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Development]&lt;br /&gt;
CheckAccelerators=F12&lt;br /&gt;
AutoCheckAccelerators=false&lt;br /&gt;
AlwaysShowCheckAccelerators=false&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Al pulsar F12 se mostrará un diálogo que contendrá que atajos de teclado de la interfaz activa crean conflictos y proporcionará sugerencias para unos nuevos. Si no existen conflictos o Dr. Klash no tiene ninguna sugerencia, no se mostrará nada.&lt;br /&gt;
&lt;br /&gt;
: Con &amp;lt;tt&amp;gt;AutoCheckAccelerators&amp;lt;/tt&amp;gt; activado, se mostrará automáticamente el diálogo si existe un conflicto, y &amp;lt;tt&amp;gt;AlwaysShowCheckAccelerators&amp;lt;/tt&amp;gt; puede forzar a que el dialogo siempre aparezca aunque no existan conflictos.&lt;br /&gt;
&lt;br /&gt;
; El lenguaje x-test &lt;br /&gt;
: Este lenguaje de ayuda actúa como un depurador que permite a la gente encontrar cadenas no traducidas. Si inicias tu aplicación con &amp;quot;x-test&amp;quot;, todas las cadenas traducidas aparecerán marcadas con xx's al principio. En primer lugar tienes que comprobar dichas &amp;quot;traducciones&amp;quot; en l10n-kde4/x-test, e instalarlas después.&lt;br /&gt;
&lt;br /&gt;
: Despues de haber compilado e instalado l10n-kde4/x-test, ejecuta tu aplicación usando &amp;quot;x-test&amp;quot;. Esto lo puedes hacer lanzandola desde la linea de ordenes de esta manera:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; KDE_LANG=x-test kspread&lt;br /&gt;
&lt;br /&gt;
: De esta forma, arrancará KSpread usando &amp;quot;x-test&amp;quot;, sin importar cual sea la configuración del idioma. Observa las cadenas que no tienen xx's. Si una cadena no tiene xx's, podría deberse a que faltan llamadas a i18n o incluso archivos .pot desaparecidos o generados incorrectamente. Consulta los tutoriales de i18n para mas información.&lt;br /&gt;
&lt;br /&gt;
: Cuando compruebes cadenas sin traducir, asegurate que compruebas toda la ayuda &amp;quot;¿Qué es esto?&amp;quot; y los tooltips.&lt;br /&gt;
&lt;br /&gt;
=== Examinando archivos .po ===&lt;br /&gt;
&lt;br /&gt;
Puedes mirar en los archivos .po traducidos para comprobar si una cadena está presente y ha sido traducida. Por ejemplo, aquí tienes una porción de {{path|l10n/es/messages/kdebase/kdesu.po}}: &lt;br /&gt;
&lt;br /&gt;
 #: kdesu.cpp:100 kdesu.cpp:101&lt;br /&gt;
 msgid &amp;quot;Specifies the command to run&amp;quot;&lt;br /&gt;
 msgstr &amp;quot;Indica la orden a ejecutar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
La cadena a traducir empieza en la línea msgid. La cadena traducida está en la línea msgstr. Ten en cuenta que la cadena a traducir puede necesitarse en dos partes del código diferentes. Los archivos .po ahorran a los traductores tener que traducir la misma cadena dos veces.&lt;br /&gt;
&lt;br /&gt;
Puedes usar también KBabel para examinar archivos {{path|.po}}. KBabel es parte del módulo kdesdk.&lt;br /&gt;
{{note|Puedes encontrar mas información sobre la escritura y traducción de documentación en el [http://l10n.kde.org/ sitio web de l10n].}}&lt;br /&gt;
&lt;br /&gt;
== Herramientas de ayuda ==&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tools/Using kde-config|Obtener información sobre la instalación de KDE - kde-config]] &lt;br /&gt;
: La herramienta kde-config te ayuda a saber más acerca de una instalación de KDE&lt;br /&gt;
&lt;br /&gt;
; [[Development/Tools/Using kfmclient|Manejar Konqueror mediante scripts - kfmclient]] &lt;br /&gt;
: kfmclient es una pequeña herramienta para comunicarse con Konqueror.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/Using kconf_update|Actualizar archivos de configuración del usuario - kconf_update]]&lt;br /&gt;
: kconf_update es una herramienta diseñada para actualizar archivos de configuración del usuario.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/apidox|Generar apidox]]&lt;br /&gt;
: Herramientas que ayudan a desarrollar y generar la documentación de la API de tu código.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tools/Automoc4|Automoc4]]&lt;br /&gt;
: Es una herramienta de ayuda necesaria para construir KDE4. Genera automáticamente archivos moc.&lt;br /&gt;
&lt;br /&gt;
== Asegurar la calidad ==&lt;br /&gt;
&lt;br /&gt;
; Construcción continua - Dashboard &lt;br /&gt;
: [http://developer.kde.org/~dirk/dashboard/ Todos los módulos de kde en Dirk's dashboard]&lt;br /&gt;
: [http://public.kitware.com/dashboard.php?name=kde kdelibs en kitware]&lt;br /&gt;
&lt;br /&gt;
; [http://englishbreakfastnetwork.org/ English Breakfast Network] - Análisis estático&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/krazy/ Krazy ] - Análisis de código, [[Development/Tutorials/Code_Checking|Tutorial de uso]]&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/apidocs/ APIDOX] - Estadísticas de la documentación de la API&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/sanitizer/ Sanitizer] - Verificador de DocBook&lt;br /&gt;
: [http://www.englishbreakfastnetwork.org/usability/ Comprobación de usabilidad]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Creatingyourfirstplasmoid1_(es).png</id>
		<title>File:Creatingyourfirstplasmoid1 (es).png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Creatingyourfirstplasmoid1_(es).png"/>
				<updated>2008-09-30T21:03:06Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)</id>
		<title>Development/Tutorials/Plasma/GettingStarted (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Plasma/GettingStarted_(es)"/>
				<updated>2008-09-23T20:14:36Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Plasma/GettingStarted}}&lt;br /&gt;
&lt;br /&gt;
{{TutorialBrowser|&lt;br /&gt;
&lt;br /&gt;
series=Plasma Tutorial|&lt;br /&gt;
&lt;br /&gt;
name=Creating your first Plasmoid|&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=| &lt;br /&gt;
&lt;br /&gt;
reading=[[Development/Tutorials/CMake|CMake]]&lt;br /&gt;
}}&lt;br /&gt;
==Abstract==&lt;br /&gt;
This tutorial needs KDE 4.1 (trunk) to build.&lt;br /&gt;
We are going to create a simple plasmoid in this tutorial. To keep things simple, we will only create a static plasmoid which will contain the following items: &lt;br /&gt;
&lt;br /&gt;
* An SVG Image&lt;br /&gt;
* Icon &lt;br /&gt;
* Some nice text&lt;br /&gt;
&lt;br /&gt;
[[image:creatingyourfirstplasmoid1.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
== The Code ==&lt;br /&gt;
=== The .desktop file ===&lt;br /&gt;
Every Plasmoid needs a .desktop file to tell plasma how it should be started and what name it carries. &lt;br /&gt;
&lt;br /&gt;
'''plasma-applet-tutorial1.desktop'''&lt;br /&gt;
&amp;lt;code ini&amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Tutorial 1&lt;br /&gt;
Comment=Plasma Tutorial 1&lt;br /&gt;
Type=Service&lt;br /&gt;
&lt;br /&gt;
X-KDE-ServiceTypes=Plasma/Applet&lt;br /&gt;
X-KDE-Library=plasma_applet_tutorial1&lt;br /&gt;
X-KDE-PluginInfo-Author=Bas Grolleman&lt;br /&gt;
X-KDE-PluginInfo-Email=bgrolleman@emendo-it.nl&lt;br /&gt;
X-KDE-PluginInfo-Name=tutorial1&lt;br /&gt;
X-KDE-PluginInfo-Version=0.1&lt;br /&gt;
X-KDE-PluginInfo-Website=http://plasma.kde.org/&lt;br /&gt;
X-KDE-PluginInfo-Category=Examples&lt;br /&gt;
X-KDE-PluginInfo-Depends=&lt;br /&gt;
X-KDE-PluginInfo-License=GPL&lt;br /&gt;
X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The most important bits are the '''X-KDE-Library''' and '''X-KDE-PluginInfo-Name''', they are the &amp;quot;glue&amp;quot; between your class and plasma, without it, nothing will start.  For '''X-KDE-PluginInfo-Category''', refer to the [[Projects/Plasma/PIG | PIG]].&lt;br /&gt;
&lt;br /&gt;
=== The header file ===&lt;br /&gt;
This is the example header file. Comments have been added in the code for clarity.&lt;br /&gt;
&lt;br /&gt;
'''plasma-tutorial1.h'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
// Here we avoid loading the header multiple times&lt;br /&gt;
#ifndef Tutorial1_HEADER&lt;br /&gt;
#define Tutorial1_HEADER&lt;br /&gt;
// We need the Plasma Applet headers&lt;br /&gt;
#include &amp;lt;KIcon&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;Plasma/Applet&amp;gt;&lt;br /&gt;
#include &amp;lt;Plasma/Svg&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
class QSizeF;&lt;br /&gt;
 &lt;br /&gt;
// Define our plasma Applet&lt;br /&gt;
class PlasmaTutorial1 : public Plasma::Applet&lt;br /&gt;
{&lt;br /&gt;
    Q_OBJECT&lt;br /&gt;
    public:&lt;br /&gt;
        // Basic Create/Destroy&lt;br /&gt;
        PlasmaTutorial1(QObject *parent, const QVariantList &amp;amp;args);&lt;br /&gt;
        ~PlasmaTutorial1();&lt;br /&gt;
 &lt;br /&gt;
        // The paintInterface procedure paints the applet to screen&lt;br /&gt;
        void paintInterface(QPainter *painter,&lt;br /&gt;
                const QStyleOptionGraphicsItem *option,&lt;br /&gt;
                const QRect&amp;amp; contentsRect);&lt;br /&gt;
	void init();&lt;br /&gt;
&lt;br /&gt;
    private:&lt;br /&gt;
        Plasma::Svg m_svg;&lt;br /&gt;
        KIcon m_icon;&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
// This is the command that links your applet to the .desktop file&lt;br /&gt;
K_EXPORT_PLASMA_APPLET(tutorial1, PlasmaTutorial1)&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== QRectF boundingRect() ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;boundingRect()&amp;lt;/tt&amp;gt; function tells plasma the actual size of the plasmoid. This is important because we need to know how much space is taken on the screen. &lt;br /&gt;
{{tip|&lt;br /&gt;
If you have issues with your plasmoid leaving pixels behind when dragging, this is usually a result of an incorrect boundingRect()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== void paintInterface(QRectF contentsRect) ====&lt;br /&gt;
This can be considered the main function since it paints the plasmoid on to the screen. Here, you define how you want your plasmoid to look.&lt;br /&gt;
You should only paint in the boundaries defined by contentsRect and avoid using geometry(). When a plasmoid does not have a standard background, e.g. when it's disabled with a setBackgroundHints() call or it's in the panel, geometry() and boundingRect() behave the same; however, when the standard background is enabled (the usual case), the appplet will have a margin where it should not be painted&lt;br /&gt;
&lt;br /&gt;
==== K_EXPORT_PLASMA_APPLET ( &amp;lt;name&amp;gt;, &amp;lt;class&amp;gt; ) ====&lt;br /&gt;
This is a small but very important part that links your classname to the applet name in the .desktop file. If your applet doesn't seem to get loaded, there may be a difference between this declaration and your .desktop file&lt;br /&gt;
&lt;br /&gt;
{{tip|&lt;br /&gt;
The K_EXPORT_PLASMA_APPLET adds &amp;quot;plasma_applet_&amp;quot;, please pay attention to this when setting up your .desktop file to avoid a name difference&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== The actual work file ===&lt;br /&gt;
Here is the body of the function, again with a lot of comments in between. &lt;br /&gt;
&lt;br /&gt;
'''plasma-tutorial1.cpp'''&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
#include &amp;quot;plasma-tutorial1.h&amp;quot;&lt;br /&gt;
#include &amp;lt;QPainter&amp;gt;&lt;br /&gt;
#include &amp;lt;QFontMetrics&amp;gt;&lt;br /&gt;
#include &amp;lt;QSizeF&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#include &amp;lt;plasma/svg.h&amp;gt;&lt;br /&gt;
#include &amp;lt;plasma/theme.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
PlasmaTutorial1::PlasmaTutorial1(QObject *parent, const QVariantList &amp;amp;args)&lt;br /&gt;
    : Plasma::Applet(parent, args),&lt;br /&gt;
    m_svg(this),&lt;br /&gt;
    m_icon(&amp;quot;document&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    m_svg.setImagePath(&amp;quot;widgets/background&amp;quot;);&lt;br /&gt;
    // this will get us the standard applet background, for free!&lt;br /&gt;
    setBackgroundHints(DefaultBackground);&lt;br /&gt;
    resize(200, 200);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
PlasmaTutorial1::~PlasmaTutorial1()&lt;br /&gt;
{&lt;br /&gt;
    if (hasFailedToLaunch()) {&lt;br /&gt;
        // Do some cleanup here&lt;br /&gt;
    } else {&lt;br /&gt;
        // Save settings&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void PlasmaTutorial1::init()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    // A small demonstration of the setFailedToLaunch function&lt;br /&gt;
    if (m_icon.isNull()) {&lt;br /&gt;
        setFailedToLaunch(true, &amp;quot;No world to say hello&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void PlasmaTutorial1::paintInterface(QPainter *p,&lt;br /&gt;
        const QStyleOptionGraphicsItem *option, const QRect &amp;amp;contentsRect)&lt;br /&gt;
{&lt;br /&gt;
    p-&amp;gt;setRenderHint(QPainter::SmoothPixmapTransform);&lt;br /&gt;
    p-&amp;gt;setRenderHint(QPainter::Antialiasing);&lt;br /&gt;
 &lt;br /&gt;
    // Now we draw the applet, starting with our svg&lt;br /&gt;
    m_svg.resize((int)contentsRect.width(), (int)contentsRect.height());&lt;br /&gt;
    m_svg.paint(p, (int)contentsRect.left(), (int)contentsRect.top());&lt;br /&gt;
 &lt;br /&gt;
    // We place the icon and text&lt;br /&gt;
    p-&amp;gt;drawPixmap(7, 0, m_icon.pixmap((int)contentsRect.width(),(int)contentsRect.width()-14));&lt;br /&gt;
    p-&amp;gt;save();&lt;br /&gt;
    p-&amp;gt;setPen(Qt::white);&lt;br /&gt;
    p-&amp;gt;drawText(contentsRect,&lt;br /&gt;
                Qt::AlignBottom | Qt::AlignHCenter,&lt;br /&gt;
                &amp;quot;Hello Plasmoid!&amp;quot;);&lt;br /&gt;
    p-&amp;gt;restore();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
#include &amp;quot;plasma-tutorial1.moc&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Plasma/Svg ====&lt;br /&gt;
As you can see in the example code we are using the {{class|Plasma::Svg}} object, there are some important things to note here.&lt;br /&gt;
&lt;br /&gt;
First we're using a relative path '''widgets/background''' which causes {{class|Plasma::Svg}} to use {{class|Plasma::Theme}} to locate the SVG data. While {{class|Plasma::Svg}} does support loading arbitrary files when passed an absolute path, use relative paths from the theme as often as possible as it makes Plasma skinable and the individual plasmoids look like a combined whole instead of a group of separate unrelated applications. You can see a list of available image components on the [[Projects/Plasma/Theme|Plasma Theme page]].&lt;br /&gt;
&lt;br /&gt;
In either mode, {{class|Plasma::Svg}} can be used to draw a subset of the SVG file by passing it an element id that appears in the SVG document. As a good example, if you open the clock.svg file that ships with the default theme, you will see that it has a background, 3 handles (hour, minute and seconds) and a foreground (the glass). Due to the ability to put all the elements in one file the SVG file shows a clock. This is much nicer for artists compared to editing 5 separate files that they have to imagine on top of each other, and much nicer for performance as only one SVG renderer and one file read from disk is necessary.&lt;br /&gt;
&lt;br /&gt;
==== setBackgroundHints(DefaultBackground) ====&lt;br /&gt;
Since drawing a background is a common function there is fast and easier way of doing it. By adding &amp;lt;tt&amp;gt;setBackgroundHints(DefaultBackground)&amp;lt;/tt&amp;gt; to the code, the default Plasma background gets drawn behind your plasmoid. This not only saves you time and code, but creates a more consistent presentation for the user.&lt;br /&gt;
&lt;br /&gt;
==== The init() method ====&lt;br /&gt;
In the constructor you only tell plasma about the background and configuration file if any. You also set the start size in the constructor. After that, plasma will take care of any resizing and you never have to worry about size. In the &amp;lt;tt&amp;gt;init()&amp;lt;/tt&amp;gt; method you initialize everything that needs to be initialize such as reading config data for example.&lt;br /&gt;
&lt;br /&gt;
==== hasFailedToLaunch() ====&lt;br /&gt;
If for some reason, the applet fails to get up on its feet (the library couldn't be loaded, necessary hardware support wasn't found, etc..) this method returns true. Using this function gives your application a chance to cleanup before quiting. &lt;br /&gt;
&lt;br /&gt;
==== setFailedToLaunch(bool, QString) ====&lt;br /&gt;
When your application is unable to start, this function allows you to inform Plasma and give an optional reason why. Plasma will then draw a standardized error interface to inform the user of the situation and your applet will not be called upon to do any drawing on its own from that point forward. If your plasmoid becomes more complex and depends on multiple factors this is the nicest way to cleanup.&lt;br /&gt;
&lt;br /&gt;
==== dataUpdated ====&lt;br /&gt;
If you would connect to any of plasma's data-engines you would have to implement a function called dataUpdated in your plasmoid. The latter is called if the data-engine sends you data, i.e. your plasmoid should recalculate its contents.&lt;br /&gt;
&lt;br /&gt;
==== Determine the applet size and geometry: geometry() and contentsRect() ====&lt;br /&gt;
If you need to know, in your applet code, what the applet size and geometry is, call contentsRect() and contentsRect().size(). Avoid calling geometry() and size() because they don't take into account the margin's size set by the applets default background.&lt;br /&gt;
Also avoid using absolute numbers to position items in the applet like QPoint(0, 0) to indicate the top-left point of your applet, instead use contentsRect().topLeft().&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;
# Project Needs a name ofcourse&lt;br /&gt;
project(plasma-tutorial1)&lt;br /&gt;
&lt;br /&gt;
# Find the required Libaries&lt;br /&gt;
find_package(KDE4 REQUIRED)&lt;br /&gt;
include(KDE4Defaults)&lt;br /&gt;
find_package(Plasma REQUIRED)&lt;br /&gt;
&lt;br /&gt;
add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})&lt;br /&gt;
include_directories(&lt;br /&gt;
   ${CMAKE_SOURCE_DIR}&lt;br /&gt;
   ${CMAKE_BINARY_DIR}&lt;br /&gt;
   ${KDE4_INCLUDES}&lt;br /&gt;
   )&lt;br /&gt;
&lt;br /&gt;
# We add our source code here&lt;br /&gt;
set(tutorial1_SRCS plasma-tutorial1.cpp)&lt;br /&gt;
&lt;br /&gt;
# Now make sure all files get to the right place&lt;br /&gt;
kde4_add_plugin(plasma_applet_tutorial1 ${tutorial1_SRCS})&lt;br /&gt;
target_link_libraries(plasma_applet_tutorial1 &lt;br /&gt;
                      ${PLASMA_LIBS} ${KDE4_KDEUI_LIBS})&lt;br /&gt;
&lt;br /&gt;
install(TARGETS plasma_applet_tutorial1&lt;br /&gt;
        DESTINATION ${PLUGIN_INSTALL_DIR})&lt;br /&gt;
&lt;br /&gt;
install(FILES plasma-applet-tutorial1.desktop&lt;br /&gt;
        DESTINATION ${SERVICES_INSTALL_DIR})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing the Applet ==&lt;br /&gt;
If your current Development Environment differs from the Test Installation, you have to run cmake with -DCMAKE_INSTALL_PREFIX=/usr/lib/kde4/ (replace with your $KDEDIR). Then run make. If succesfull the applet can be installed by running sudo make install&lt;br /&gt;
or&lt;br /&gt;
* cp ./lib/plasma_applet_tutorial1.so $KDEDIR/lib &lt;br /&gt;
* cp ./plasma-applet-tutorial1.desktop $KDEDIR/share/kde4/services/&lt;br /&gt;
&lt;br /&gt;
and run kbuildsycoca4 (so that KDE apps will know about the new desktop files).&lt;br /&gt;
In order to test your Applet you can use the '''plasmoidviewer''' program:&lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
plasmoidviewer applet_name&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where '''applet_name''' is the value specified into .desktop for the '''X-KDE-PluginInfo-Name''' key.&lt;br /&gt;
&lt;br /&gt;
Otherwise you can restart plasma, so the Applet will be displayed in the Applet Browser: &lt;br /&gt;
&amp;lt;code bash&amp;gt;&lt;br /&gt;
kbuildsycoca4&lt;br /&gt;
kquitapp plasma&lt;br /&gt;
plasma &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If that doesn't work you will have to restart your KDE session by logging out and back in.&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2008-09-23T20:10:15Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish, update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 4, también está traducido el punto 13 (Plasma)}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&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 ===&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;
== 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/NepomukServer|The Nepomuk Server]]&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;
&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;
== 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_(es)|Primeros pasos con los Plasmoids]]&lt;br /&gt;
:''Crea tu primer widget de Plasma, o Plasmoid, en C++ con un fondo SVG, un icono y algo de texto''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir DataEngine]]&lt;br /&gt;
:''DataEngines proporcionan una [http://api.kde.org/4.0-api/kdebase-apidocs/workspace/libs/plasma/html/classPlasma_1_1DataEngine.html interfaz estandarizada] para varias fuentes de datos para usarlos en las visualizaciones. Aprende que es un DataEngine y como escribir uno''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Usar DataEngines en los Plasmoids]]&lt;br /&gt;
:''Con un DateEngine, es posible recuperar datos para mostrarlos de una forma simple y estandar. Este tutorial abarca el tema de como usar DataEngines en los Plasmoids''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los &amp;quot;Runners&amp;quot; son plugins que proporcionan la funcionalidad de busqueda basada en acciones mediante el dialogo &amp;quot;ejecutar orden&amp;quot; en el area de trabajo de Plasma. Estos plugins pueden ser usados por cualquier aplicación que enlace con libplasma''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guía para crear tu primer tema de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Usar Extenders]]&lt;br /&gt;
:''Esta guía te muestra como crear un simple applet (destripando el applet kuiserver) que use extenders''.&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/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;
== 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;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/K_Hot_New_Stuff2|New introduction to KGet Hot New Stuff2]]&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;
== 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;
;[[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;
&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;
== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2008-09-23T20:09:31Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish, update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 4, también está traducido el punto 13 (Plasma)}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&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 ===&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;
== 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/NepomukServer|The Nepomuk Server]]&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;
&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;
== 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|Primeros pasos con los Plasmoids]]&lt;br /&gt;
:''Crea tu primer widget de Plasma, o Plasmoid, en C++ con un fondo SVG, un icono y algo de texto''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/DataEngines|Escribir DataEngine]]&lt;br /&gt;
:''DataEngines proporcionan una [http://api.kde.org/4.0-api/kdebase-apidocs/workspace/libs/plasma/html/classPlasma_1_1DataEngine.html interfaz estandarizada] para varias fuentes de datos para usarlos en las visualizaciones. Aprende que es un DataEngine y como escribir uno''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingDataEngines|Usar DataEngines en los Plasmoids]]&lt;br /&gt;
:''Con un DateEngine, es posible recuperar datos para mostrarlos de una forma simple y estandar. Este tutorial abarca el tema de como usar DataEngines en los Plasmoids''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/AbstractRunner|Crear Runners]]&lt;br /&gt;
:''Los &amp;quot;Runners&amp;quot; son plugins que proporcionan la funcionalidad de busqueda basada en acciones mediante el dialogo &amp;quot;ejecutar orden&amp;quot; en el area de trabajo de Plasma. Estos plugins pueden ser usados por cualquier aplicación que enlace con libplasma''.&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guía para crear tu primer tema de Plasma.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Usar Extenders]]&lt;br /&gt;
:''Esta guía te muestra como crear un simple applet (destripando el applet kuiserver) que use extenders''.&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/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;
== 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;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/K_Hot_New_Stuff2|New introduction to KGet Hot New Stuff2]]&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;
== 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;
;[[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;
&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;
== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-09-21T21:40:06Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2008-09-21T21:39:40Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]], Conocimiento básico de XML|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Guardar y Abrir]]| &lt;br /&gt;
&lt;br /&gt;
reading=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial introduce el concepto de las acciones. Las acciones son una forma unificada de proporcionar al usuario la forma de interactuar con tu programa.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si queremos permitir que el usuario del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]] pueda borrar la caja de texto pulsando un botón de la barra de herramientas, desde una entrada del menú File o a través de un atajo de teclado, podremos realizarlo mediante un {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3_(es).png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
Un {{class|KAction}} es un objeto que contiene toda la información sobre el icono y el atajo de teclado asociado a una determinada acción. La acción se conecta a un [http://doc.trolltech.com/latest/signalsandslots.html slot], que lleva a cabo el trabajo de la acción.&lt;br /&gt;
&lt;br /&gt;
== El código ==&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;Area de texto usando KAction.&amp;quot;),&lt;br /&gt;
      KAboutData::License_GPL,&lt;br /&gt;
      ki18n(&amp;quot;Copyright (c) 2008 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;
Pocas cosas han cambiado en &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, solo se ha actualizado la declaración de KAboutData para indicar que ahora estamos en el 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;
Sólo se ha añadido la función &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt;, que realizará el trabajo de configurar los 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;Limpiar&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;limpiar&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;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicación==&lt;br /&gt;
El archivo está basado en el código de KXmlGuiWindow del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]]. La mayoría de los cambios están en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, un cambio estructural importante es que el constructor de MainWindow ahora llama a &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; en vez de a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. En &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; va el nuevo código de KAction antes de llamar a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Creando el objeto KAction===&lt;br /&gt;
KAction se construye en varios pasos. El primero es incluir la biblioteca &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; y crear el 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;
Crear un KAction nuevo llamado &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&lt;br /&gt;
Ahora que tenemos nuestro objeto KAction, podemos empezar a establecer sus propiedades. El siguiente código establece el texto que se mostrará en el menú y el de debajo del icono del &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; en la barra de herramientas:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;clearAction-&amp;gt;setText(i18n(&amp;quot;Limpiar&amp;quot;));&amp;lt;/code&amp;gt;&lt;br /&gt;
Ten en cuenta que el texto se pasa a través de la función i18n(), esto es necesario para para que la UI pueda ser traducida (puedes encontrar mas información en el [[Development/Tutorials/Localization/i18n|tutorial de i18n]]).&lt;br /&gt;
&lt;br /&gt;
====Icono====&lt;br /&gt;
Si la acción va a mostrarse en el la barra de herramientas, estaría bien que tuviera un icono que la representara. El siguiente código establece como icono el icono estándar de KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; mediante el uso de la función &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt;:&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;
====Atajo de teclado====&lt;br /&gt;
Establecer un atajo de teclado para lanzar nuestra acción es igual de 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;
Asocia Ctrl+W a la acción.&lt;br /&gt;
&lt;br /&gt;
===Añadir a la colección===&lt;br /&gt;
Para que la acción sea accesible por el framework XMLGUI (explicado en profundidad mas adelante) debe añadirse a la ''colección de acciones'' de la aplicación. La colección de acciones es accesible mediante la función &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&amp;lt;code cppqt&amp;gt;&lt;br /&gt;
actionCollection()-&amp;gt;addAction(&amp;quot;limpiar&amp;quot;, clearAction);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Con esta llamada, la KAction &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; se añade a la colección y toma el nombre de ''limpiar''. Este nombre (''limpiar'') lo usa el framework XMLGUI para referirse a la acción.&lt;br /&gt;
&lt;br /&gt;
====Conectando la acción====&lt;br /&gt;
Ahora que hemos establecido la acción, es necesario conectarla a algo útil. En este caso (porque queremos limpiar el área de texto), conectamos nuestra acción con la acción &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; perteneciente a KTextEdit (que como era de esperar, limpia 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;
Es lo mismo que se llevaría a cabo en Qt con una {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
Para las acciones que normalmente aparecen en casi todas las aplicaciones KDE, como 'quit', 'save', y 'load', existen unas acciones ya creadas, accesibles a través de [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].&lt;br /&gt;
&lt;br /&gt;
Son muy sencillas de usar. Una vez que has incluido las bibliotecas (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simplemente añadelas con la función que quieras que realicen. Por ejemplo:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
Crea una KAction con el icono correcto, el texto y el atajo de teclado, e incluso la añade al menú File.&lt;br /&gt;
&lt;br /&gt;
==Añadir la acción a los menús y a las barras de herramientas==&lt;br /&gt;
Por el momento, hemos creado la nueva acción &amp;quot;Limpiar&amp;quot; pero no se ha asociado a ningún menú o barra de herramientas. Esto lo podemos hacer con una tecnología de KDE llamada XMLGUI, que hace cosas majas como barras de herramientas móviles.&lt;br /&gt;
&lt;br /&gt;
{{note|En una versión posterior de KDE4, XMLGUI puede ser reemplazada por un nuevo framework llamado liveui. Por ahora, XMLGUI es la única manera correcta de configurar la UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
La función &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; de la clase {{class|KXmlGuiWindow}} depende del sistema XMLGUI para construir la GUI, el cual la realiza analizando el archivo de descripción XML de la interfaz.&lt;br /&gt;
&lt;br /&gt;
La regla para establecer el nombre del archivo XML es &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, donde &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; es el nombre que estableces en {{class|KAboutData}} (en este caso, ''tutorial 3''). Por lo que en nuestro ejemplo, llamamos al archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, y está localizado en el directorio del código. Cmake maneja donde será puesto el archivo en última instancia. &lt;br /&gt;
&lt;br /&gt;
==Archivo ''appname''ui.rc==&lt;br /&gt;
Como la descripción de la UI está definida en el archivo XML, el layout debe seguir unas reglas estrictas. Este tutorial no profundizará en exceso en este aspecto, pero para mas información puedes echar un vistazo a la [[Development/Architecture/KDE4/XMLGUI_Technology|página de XMLGUI]] (aquí tienes un tutorial antiguo: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html])&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;limpiar&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;limpiar&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;
La etiqueta &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; permite describir la barra de herramientas, que normalmente es la barra con los iconos de la parte superior de la ventana. Se le da el nombre único de ''mainToolBar'', y usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt;, es visible a los usuarios con el nombre ''Main Toolbar''. La acción limpiae se añade a la barra de herramientas usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt;,  el nombre del parámetro en esta etiqueta es la cadena que pasamos a KActionCollection con &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Además de tener la acción en la barra de herramientas, también se puede añadir a la barra de menú. Aquí la acción se ha añadido al menú ''File'' de &amp;lt;tt&amp;gt;MenuBar&amp;lt;/tt&amp;gt; de la misma manera que la añadimos a la barra de herramientas.&lt;br /&gt;
&lt;br /&gt;
Cambia el atributo 'version' de la etiqueta &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; si cambiaste el archivo .rc desde la última instalación, para forzar una actualización de la cache del sistema.&lt;br /&gt;
&lt;br /&gt;
Algunas notas sobre la interacción entre el código y el archivo .rc: Los menús aparecen automáticamente y deberían tener una etiqueta hija &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; a menos que se refieran a los menús estándar. Las acciones deberán crearse manualmente y se insertarán mediante actionCollection() usando el nombre del archivo .rc. Las acciones pueden ocultarse o desactivarse, mientras que los menús no.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
Por último, el &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; hay que ubicarlo en algún lugar donde KDE pueda encontrarlo (no lo puedes dejar en el directorio de las fuentes!). '''Esto significa que el proyecto tiene que ser instalado en algún sitio'''.&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;
Este archivo es casi idéntico al del tutorial2, peor con dos lineas extra al final que describen donde se instalará los archivos. En primer lugar, el objetivo &amp;lt;tt&amp;gt;tutorial3&amp;lt;/tt&amp;gt; se instala en &amp;lt;tt&amp;gt;BIN_INSTALL_DIR&amp;lt;/tt&amp;gt;, entonces el archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt; que describe el layout de la interfaz de usuario se instala en el directorio de datos de las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
===Make, instalar y ejecutar===&lt;br /&gt;
Si no tienes acceso de escritura a tu directorio de instalación de KDE4, puedes instalarlo en una carpeta de tu directorio personal.&lt;br /&gt;
&lt;br /&gt;
Para decirle a CMake donde instalar el programa, establece la variable &amp;lt;tt&amp;gt;DCMAKE_INSTALL_PREFIX&amp;lt;/tt&amp;gt;. Probablemente quieras instalarlo en algún sitio local para testearlo (probablemente sea un poco tonto hacer el esfuerzo de instalar estos tutoriales en el directorio de KDE), por lo que podría ser el siguiente caso:&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;
Creará una estructura de directorios como la de KDE en tu directorio de usuario e instalara el ejecutable en {{path|$HOME/bin/tutorial3}}.&lt;br /&gt;
&lt;br /&gt;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Saving_and_loading|Tutorial 4 - Guardar y Abrir]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial3_(es).png</id>
		<title>File:Introtokdetutorial3 (es).png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial3_(es).png"/>
				<updated>2008-09-21T21:27:05Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2008-09-21T20:24:38Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]], Conocimiento básico de XML|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Saving and loading]]| &lt;br /&gt;
&lt;br /&gt;
reading=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial introduce el concepto de las aciones. Las acciones son una forma unificada de proporcionar al usuario la forma de interactuar con tu programa.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si queremos permitir que el usuario del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]] pueda borrar la caja de texto pulsando un botón de la barra de herramientas, desde una entrada del menú File o a través de un atajo de teclado, podemos realizarlo con un {{class|KAction}}.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial3.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KAction==&lt;br /&gt;
Un {{class|KAction}} es un objeto que contiene toda la información sobre el icono y el atajo de teclado asociado a una determinada acción. La acción se conecta a un [http://doc.trolltech.com/latest/signalsandslots.html slot], que lleva a cabo el trabajo de la acción.&lt;br /&gt;
&lt;br /&gt;
== El código ==&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;
Esta vez pocas cosas han cambiado en &amp;lt;tt&amp;gt;main.cpp&amp;lt;/tt&amp;gt;, solo se ha actualizado la declaración de KAboutData para indicar que ahora estamos en el 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;
Sólo se ha añadido la función &amp;lt;tt&amp;gt;void setupActions()&amp;lt;/tt&amp;gt;, que realizará el trabajo de configurar los 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;
==Explicación==&lt;br /&gt;
El archivo está basado en el codigo de KXmlGuiWindow del [[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2]]. La mayoría de los cambios están en &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt;, un cambio estructural importante es que el constructor de MainWindow ahora llama a &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; en vez de a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;. En &amp;lt;tt&amp;gt;setupActions()&amp;lt;/tt&amp;gt; va el nuevo código de KAction antes de llamar a &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Creando el objeto KAction===&lt;br /&gt;
KAction se construye en varios pasos. El primero es incluir la biblioteca &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; y crear el 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;
Crear un KAction nuevo llamado &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&lt;br /&gt;
Ahora que tenemos nuestro objeto KAction, podemos empezar a establecer sus propiedades. El siguiente código establece el texto que se mostrará en el menú y el de debajo del icono del &amp;lt;tt&amp;gt;KAction&amp;lt;/tt&amp;gt; en la barra de herramientas:&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;
Ten en cuenta que el texto se pasa a través de la función i18n(), esto es necesario para para que la UI pueda ser traducida (puedes encontrar mas información en el [[Development/Tutorials/Localization/i18n|tutorial de i18n]]).&lt;br /&gt;
&lt;br /&gt;
====Icono====&lt;br /&gt;
Si la acción va a mostrarse en el la barra de herramientas, estaría bien que tuviera un icono que la representara. El siguiente código establece como icono el icono estandar de KDE &amp;lt;tt&amp;gt;document-new&amp;lt;/tt&amp;gt; mediante el uso de la función &amp;lt;tt&amp;gt;setIcon()&amp;lt;/tt&amp;gt;:&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;
====Atajo de teclado====&lt;br /&gt;
Establecer un atajo de teclado para lanzar nuestra acción es igual de 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;
Asocia Ctrl+W a la acción.&lt;br /&gt;
&lt;br /&gt;
===Añadir a la colección===&lt;br /&gt;
Para que la acción sea accesible por el framework XMLGUI (explicado en profundidad mas adelante) debe añadirse a la ''colección de acciones'' de la aplicación. La colección de acciones es accesible mediante la función &amp;lt;tt&amp;gt;actionCollection()&amp;lt;/tt&amp;gt;: &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;
Con esta llamada, la KAction &amp;lt;tt&amp;gt;clearAction&amp;lt;/tt&amp;gt; se añade a la colección y toma el nombre de ''clear''. Este nombre (''clear'') lo usa el framework XMLGUI para referirse a la acción.&lt;br /&gt;
&lt;br /&gt;
====Conectando la acción====&lt;br /&gt;
Ahora que hemos establecido la acción, es necesario conectarla a algo útil. En este caso (porque queremos limpiar el área de texto), conectamos nuestra acción con la acción &amp;lt;tt&amp;gt;clear()&amp;lt;/tt&amp;gt; perteneciente a KTextEdit (que como era de esperar, limpia 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;
Es lo mismo que se llevaría a cabo en Qt con una {{qt|QAction}}.&lt;br /&gt;
&lt;br /&gt;
===KStandardAction===&lt;br /&gt;
Para las acciónes que normalmente aparecen en casi todas las aplicaciones KDE, como 'quit', 'save', y 'load', existen unas acciones ya creadas, accesibles a través de [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].&lt;br /&gt;
&lt;br /&gt;
Son muy sencillas de usar. Una vez que has incluido las bibliotecas (&amp;lt;tt&amp;gt;#include &amp;lt;KStandardAction&amp;gt;&amp;lt;/tt&amp;gt;), simplemente añadelas con la función que quieras que realicen. Por ejemplo:&lt;br /&gt;
&amp;lt;code cppqt&amp;gt;KStandardAction::quit(kapp, SLOT(quit()), actionCollection());&amp;lt;/code&amp;gt;&lt;br /&gt;
Crea una KAction con el icono correcto, el texto y el atajo de teclado, e incluso la añade al menú File.&lt;br /&gt;
&lt;br /&gt;
==Añadir la acción a los menús y a las barras de herramientas==&lt;br /&gt;
Por el momento, hemos creado la nueva acción &amp;quot;Clear&amp;quot; pero no se ha asociado a ningun menú o barra de herramientas. Esto lo podemos hacer con una tecnologia de KDE llamada XMLGUI, que hace cosas majas como barras de herramientas móviles.&lt;br /&gt;
&lt;br /&gt;
{{note_(es)|En una versión posterior de KDE4, XMLGUI puede ser reemplazada por un nuevo framework llamado liveui. Por ahora, XMLGUI es la única manera correcta de configurar la UI.}}&lt;br /&gt;
&lt;br /&gt;
==XMLGUI==&lt;br /&gt;
La función &amp;lt;tt&amp;gt;setupGUI()&amp;lt;/tt&amp;gt; de la clase {{class|KXmlGuiWindow}} depende del sistema XMLGUI para construir la GUI, el cual la realiza analizando el archivo de descripción XML de la interfaz.&lt;br /&gt;
&lt;br /&gt;
La regla para establecer el nombre del archivo XML es &amp;lt;tt&amp;gt;appnameui.rc&amp;lt;/tt&amp;gt;, donde &amp;lt;tt&amp;gt;appname&amp;lt;/tt&amp;gt; es el nombre que estableces en {{class|KAboutData}} (en este caso, ''tutorial 3''). Por lo que en nuestro ejemplo, llamamos al archivo &amp;lt;tt&amp;gt;tutorial3ui.rc&amp;lt;/tt&amp;gt;, y está localizado en el directorio del código. Cmake maneja donde será puesto el archivo en última instancia. &lt;br /&gt;
&lt;br /&gt;
==Archivo ''appname''ui.rc==&lt;br /&gt;
Como la descripción de la UI está definida en el archivo XML, el layout debe seguir unas reglas estrictas. Este tutorial no profundizará en exceso en este aspecto, pero para mas información puedes echar un vistazo a la [[Development/Architecture/KDE4/XMLGUI_Technology|página de XMLGUI]] (aqui tienes un tutorial antiguo: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html])&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;
La etiqueta &amp;lt;tt&amp;gt;&amp;lt;Toolbar&amp;gt;&amp;lt;/tt&amp;gt; permite describir la barra de herramientas, que normalmente es la barra con los iconos de la parte superior de la ventana. Se le da el nombre único de ''mainToolBar'', y usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;text&amp;gt;&amp;lt;/tt&amp;gt;, es visible a los usuarios con el nombre ''Main Toolbar''. La accion clear se añade a la barra de herramientas usando la etiqueta &amp;lt;tt&amp;gt;&amp;lt;Action&amp;gt;&amp;lt;/tt&amp;gt;,  el nombre del parametro en esta etiqueta es la cadena que pasamos a KActionCollection con &amp;lt;tt&amp;gt;addAction()&amp;lt;/tt&amp;gt; en &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;
Some notes on the interaction between code and the .rc file: Menus appear automatically and should have a &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; child tag unless they refer to standard menus. Actions need to be created manually and inserted into the actionCollection() using the name in the .rc file. Actions can be hidden or disabled, whereas menus can't.&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, instalar y ejecutar===&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;
==Avanzando==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-09-21T17:22:34Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
**http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2008-09-19T15:51:41Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|Tutorial 2 - KXmlGuiWindow]], Conocimiento básico de XML|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Saving and loading]]| &lt;br /&gt;
&lt;br /&gt;
reading=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&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;
== El código ==&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;
==Explicación==&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;
===Creando el objeto KAction===&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;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&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;
====Icono====&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;
====Atajo de teclado====&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;
===Añadir a la colección===&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;
====Conectando la acción====&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;
==Añadir la acción a los menús y a las barras de herramientas==&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;
==Archivo ''appname''ui.rc==&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]] (here is an older tutorial: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html]).&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;
Some notes on the interaction between code and the .rc file: Menus appear automatically and should have a &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; child tag unless they refer to standard menus. Actions need to be created manually and inserted into the actionCollection() using the name in the .rc file. Actions can be hidden or disabled, whereas menus can't.&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, instalar y ejecutar===&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;
==Avanzando==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2008-09-19T15:51:15Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&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_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|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=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&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;
== El código ==&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;
==Explicación==&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;
===Creando el objeto KAction===&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;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&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;
====Icono====&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;
====Atajo de teclado====&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;
===Añadir a la colección===&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;
====Conectando la acción====&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;
==Añadir la acción a los menús y a las barras de herramientas==&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;
==Archivo ''appname''ui.rc==&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]] (here is an older tutorial: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html]).&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;
Some notes on the interaction between code and the .rc file: Menus appear automatically and should have a &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; child tag unless they refer to standard menus. Actions need to be created manually and inserted into the actionCollection() using the name in the .rc file. Actions can be hidden or disabled, whereas menus can't.&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, instalar y ejecutar===&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;
==Avanzando==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)</id>
		<title>Development/Tutorials/Using KActions (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KActions_(es)"/>
				<updated>2008-09-19T15:48:56Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&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=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar KActions y XMLGUI|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(es)|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=Nada&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&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;
== El código ==&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;
==Explicación==&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;
===Creando el objeto KAction===&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;
===Estableciendo las propiedades de KAction===&lt;br /&gt;
====Texto====&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;
====Icono====&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;
====Atajo de teclado====&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;
===Añadir a la colección===&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;
====Conectando la acción====&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;
==Añadir la acción a los menús y a las barras de herramientas==&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;
==Archivo ''appname''ui.rc==&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]] (here is an older tutorial: [http://developer.kde.org/documentation/tutorials/xmlui/preface.html]).&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;
Some notes on the interaction between code and the .rc file: Menus appear automatically and should have a &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;text/&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; child tag unless they refer to standard menus. Actions need to be created manually and inserted into the actionCollection() using the name in the .rc file. Actions can be hidden or disabled, whereas menus can't.&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, instalar y ejecutar===&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;
==Avanzando==&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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)</id>
		<title>Development/Tutorials/Using KXmlGuiWindow (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)"/>
				<updated>2008-09-19T15:48:36Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar usar KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program_(es)|Tutorial 1 - Hola Mundo]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions_(es)|Tutorial 3 - KActions y XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial continua el camino iniciado por el tutorial [[Development/Tutorials/First_program_(es)|Hola Mundo]], haciendo una introducción a la clase {{class|KXmlGuiWindow}}.&lt;br /&gt;
&lt;br /&gt;
En el tutorial anterior, el programa mostró una &amp;quot;caja de diálogo&amp;quot; (dialog box), ahora vamos a añadir mas funcionalidad al programa.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
La clase {{class|KXmlGuiWindow}} proporciona una vista de la venta principal con una barra de menú, una barra de herramientas, una barra de estado y un área principal en el centro del widget. La mayoría de las aplicaciones de KDE derivarán de esta clase, que proporciona una manera fácil de definir el layout del menú y la barra de herramientas mediante archivos XML (esta tecnología se llama XMLGUI). Si bien no usaremos XMLGUI en ''este'' tutorial, lo haremos en el siguiente.&lt;br /&gt;
&lt;br /&gt;
Con el fin de tener un KXmlGuiWindow que pueda usarse, debemos heredar de él. Por lo que creamos dos archivos, &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; y &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; que contendrán nuestro código.&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;
En primer lugar, en la línea 7, hacemos que MainWindow herede de KXmlGuiWindow con &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Luego declaramos el constructor con &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Y por último declaramos un puntero al objeto que compondrá la mayor parte de nuestro programa: &amp;lt;tt&amp;gt;textArea&amp;lt;/tt&amp;gt;. {{class|KTextEdit}} es un editor genérico de texto enriquecido con algunas sutilezas de KDE, como ocultación automática del cursor.&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;
Lo primero que tenemos que hacer es incluir el archivo de cabecera que contiene la declaración de la clase (en la línea 1).&lt;br /&gt;
&lt;br /&gt;
En la línea 5, inicializamos nuestro editor de texto con un objeto. En la línea 6 usamos la función setCentralWidget() de KXmlGuiWindow para decirle a KXmlGuiWindow que debe aparecer en la sección central de la ventana.&lt;br /&gt;
&lt;br /&gt;
Por último, llamamos a KXmlGuiWindow::setupGUI() que hace un montón de cosas &amp;quot;detrás de la escena&amp;quot; y crea la barra de menú por defecto (Settings, help).&lt;br /&gt;
&lt;br /&gt;
==Actualizando main.cpp==&lt;br /&gt;
Con el fin de ejecutar esta ventana, necesitamos añadir unas pocas lineas a 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;
Las líneas nuevas (respecto al Tutorial 1) son la 5, la 18 y la 19. En la línea 18 creamos nuestro objeto MainWindow y en la 19 lo mostramos.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
La mejor manera de compilar el programa es usar CMake. Lo único que ha cambiado desde el tutorial 1 es que hemos añadido &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; a la lista de fuentes y hemos cambiado &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; por &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 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;
===Compilando===&lt;br /&gt;
Para compilarlo, enlazarlo y ejecutarlo, usa:&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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Using_KActions_(es)|Tutorial 3 - Usar KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2008-09-19T15:44:22Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 4}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions_(es)|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&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 ===&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;
== 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/NepomukServer|The Nepomuk Server]]&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;
&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;
== 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 [http://api.kde.org/4.0-api/kdebase-apidocs/workspace/libs/plasma/html/classPlasma_1_1DataEngine.html  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;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Using Extenders]]&lt;br /&gt;
:''This guide shows you how to create a simple applet (a stripped down kuiserver applet) that uses extenders.''&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/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;
== 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;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/K_Hot_New_Stuff2|New introduction to KGet Hot New Stuff2]]&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;
== 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;
;[[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;
&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;
== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/User:Edumardo</id>
		<title>User:Edumardo</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/User:Edumardo"/>
				<updated>2008-09-19T15:42:44Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello, soy miembro del [[KDE_TechBase:Contributors#Spanish_Team|Spanish translation team]]. Estaba interesado en desarrollar algo sobre KDE4, y como la información que encontré era casi toda en ingles, me dije que podría traducirla yo mismo.&lt;br /&gt;
&lt;br /&gt;
=== Traduciendo o Actualizando ===&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials_(es)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Traducido o actualizado ===&lt;br /&gt;
Aqui tienes una lista de las páginas que he traducido o actualizado con la versión inglesa. Destacar que algunas ya estaban traducidas por lo que no todo el mérito es mio:&lt;br /&gt;
&lt;br /&gt;
*http://techbase.kde.org/Development_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4/Plasma_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4/KParts_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4/Solid_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4/Phonon_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4/Providing_Online_Help_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Architecture/KDE4/KGGZ_(es) &lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/First_program_(es)&lt;br /&gt;
*http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Tools_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/FAQs_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/Languages_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Development/CMake_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Projects/KNS2_(es)&lt;br /&gt;
;&lt;br /&gt;
*http://techbase.kde.org/Template:TutorialBrowser_(es)&lt;br /&gt;
*http://techbase.kde.org/Template:Tip_(es)&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)</id>
		<title>Development/Tutorials/Using KXmlGuiWindow (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)"/>
				<updated>2008-09-19T15:42:23Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translatión to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar usar KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program_(es)|Tutorial 1 - Hola Mundo]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions y XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial continua el camino iniciado por el tutorial [[Development/Tutorials/First_program_(es)|Hola Mundo]], haciendo una introducción a la clase {{class|KXmlGuiWindow}}.&lt;br /&gt;
&lt;br /&gt;
En el tutorial anterior, el programa mostró una &amp;quot;caja de diálogo&amp;quot; (dialog box), ahora vamos a añadir mas funcionalidad al programa.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2_es.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
La clase {{class|KXmlGuiWindow}} proporciona una vista de la venta principal con una barra de menú, una barra de herramientas, una barra de estado y un área principal en el centro del widget. La mayoría de las aplicaciones de KDE derivarán de esta clase, que proporciona una manera fácil de definir el layout del menú y la barra de herramientas mediante archivos XML (esta tecnología se llama XMLGUI). Si bien no usaremos XMLGUI en ''este'' tutorial, lo haremos en el siguiente.&lt;br /&gt;
&lt;br /&gt;
Con el fin de tener un KXmlGuiWindow que pueda usarse, debemos heredar de él. Por lo que creamos dos archivos, &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; y &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; que contendrán nuestro código.&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;
En primer lugar, en la línea 7, hacemos que MainWindow herede de KXmlGuiWindow con &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Luego declaramos el constructor con &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Y por último declaramos un puntero al objeto que compondrá la mayor parte de nuestro programa: &amp;lt;tt&amp;gt;textArea&amp;lt;/tt&amp;gt;. {{class|KTextEdit}} es un editor genérico de texto enriquecido con algunas sutilezas de KDE, como ocultación automática del cursor.&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;
Lo primero que tenemos que hacer es incluir el archivo de cabecera que contiene la declaración de la clase (en la línea 1).&lt;br /&gt;
&lt;br /&gt;
En la línea 5, inicializamos nuestro editor de texto con un objeto. En la línea 6 usamos la función setCentralWidget() de KXmlGuiWindow para decirle a KXmlGuiWindow que debe aparecer en la sección central de la ventana.&lt;br /&gt;
&lt;br /&gt;
Por último, llamamos a KXmlGuiWindow::setupGUI() que hace un montón de cosas &amp;quot;detrás de la escena&amp;quot; y crea la barra de menú por defecto (Settings, help).&lt;br /&gt;
&lt;br /&gt;
==Actualizando main.cpp==&lt;br /&gt;
Con el fin de ejecutar esta ventana, necesitamos añadir unas pocas lineas a 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;
Las líneas nuevas (respecto al Tutorial 1) son la 5, la 18 y la 19. En la línea 18 creamos nuestro objeto MainWindow y en la 19 lo mostramos.&lt;br /&gt;
&lt;br /&gt;
==CMake==&lt;br /&gt;
La mejor manera de compilar el programa es usar CMake. Lo único que ha cambiado desde el tutorial 1 es que hemos añadido &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; a la lista de fuentes y hemos cambiado &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; por &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 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;
===Compilando===&lt;br /&gt;
Para compilarlo, enlazarlo y ejecutarlo, usa:&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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Using_KActions|Tutorial 3 - Usar KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/File:Introtokdetutorial2_es.png</id>
		<title>File:Introtokdetutorial2 es.png</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/File:Introtokdetutorial2_es.png"/>
				<updated>2008-09-19T15:41:51Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials_(es)</id>
		<title>Development/Tutorials (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials_(es)"/>
				<updated>2008-09-19T15:34:11Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials}}&lt;br /&gt;
{{warning_(es)| Traducción en curso: solo hasta el punto 4}}&lt;br /&gt;
Los tutoriales son la forma más rápida de encontrar lo que KDE puede hacer por usted y como hacerlo. Aquí tienes una lista de los tutoriales disponibles actualmente para KDE4. Material para KDE3 y KDE2 está disponible al final de la página.&lt;br /&gt;
&lt;br /&gt;
== Introducción a la programación en KDE4 ==&lt;br /&gt;
Estś interesado en escribir aplicacion en KDE4? Esta serie de tutoriales están dirigidos a personas totalmente novatas en la programación en KDE4.&lt;br /&gt;
;[[Development/Tutorials/First program_(es)|Hola Mundo]]&lt;br /&gt;
:''Una introducción preliminar a los aspectos básicos de la programación en KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KXmlGuiWindow_(es)|Crear la ventana principal]]&lt;br /&gt;
:''Este tutorial te muestra la magia de la cosa mas importante en una aplicación: la ventana principal''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KActions|Usar KActions]]&lt;br /&gt;
:''Como añadir acciones a los menús y a las toolbars.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Saving and loading|Guardar y Abrir]]&lt;br /&gt;
:''Introducción a la biblioteca KIO mientras añades soporte para guardar y abrir en tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KCmdLineArgs|Argumentos en la línea de órdenes]]&lt;br /&gt;
:''Añade la capacidad de especificar a nuestro editor que archivo abrir desde la línea de ordenes.''&lt;br /&gt;
&lt;br /&gt;
== Básicos ==&lt;br /&gt;
;[[Development/Tutorials/KDE4 Porting Guide|Portar tu aplicación]]&lt;br /&gt;
:''Ayuda para portar aplicaciones de Qt3/KDE3 a Qt4/KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/CMake|Introducción a CMake]]&lt;br /&gt;
:''Como usar el sistema de construcción CMake usado por KDE4.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Common Programming Mistakes|Errores comunes de programación]]&lt;br /&gt;
:''Varios errores comunes que se presentan en el desarrollo de aplicaciones Qt y KDE y como evitarlos.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using Qt Designer|Usar Qt Designer para diseñar interfaces de usuario]]&lt;br /&gt;
:''Como crear archivos UI con el diseñador, y como integrarlos después en un programa KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Creating Libraries|Crear bibliotecas para compartir código]]&lt;br /&gt;
:''Como añadir la biblioteca al &amp;quot;buildsystem&amp;quot; y como preparar el código fuente.''&lt;br /&gt;
:''How to add the library to the buildsystem and how to prepare the source code.''&lt;br /&gt;
&lt;br /&gt;
== Comprobación y depurado ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Debugging|Depurar tu aplicación]]&lt;br /&gt;
:''Consejos, herramientas y técnicas para depurar tu aplicación KDE.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Unittests|Escribir &amp;quot;unittests&amp;quot; para Qt4 y KDE4 con QTestLib]] ([http://developer.kde.org/documentation/tutorials/writingunittests/writingunittests.html enlace original])&lt;br /&gt;
:''Tutorial de [mailto:bradh@frogmouth.net Brad Hards] que describe como escribir unittests mediante la framework QTestLib. El tutorial se realiza con un ejemplo, y aun está en desarrollo.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Code_Checking|Maneras semiautomáticas de detectar errores en el código]]&lt;br /&gt;
:''Técnicas que puedes usar para detectar errores en el código KDE.''&lt;br /&gt;
&lt;br /&gt;
== Gestión de los datos de configuración con KConfig ==&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/KConfig|Introducción a KConfig]]&lt;br /&gt;
:''Una sinopsis de las clases de KConfig y como usarlas en el código de tu aplicación.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Using KConfig XT|Uso de KConfig XT]]&lt;br /&gt;
:''Tutorial sobre como usar eficientemente el framework KConfig XT''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Updating KConfig Files|Actualizando archivos con KConfig]]&lt;br /&gt;
:''Tutorial sobre como escribir un script de actualización para conservar los cambios de tu archivo de configuración de tu aplicación y sincornizarlo con el archivo de configuración del usuario''&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 ===&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;
== 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/NepomukServer|The Nepomuk Server]]&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;
&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;
== 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 [http://api.kde.org/4.0-api/kdebase-apidocs/workspace/libs/plasma/html/classPlasma_1_1DataEngine.html  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;
;[[Development/Tutorials/Plasma/Theme|Creating a Plasma Theme]]&lt;br /&gt;
:''Guide to creating your first Plasma theme.''&lt;br /&gt;
&lt;br /&gt;
;[[Development/Tutorials/Plasma/UsingExtenders|Using Extenders]]&lt;br /&gt;
:''This guide shows you how to create a simple applet (a stripped down kuiserver applet) that uses extenders.''&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/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;
== 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;
== Get Hot New Stuff ==&lt;br /&gt;
; [[Development/Tutorials/K_Hot_New_Stuff2|New introduction to KGet Hot New Stuff2]]&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;
== 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;
;[[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;
&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;
== 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>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)</id>
		<title>Development/Tutorials/Using KXmlGuiWindow (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)"/>
				<updated>2008-09-19T15:20:28Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar usar KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program_(es)|Tutorial 1 - Hola Mundo]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions y XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial continua el camino iniciado por el tutorial [[Development/Tutorials/First_program_(es)|Hola Mundo]], haciendo una introducción a la clase {{class|KXmlGuiWindow}}.&lt;br /&gt;
&lt;br /&gt;
En el tutorial anterior, el programa mostró una &amp;quot;caja de diálogo&amp;quot; (dialog box), ahora vamos a añadir mas funcionalidad al programa.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
La clase {{class|KXmlGuiWindow}} proporciona una vista de la venta principal con una barra de menú, una barra de herramientas, una barra de estado y un área principial en el centro del widget. La mayoria de las aplicaciones de KDE derivarán de esta clase, que proporciona una manera facil de definir el layout del menú y la barra de herramientas mediante archivos XML (esta tecnología se llama XMLGUI). Si bien no usaremos XMLGUI en ''este'' tutorial, lo haremos en el siguiente.&lt;br /&gt;
&lt;br /&gt;
Con el fin de tener un KXmlGuiWindow que pueda usarse, debemos heredar de él. Por lo que creamos dos archivos, &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; y &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; que contendrán nuestro código.&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;
En primer lugar, en la línea 7, hacemos que MainWindow herede de KXmlGuiWindow con &amp;lt;tt&amp;gt;class MainWindow : public KXmlGuiWindow&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Luego declaramos el constructor con &amp;lt;tt&amp;gt;MainWindow(QWidget *parent=0);&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Y por último declaramos un puntero al objeto que compondrá la mayor parte de nuestro programa: &amp;lt;tt&amp;gt;textArea&amp;lt;/tt&amp;gt;. {{class|KTextEdit}} es un editor genérico de texto enriquecido con algunas sutilezas de KDE, como ocultación automática del cursor.&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;
Lo primero que tenemos que hacer es incluir el archivo de cabecera que contiene la declaración de la clase (en la línea 1).&lt;br /&gt;
&lt;br /&gt;
En la línea 5, inicializamos nuestro editor de texto con un objeto. En la línea 6 usamos la función setCentralWidget() de KXmlGuiWindow para decirle a KXmlGuiWindow que debe aparecer en la sección central de la ventana.&lt;br /&gt;
&lt;br /&gt;
Por último, KXmlGuiWindow::setupGUI() &lt;br /&gt;
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;
==Actualizando main.cpp==&lt;br /&gt;
Con el fin de ejecutar esta ventana, necesitamos añadir unas pocas lineas a 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;
La mejor manera de compilar el programa es usar CMake. Lo único que ha cambiado desde el tutorial 1 es que hemos añadido &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; a la lista de fuentes y hemos cambiado &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; por &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 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;
===Compilando===&lt;br /&gt;
Para compilarlo, enlazarlo y ejecutarlo, usa:&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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Using_KActions|Tutorial 3 - Usar KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	<entry>
		<id>http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)</id>
		<title>Development/Tutorials/Using KXmlGuiWindow (es)</title>
		<link rel="alternate" type="text/html" href="http://techbase.kde.org/Development/Tutorials/Using_KXmlGuiWindow_(es)"/>
				<updated>2008-09-19T14:45:45Z</updated>
		
		<summary type="html">&lt;p&gt;Edumardo: translation to spanish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}&lt;br /&gt;
{{TutorialBrowser_(es)|&lt;br /&gt;
&lt;br /&gt;
series=Tutorial para principiantes|&lt;br /&gt;
&lt;br /&gt;
name=Como usar usar KXmlGuiWindow|&lt;br /&gt;
&lt;br /&gt;
pre=[[Development/Tutorials/First_program_(es)|Tutorial 1 - Hola Mundo]]|&lt;br /&gt;
&lt;br /&gt;
next=[[Development/Tutorials/Using_KActions|Tutorial 3 - KActions y XMLGUI]]| &lt;br /&gt;
&lt;br /&gt;
reading={{class|KXmlGuiWindow}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Resumen==&lt;br /&gt;
Este tutorial continua el camino iniciado por el tutorial [[Development/Tutorials/First_program_(es)|Hola Mundo]], haciendo una introducción a la clase {{class|KXmlGuiWindow}}.&lt;br /&gt;
&lt;br /&gt;
En el tutorial anterior, el programa mostró una &amp;quot;caja de diálogo&amp;quot; (dialog box), ahora vamos a añadir mas funcionalidad al programa.&lt;br /&gt;
&lt;br /&gt;
[[image:introtokdetutorial2.png|frame|center]]&lt;br /&gt;
&lt;br /&gt;
==KXmlGuiWindow==&lt;br /&gt;
&lt;br /&gt;
La clase {{class|KXmlGuiWindow}} proporciona una vista de la venta principal con una barra de menú, una barra de herramientas, una barra de estado y un área principial en el centro del widget. La mayoria de las aplicaciones de KDE derivarán de esta clase, que proporciona una manera facil de definir el layout del menú y la barra de herramientas mediante archivos XML (esta tecnología se llama XMLGUI). Si bien no usaremos XMLGUI en ''este'' tutorial, lo haremos en el siguiente.&lt;br /&gt;
&lt;br /&gt;
Con el fin de tener un KXmlGuiWindow que pueda usarse, debemos heredar de él. Por lo que creamos dos archivos, &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; y &amp;lt;tt&amp;gt;mainwindow.h&amp;lt;/tt&amp;gt; que contendrán nuestro código.&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;
==Actualizando main.cpp==&lt;br /&gt;
Con el fin de ejecutar esta ventana, necesitamos añadir unas pocas lineas a 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;
La mejor manera de compilar el programa es usar CMake. Lo único que ha cambiado desde el tutorial 1 es que hemos añadido &amp;lt;tt&amp;gt;mainwindow.cpp&amp;lt;/tt&amp;gt; a la lista de fuentes y hemos cambiado &amp;lt;tt&amp;gt;tutorial1&amp;lt;/tt&amp;gt; por &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 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;
===Compilando===&lt;br /&gt;
Para compilarlo, enlazarlo y ejecutarlo, usa:&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;
==Avanzando==&lt;br /&gt;
Ahora puedes continuar con el [[Development/Tutorials/Using_KActions|Tutorial 3 - Usar KActions]].&lt;br /&gt;
&lt;br /&gt;
[[Category:C++]]&lt;/div&gt;</summary>
		<author><name>Edumardo</name></author>	</entry>

	</feed>