Aprende a programar con KDE y una patata

Post on 19-May-2015

1.041 views 1 download

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

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

Introduccion

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

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 3/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 4/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 5/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 6/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 7/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 8/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 9/17

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, 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 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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 11/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 12/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 13/17

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, aacid@kde.org — Aprendiendo a programar con KDE y una patata 14/17

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, 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 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, 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