Aprende a programar con KDE y una patata

17
Aprendiendo a programar con KDE y una patata Albert Astals Cid, [email protected] Akademy-es 2011 Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 1/17

description

Aprende a programar con KDE y una patata por Albert Astals en akademy-es2011

Transcript of Aprende a programar con KDE y una patata

Page 1: Aprende a programar con KDE y una patata

Aprendiendo a programar con KDE y una

patata

Albert Astals Cid, [email protected]

Akademy-es 2011

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 1/17

Page 2: Aprende a programar con KDE y una patata

Introduccion

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 2/17

Page 3: Aprende a programar con KDE y una patata

Resumen

1 KXmlGui

2 Localizacion de ficheros de datos

3 KXmlGui Dinamico

4 El Framework Graphics View

5 SVG

6 Senales y eventos

7 Gestion de undo/redo

8 Phonon

9 Internacionalizacion

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 3/17

Page 4: Aprende a programar con KDE y una patata

KXmlGui

Creacion de Menus

Creacion de Barras de Herramientas

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, [email protected] — Aprendiendo a programar con KDE y una patata 4/17

Page 5: Aprende a programar con KDE y una patata

KXmlGui (2)

toplevel.cppKStandardGameAction::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, [email protected] — Aprendiendo a programar con KDE y una patata 5/17

Page 6: Aprende a programar con KDE y una patata

Localizacion de ficheros de datos

playground.cppvoid 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, [email protected] — Aprendiendo a programar con KDE y una patata 6/17

Page 7: Aprende a programar con KDE y una patata

KXmlGui Dinamico

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

</Menu>

toplevel.cppvoid 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, [email protected] — Aprendiendo a programar con KDE y una patata 7/17

Page 8: Aprende a programar con KDE y una patata

Graphics View

¿Que es?

Es el sistema de dibujado a alto nivel (objetos) de Qt, siendola oposicion a QPainter, donde se pintan primitivas (Texto,Lineas, etc.)

QGraphicsView

Hereda de ScrollArea. Representa los contenidos de unQGraphicsScene, proporciona los metodos de centrado,asegurar que un item es visible, etc.

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 8/17

Page 9: Aprende a programar con KDE y una patata

Graphics View (2)

QGraphicsScene

Contiene los QGraphicsItem, tiene los metodos de raton,teclado, etc, funciones creadoras de items simples ası como lalogica de posicionado (colisiones, etc).

QGraphicsItem

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

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 9/17

Page 10: Aprende a programar con KDE y una patata

Graphics View (3)

playground.hclass PlayGround : public QGraphicsView{

private:QGraphicsScene *m scene;

}

playground.cppbool 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, [email protected] — Aprendiendo a programar con KDE y una patata 10/17

Page 11: Aprende a programar con KDE y una patata

SVG

QSvgRenderer

Pintador de SVG de Qt. Puede leer ficheros .svg (y .svgz),pintar el contenido (o un elemento) en un QPainter y decirtela posicion de un elemento.

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

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 11/17

Page 12: Aprende a programar con KDE y una patata

SVG (2)

SVG en Graphics View en KTuberlingbool 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, [email protected] — Aprendiendo a programar con KDE y una patata 12/17

Page 13: Aprende a programar con KDE y una patata

Senales y eventos

Senales vs Eventos

Las senales son de alto nivel y se pueden propagar entreobjetos a priori no relacionados. Los eventos son de bajo nivel(raton, tecla, etc) y solo se propagan entre Widgetspadre/hijo.

Senales en KTuberlingKToggleAction *t = new KToggleAction(boardName, this);connect(t, SIGNAL(toggled(bool)), SLOT(changeGameboard()));

Eventos en KTuberlingvoid PlayGround::mousePressEvent(QMouseEvent *event)

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 13/17

Page 14: Aprende a programar con KDE y una patata

Gestion de undo/redo

Framework

QUndoStack: La pila de acciones realizadas. Proporcionaacciones que se habilitan automaticamente.

QUndoCommand: Una accion en si

QUndoGroup: Grupo de pilas si tu aplicacion tiene > 1 documento

action.cppActionAdd::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, [email protected] — Aprendiendo a programar con KDE y una patata 14/17

Page 15: Aprende a programar con KDE y una patata

Phonon

¿Que es?

Un framework simple para reproducir sonido. Tiene soporteteorico para multiples backends.

sound.cppSoundFactory::SoundFactory(TopLevel *parent){

player = Phonon::createPlayer(Phonon::GameCategory);}

void SoundFactory::playSound(const QString &soundRef) const{

...player->setCurrentSource(soundFile);player->play();

}

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 15/17

Page 16: Aprende a programar con KDE y una patata

Messages.sh#! /usr/bin/env bash$XGETTEXT *.cpp -o $podir/ktuberling.pot

Llamadas disponiblesi18n(”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 mas complejas

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 16/17

Page 17: Aprende a programar con KDE y una patata

¿Preguntas?

Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 17/17