Upload
kdeespana
View
1.051
Download
1
Embed Size (px)
DESCRIPTION
Aprende a programar con KDE y una patata por Albert Astals en akademy-es2011
Citation preview
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
Introduccion
Albert Astals Cid, [email protected] — 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, [email protected] — 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, [email protected] — 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, [email protected] — 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, [email protected] — Aprendiendo a programar con KDE y una patata 6/17
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
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
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
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
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
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
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
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
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
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
¿Preguntas?
Albert Astals Cid, [email protected] — Aprendiendo a programar con KDE y una patata 17/17