aprende a programar con kde y una patata
DESCRIPTION
Aprende a programar con KDE y una patata por Albert Astals en akademy-es2011TRANSCRIPT
![Page 1: Aprende a programar con KDE y una patata](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/1.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/2.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/3.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/4.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/5.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/6.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/7.jpg)
KXmlGui Dinamico
ktuberlingui.rc<Menu name=”playground”> <text>&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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/8.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/9.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/10.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/11.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/12.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/13.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/14.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/15.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/16.jpg)
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](https://reader035.vdocuments.site/reader035/viewer/2022062418/555ad997d8b42a62528b4c2d/html5/thumbnails/17.jpg)
¿Preguntas?
Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 17/17