Aprendiendo a programar con KDE y una patata: KXmlGui, Graphics View, SVG y más
1. 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
2. Introducci´n
o
Albert 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
o
Albert 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>&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
a
Albert Astals Cid, aacid@kde.org — Aprendiendo a programar con KDE y una patata 16/17