Aprende a programar con KDE y una patata
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Aprende a programar con KDE y una patata

on

  • 1,365 views

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

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

Statistics

Views

Total Views
1,365
Views on SlideShare
1,365
Embed Views
0

Actions

Likes
0
Downloads
13
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Aprende a programar con KDE y una patata Presentation Transcript

  • 1. Aprendiendo a programar con KDE y una patata Albert Astals Cid, aacid@kde.org Akademy-es 2011Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 1/17
  • 2. Introducci´n oAlbert 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 oAlbert 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 aAlbert 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