Aprende a programar con KDE y una patata

  • 982 views
Uploaded on

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
982
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
13
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

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