SlideShare une entreprise Scribd logo
1  sur  17
Télécharger pour lire hors ligne
Aprendiendo a programar con KDE y una
                          patata

                               Albert Astals Cid, aacid@kde.org


                                            Akademy-es 2011




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   1/17
Introducci´n
                      o




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   2/17
Resumen

      1 KXmlGui
      2 Localizaci´n de ficheros de datos
                  o
      3 KXmlGui Din´mico
                   a
      4 El Framework Graphics View
      5 SVG
      6 Se˜ales y eventos
          n
      7 Gesti´n de undo/redo
             o
      8 Phonon
      9 Internacionalizaci´n
                          o

Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   3/17
KXmlGui

              Creaci´n de Menus
                    o
              Creaci´n de Barras de Herramientas
                    o

     ktuberlingui.rc
     <?xml version=”1.0” encoding=”utf-8”?>
     <!DOCTYPE kpartgui SYSTEM ”kpartgui.dtd”>
     <gui name=”ktuberling” version=”2”>
     <MenuBar>
      <Menu name=”game”>
        <Action name=”game save picture” append=”save merge” >
      </Menu>
      ...
     </MenuBar>
     <ToolBar name=”mainToolBar”> <text>Main Toolbar</text>
      <Action name=”game new”/>
      <Action name=”game load”/>
      ...
      <Separator/>
      ...
     </ToolBar>

     </gui>




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   4/17
KXmlGui (2)


     toplevel.cpp
     KStandardGameAction::gameNew(this, SLOT(fileNew()), actionCollection());
     KStandardGameAction::load(this, SLOT(fileOpen()), actionCollection());
     KStandardGameAction::save(this, SLOT(fileSave()), actionCollection());
     KStandardGameAction::print(this, SLOT(filePrint()), actionCollection());
     KStandardGameAction::quit(kapp, SLOT(quit()), actionCollection());
     ...
     action = actionCollection()->addAction(”game save picture”);
     action->setText(i18n(”Save &as Picture...”));
     connect(action, SIGNAL(triggered(bool) ), SLOT(filePicture()));
     ...
     KStandardAction::fullScreen(this, SLOT(toggleFullScreen()), this, actionCollection());
     ...
     setupGUI(ToolBar | Keys | Save | Create);




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata               5/17
Localizaci´n de ficheros de datos
                      o

     playground.cpp
     void PlayGround::registerPlayGrounds() {
       QStringList list = KGlobal::dirs()->findAllResources(”appdata”, ”pics/*.theme”);
       foreach(const QString &theme, list) {
         QFile layoutFile(theme);
         if (layoutFile.open(QIODevice::ReadOnly)) {
           QDomDocument layoutDocument;
           if (layoutDocument.setContent(&layoutFile)) {
             QString desktop = layoutDocument.documentElement().attribute(”desktop”);
             KConfig c(KStandardDirs::locate(”appdata”, ”pics/” + desktop));
             KConfigGroup cg = c.group(”KTuberlingTheme”);
             QString gameboard =
     layoutDocument.documentElement().attribute(”gameboard”);
             m topLevel->registerGameboard(cg.readEntry(”Name”), theme);
           }
         }
       }
     }



Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata          6/17
KXmlGui Din´mico
                       a

     ktuberlingui.rc
     <Menu name=”playground”> <text>&amp;Playground</text>
      <ActionList name=”playgroundList” />
     </Menu>


     toplevel.cpp
     void TopLevel::registerGameboard(const QString &menuText, const QString &board)
     {
       QList<QAction*> actionList;
       KToggleAction *t = new KToggleAction(i18n(menuText.toLatin1()), this);
       actionCollection()->addAction(board, t);
       t->setData(board);
       connect(t, SIGNAL(toggled(bool)), SLOT(changeGameboard()));
       actionList << t;
       playgroundsGroup->addAction(t);
       plugActionList( ”playgroundList”, actionList );
     }



Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata        7/17
Graphics View


     ¿Qu´ es?
         e
     Es el sistema de dibujado a alto nivel (objetos) de Qt, siendo
     la oposici´n a QPainter, donde se pintan primitivas (Texto,
               o
     Lineas, etc.)

     QGraphicsView
     Hereda de ScrollArea. Representa los contenidos de un
     QGraphicsScene, proporciona los m´todos de centrado,
                                         e
     asegurar que un item es visible, etc.




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   8/17
Graphics View (2)


     QGraphicsScene
     Contiene los QGraphicsItem, tiene los m´todos de rat´n,
                                              e             o
     teclado, etc, funciones creadoras de items simples as´ como la
                                                          ı
     l´gica de posicionado (colisiones, etc).
      o

     QGraphicsItem
     Es el elemento base de los elementos de la escena, hay varios
     predefinidos (textos, pixmaps, rectas, svg, etc.) pero podemos
     crear los nuestros propios definiendo boundingRect()abstracta,
     paint()abstracta, collidesWith*(), contains()...



Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   9/17
Graphics View (3)


     playground.h
     class PlayGround : public QGraphicsView
     {
       private:
         QGraphicsScene *m scene;
     }



     playground.cpp
     bool PlayGround::loadPlayGround(const QString &gameboardFile) {
       ...
       m scene = new QGraphicsScene();
       setScene(m scene);
       QGraphicsSvgItem *background = new QGraphicsSvgItem();
       background->setPos(QPoint(0,0));
       background->setZValue(0);
       m scene->addItem(background);
       ...
     }




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   10/17
SVG


     QSvgRenderer
     Pintador de SVG de Qt. Puede leer ficheros .svg (y .svgz),
     pintar el contenido (o un elemento) en un QPainter y decirte
     la posici´n de un elemento.
              o

     SVG en Graphics View
     QGraphicsSvgItem *item = new QGraphicsSvgItem();
     item->setElementId(element);
     item->setPos(pos);
     item->setSharedRenderer(sharedRenderer);
     item->setZValue(zValue);
     m scene->addItem(item);




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   11/17
SVG (2)

     SVG en Graphics View en KTuberling
     bool ToDraw::contains(const QPointF &point) const {
       bool result = QGraphicsSvgItem::contains(point);
       if (result) {
         QRectF bounds = renderer()->boundsOnElement(elementId());
         bounds = transform().mapRect(bounds);
         const QImage &img = toImage(elementId(), qRound(bounds.width()),
                               qRound(bounds.height()), renderer());
         QPointF transformedPoint = transform().map(point);
         result = qAlpha(img.pixel(transformedPoint.toPoint())) != 0;
       }
       return result;
     }
     ...
     QImage toImage(const QString &element, int width, int height, QSvgRenderer *renderer) {
       QImage img(width, height, QImage::Format ARGB32 Premultiplied);
       QPainter p2(&img);
       p2.setCompositionMode(QPainter::CompositionMode Clear);
       p2.fillRect(0, 0, width, height, QBrush(QColor(255, 255, 255)));
       p2.setCompositionMode(QPainter::CompositionMode SourceOver);
       renderer->render(&p2, element);
       return img;
     }




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata                12/17
Se˜ales y eventos
              n

     Se˜ales vs Eventos
        n
     Las se˜ales son de alto nivel y se pueden propagar entre
            n
     objetos a priori no relacionados. Los eventos son de bajo nivel
     (rat´n, tecla, etc) y solo se propagan entre Widgets
          o
     padre/hijo.

     Se˜ales en KTuberling
       n
     KToggleAction *t = new KToggleAction(boardName, this);
     connect(t, SIGNAL(toggled(bool)), SLOT(changeGameboard()));


     Eventos en KTuberling
     void PlayGround::mousePressEvent(QMouseEvent *event)




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   13/17
Gesti´n de undo/redo
                 o

     Framework
         QUndoStack: La pila de acciones realizadas. Proporciona
         acciones que se habilitan autom´ticamente.
                                        a
         QUndoCommand: Una acci´n en si
                                     o
         QUndoGroup: Grupo de pilas si tu aplicaci´n tiene > 1 documento
                                                  o



     action.cpp
     ActionAdd::ActionAdd(ToDraw *item, QGraphicsScene *scene) : m item(item), m scene(scene), m done(false) { }

     ActionAdd:: ActionAdd() { if (!m done) delete m item; }

     void ActionAdd::redo() { m scene->addItem(m item); m done = true; }

     void ActionAdd::undo() { m scene->removeItem(m item); m done = false; }




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata                                    14/17
Phonon

     ¿Qu´ es?
         e
     Un framework simple para reproducir sonido. Tiene soporte
     te´rico para m´ltiples backends.
       o           u

     sound.cpp
     SoundFactory::SoundFactory(TopLevel *parent)
     {
       player = Phonon::createPlayer(Phonon::GameCategory);
     }

     void SoundFactory::playSound(const QString &soundRef) const
     {
       ...
       player->setCurrentSource(soundFile);
       player->play();
     }



Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   15/17
Messages.sh
     #! /usr/bin/env bash
     $XGETTEXT *.cpp -o $podir/ktuberling.pot


     Llamadas disponibles
              i18n(”hello”);
              i18n(”hello %1”, userName);
              i18nc(”Player name - score”, ”%1 - %2”, playerName, score)
              i18np(”One image in album %2”, ”%1 images in album %2”, numImages,
              albumName);
              otras m´s complejas
                     a




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata    16/17
¿Preguntas?




Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata   17/17

Contenu connexe

En vedette

KDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirveKDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirvekdeespana
 
KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto kdeespana
 
Qt5 en distintas plataformas
Qt5 en distintas plataformasQt5 en distintas plataformas
Qt5 en distintas plataformaskdeespana
 
openQA y Open Build System
openQA y Open Build SystemopenQA y Open Build System
openQA y Open Build Systemkdeespana
 
English de lenguaje de programacion
English de lenguaje de programacionEnglish de lenguaje de programacion
English de lenguaje de programacionVillalba Griselda
 
3 aprendiendo a programar kodu
3   aprendiendo a programar kodu3   aprendiendo a programar kodu
3 aprendiendo a programar kodujmachuca
 

En vedette (6)

KDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirveKDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirve
 
KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto
 
Qt5 en distintas plataformas
Qt5 en distintas plataformasQt5 en distintas plataformas
Qt5 en distintas plataformas
 
openQA y Open Build System
openQA y Open Build SystemopenQA y Open Build System
openQA y Open Build System
 
English de lenguaje de programacion
English de lenguaje de programacionEnglish de lenguaje de programacion
English de lenguaje de programacion
 
3 aprendiendo a programar kodu
3   aprendiendo a programar kodu3   aprendiendo a programar kodu
3 aprendiendo a programar kodu
 

Similaire à Aprendiendo a programar con KDE y una patata: KXmlGui, Graphics View, SVG y más

Introducción a Qt
Introducción a QtIntroducción a Qt
Introducción a Qtdgalo88
 
HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5Plain Concepts
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Manual de android
Manual de androidManual de android
Manual de androidJarboledah
 
Uso del control zed graph en c sharp - graficos circulares
Uso del control zed graph en c sharp - graficos circularesUso del control zed graph en c sharp - graficos circulares
Uso del control zed graph en c sharp - graficos circularesJulián Calderón
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterAdolfo Sanz De Diego
 
Renderización en java
Renderización en javaRenderización en java
Renderización en javaaleja0940
 
Android Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG UruguayAndroid Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG Uruguaygtuguruguay
 
Análisis espacial con R (asignatura de Master - UPM)
Análisis espacial con R (asignatura de Master - UPM)Análisis espacial con R (asignatura de Master - UPM)
Análisis espacial con R (asignatura de Master - UPM)Vladimir Gutierrez, PhD
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printernanusefue
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Gabriela Bosetti
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collectionsflekoso
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018 Codemotion
 

Similaire à Aprendiendo a programar con KDE y una patata: KXmlGui, Graphics View, SVG y más (20)

Introducción a Qt
Introducción a QtIntroducción a Qt
Introducción a Qt
 
HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5HTML Tour - Programación de Videojuegos HTML5
HTML Tour - Programación de Videojuegos HTML5
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Curso android studio
Curso android studioCurso android studio
Curso android studio
 
Curso android studio
Curso android studioCurso android studio
Curso android studio
 
Manual de android
Manual de androidManual de android
Manual de android
 
Uso del control zed graph en c sharp - graficos circulares
Uso del control zed graph en c sharp - graficos circularesUso del control zed graph en c sharp - graficos circulares
Uso del control zed graph en c sharp - graficos circulares
 
(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
Codemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipsterCodemotion 2017 - Taller de JHipster
Codemotion 2017 - Taller de JHipster
 
Renderización en java
Renderización en javaRenderización en java
Renderización en java
 
Vector
Vector Vector
Vector
 
Android Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG UruguayAndroid Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG Uruguay
 
Graficas especiales
Graficas especialesGraficas especiales
Graficas especiales
 
Web Mapping con Django
Web Mapping con DjangoWeb Mapping con Django
Web Mapping con Django
 
Análisis espacial con R (asignatura de Master - UPM)
Análisis espacial con R (asignatura de Master - UPM)Análisis espacial con R (asignatura de Master - UPM)
Análisis espacial con R (asignatura de Master - UPM)
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printer
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
 
SCJP, Clase 6: Collections
SCJP, Clase 6: CollectionsSCJP, Clase 6: Collections
SCJP, Clase 6: Collections
 
Cesar lenguaje c_
Cesar lenguaje c_Cesar lenguaje c_
Cesar lenguaje c_
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
 

Plus de kdeespana

Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017kdeespana
 
Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017kdeespana
 
valgrind y ASAN Dos formas de instrumentar código en busca de errores
valgrind y ASAN Dos formas de instrumentar código en busca de erroresvalgrind y ASAN Dos formas de instrumentar código en busca de errores
valgrind y ASAN Dos formas de instrumentar código en busca de erroreskdeespana
 
KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve kdeespana
 
Qtquick, interfaces con animaciones fluídas en Qt5
Qtquick, interfaces con animaciones fluídas en Qt5Qtquick, interfaces con animaciones fluídas en Qt5
Qtquick, interfaces con animaciones fluídas en Qt5kdeespana
 
Descubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDEDescubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDEkdeespana
 
Clazy, mejorando tu código en tiempo de compilación
Clazy, mejorando tu código en tiempo de compilaciónClazy, mejorando tu código en tiempo de compilación
Clazy, mejorando tu código en tiempo de compilaciónkdeespana
 
La potencia del Terminal
La potencia del TerminalLa potencia del Terminal
La potencia del Terminalkdeespana
 
Novedades de C++11
Novedades de C++11Novedades de C++11
Novedades de C++11kdeespana
 
10 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 201610 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 2016kdeespana
 
KDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert VacaKDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert Vacakdeespana
 
Next gen-apps
Next gen-appsNext gen-apps
Next gen-appskdeespana
 
Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014kdeespana
 
Baloo - Akademy-es 2014
Baloo - Akademy-es 2014Baloo - Akademy-es 2014
Baloo - Akademy-es 2014kdeespana
 
Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014kdeespana
 
El artista antes conocido como KDE 5 - Akademy-es 2014
El artista antes conocido como KDE 5 - Akademy-es 2014El artista antes conocido como KDE 5 - Akademy-es 2014
El artista antes conocido como KDE 5 - Akademy-es 2014kdeespana
 
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014kdeespana
 
Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014kdeespana
 
Desarrollando KDE
Desarrollando KDEDesarrollando KDE
Desarrollando KDEkdeespana
 

Plus de kdeespana (20)

Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017
 
Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017
 
valgrind y ASAN Dos formas de instrumentar código en busca de errores
valgrind y ASAN Dos formas de instrumentar código en busca de erroresvalgrind y ASAN Dos formas de instrumentar código en busca de errores
valgrind y ASAN Dos formas de instrumentar código en busca de errores
 
KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve
 
Qtquick, interfaces con animaciones fluídas en Qt5
Qtquick, interfaces con animaciones fluídas en Qt5Qtquick, interfaces con animaciones fluídas en Qt5
Qtquick, interfaces con animaciones fluídas en Qt5
 
Descubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDEDescubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDE
 
Clazy, mejorando tu código en tiempo de compilación
Clazy, mejorando tu código en tiempo de compilaciónClazy, mejorando tu código en tiempo de compilación
Clazy, mejorando tu código en tiempo de compilación
 
La potencia del Terminal
La potencia del TerminalLa potencia del Terminal
La potencia del Terminal
 
Novedades de C++11
Novedades de C++11Novedades de C++11
Novedades de C++11
 
10 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 201610 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 2016
 
KDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert VacaKDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert Vaca
 
Next gen-apps
Next gen-appsNext gen-apps
Next gen-apps
 
Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014
 
Baloo - Akademy-es 2014
Baloo - Akademy-es 2014Baloo - Akademy-es 2014
Baloo - Akademy-es 2014
 
Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014
 
El artista antes conocido como KDE 5 - Akademy-es 2014
El artista antes conocido como KDE 5 - Akademy-es 2014El artista antes conocido como KDE 5 - Akademy-es 2014
El artista antes conocido como KDE 5 - Akademy-es 2014
 
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
 
Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014
 
KDE y Qt 5
KDE y Qt 5KDE y Qt 5
KDE y Qt 5
 
Desarrollando KDE
Desarrollando KDEDesarrollando KDE
Desarrollando KDE
 

Aprendiendo a programar con KDE y una patata: KXmlGui, Graphics View, SVG y más

  • 1. Aprendiendo a programar con KDE y una patata Albert Astals Cid, aacid@kde.org Akademy-es 2011 Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 1/17
  • 2. Introducci´n o Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 2/17
  • 3. Resumen 1 KXmlGui 2 Localizaci´n de ficheros de datos o 3 KXmlGui Din´mico a 4 El Framework Graphics View 5 SVG 6 Se˜ales y eventos n 7 Gesti´n de undo/redo o 8 Phonon 9 Internacionalizaci´n o Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 3/17
  • 4. KXmlGui Creaci´n de Menus o Creaci´n de Barras de Herramientas o ktuberlingui.rc <?xml version=”1.0” encoding=”utf-8”?> <!DOCTYPE kpartgui SYSTEM ”kpartgui.dtd”> <gui name=”ktuberling” version=”2”> <MenuBar> <Menu name=”game”> <Action name=”game save picture” append=”save merge” > </Menu> ... </MenuBar> <ToolBar name=”mainToolBar”> <text>Main Toolbar</text> <Action name=”game new”/> <Action name=”game load”/> ... <Separator/> ... </ToolBar> </gui> Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 4/17
  • 5. KXmlGui (2) toplevel.cpp KStandardGameAction::gameNew(this, SLOT(fileNew()), actionCollection()); KStandardGameAction::load(this, SLOT(fileOpen()), actionCollection()); KStandardGameAction::save(this, SLOT(fileSave()), actionCollection()); KStandardGameAction::print(this, SLOT(filePrint()), actionCollection()); KStandardGameAction::quit(kapp, SLOT(quit()), actionCollection()); ... action = actionCollection()->addAction(”game save picture”); action->setText(i18n(”Save &as Picture...”)); connect(action, SIGNAL(triggered(bool) ), SLOT(filePicture())); ... KStandardAction::fullScreen(this, SLOT(toggleFullScreen()), this, actionCollection()); ... setupGUI(ToolBar | Keys | Save | Create); Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 5/17
  • 6. Localizaci´n de ficheros de datos o playground.cpp void PlayGround::registerPlayGrounds() { QStringList list = KGlobal::dirs()->findAllResources(”appdata”, ”pics/*.theme”); foreach(const QString &theme, list) { QFile layoutFile(theme); if (layoutFile.open(QIODevice::ReadOnly)) { QDomDocument layoutDocument; if (layoutDocument.setContent(&layoutFile)) { QString desktop = layoutDocument.documentElement().attribute(”desktop”); KConfig c(KStandardDirs::locate(”appdata”, ”pics/” + desktop)); KConfigGroup cg = c.group(”KTuberlingTheme”); QString gameboard = layoutDocument.documentElement().attribute(”gameboard”); m topLevel->registerGameboard(cg.readEntry(”Name”), theme); } } } } Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 6/17
  • 7. KXmlGui Din´mico a ktuberlingui.rc <Menu name=”playground”> <text>&amp;Playground</text> <ActionList name=”playgroundList” /> </Menu> toplevel.cpp void TopLevel::registerGameboard(const QString &menuText, const QString &board) { QList<QAction*> actionList; KToggleAction *t = new KToggleAction(i18n(menuText.toLatin1()), this); actionCollection()->addAction(board, t); t->setData(board); connect(t, SIGNAL(toggled(bool)), SLOT(changeGameboard())); actionList << t; playgroundsGroup->addAction(t); plugActionList( ”playgroundList”, actionList ); } Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 7/17
  • 8. Graphics View ¿Qu´ es? e Es el sistema de dibujado a alto nivel (objetos) de Qt, siendo la oposici´n a QPainter, donde se pintan primitivas (Texto, o Lineas, etc.) QGraphicsView Hereda de ScrollArea. Representa los contenidos de un QGraphicsScene, proporciona los m´todos de centrado, e asegurar que un item es visible, etc. Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 8/17
  • 9. Graphics View (2) QGraphicsScene Contiene los QGraphicsItem, tiene los m´todos de rat´n, e o teclado, etc, funciones creadoras de items simples as´ como la ı l´gica de posicionado (colisiones, etc). o QGraphicsItem Es el elemento base de los elementos de la escena, hay varios predefinidos (textos, pixmaps, rectas, svg, etc.) pero podemos crear los nuestros propios definiendo boundingRect()abstracta, paint()abstracta, collidesWith*(), contains()... Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 9/17
  • 10. Graphics View (3) playground.h class PlayGround : public QGraphicsView { private: QGraphicsScene *m scene; } playground.cpp bool PlayGround::loadPlayGround(const QString &gameboardFile) { ... m scene = new QGraphicsScene(); setScene(m scene); QGraphicsSvgItem *background = new QGraphicsSvgItem(); background->setPos(QPoint(0,0)); background->setZValue(0); m scene->addItem(background); ... } Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 10/17
  • 11. SVG QSvgRenderer Pintador de SVG de Qt. Puede leer ficheros .svg (y .svgz), pintar el contenido (o un elemento) en un QPainter y decirte la posici´n de un elemento. o SVG en Graphics View QGraphicsSvgItem *item = new QGraphicsSvgItem(); item->setElementId(element); item->setPos(pos); item->setSharedRenderer(sharedRenderer); item->setZValue(zValue); m scene->addItem(item); Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 11/17
  • 12. SVG (2) SVG en Graphics View en KTuberling bool ToDraw::contains(const QPointF &point) const { bool result = QGraphicsSvgItem::contains(point); if (result) { QRectF bounds = renderer()->boundsOnElement(elementId()); bounds = transform().mapRect(bounds); const QImage &img = toImage(elementId(), qRound(bounds.width()), qRound(bounds.height()), renderer()); QPointF transformedPoint = transform().map(point); result = qAlpha(img.pixel(transformedPoint.toPoint())) != 0; } return result; } ... QImage toImage(const QString &element, int width, int height, QSvgRenderer *renderer) { QImage img(width, height, QImage::Format ARGB32 Premultiplied); QPainter p2(&img); p2.setCompositionMode(QPainter::CompositionMode Clear); p2.fillRect(0, 0, width, height, QBrush(QColor(255, 255, 255))); p2.setCompositionMode(QPainter::CompositionMode SourceOver); renderer->render(&p2, element); return img; } Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 12/17
  • 13. Se˜ales y eventos n Se˜ales vs Eventos n Las se˜ales son de alto nivel y se pueden propagar entre n objetos a priori no relacionados. Los eventos son de bajo nivel (rat´n, tecla, etc) y solo se propagan entre Widgets o padre/hijo. Se˜ales en KTuberling n KToggleAction *t = new KToggleAction(boardName, this); connect(t, SIGNAL(toggled(bool)), SLOT(changeGameboard())); Eventos en KTuberling void PlayGround::mousePressEvent(QMouseEvent *event) Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 13/17
  • 14. Gesti´n de undo/redo o Framework QUndoStack: La pila de acciones realizadas. Proporciona acciones que se habilitan autom´ticamente. a QUndoCommand: Una acci´n en si o QUndoGroup: Grupo de pilas si tu aplicaci´n tiene > 1 documento o action.cpp ActionAdd::ActionAdd(ToDraw *item, QGraphicsScene *scene) : m item(item), m scene(scene), m done(false) { } ActionAdd:: ActionAdd() { if (!m done) delete m item; } void ActionAdd::redo() { m scene->addItem(m item); m done = true; } void ActionAdd::undo() { m scene->removeItem(m item); m done = false; } Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 14/17
  • 15. Phonon ¿Qu´ es? e Un framework simple para reproducir sonido. Tiene soporte te´rico para m´ltiples backends. o u sound.cpp SoundFactory::SoundFactory(TopLevel *parent) { player = Phonon::createPlayer(Phonon::GameCategory); } void SoundFactory::playSound(const QString &soundRef) const { ... player->setCurrentSource(soundFile); player->play(); } Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 15/17
  • 16. Messages.sh #! /usr/bin/env bash $XGETTEXT *.cpp -o $podir/ktuberling.pot Llamadas disponibles i18n(”hello”); i18n(”hello %1”, userName); i18nc(”Player name - score”, ”%1 - %2”, playerName, score) i18np(”One image in album %2”, ”%1 images in album %2”, numImages, albumName); otras m´s complejas a Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 16/17
  • 17. ¿Preguntas? Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 17/17