QGraphics View Framework

Transkrypt

QGraphics View Framework
Wprowadzenie do tworzenia
zaawansowanych interfejsów
graficznych:
QGraphics View Framework
vs.
QML
© 2010 Tieto Corporation
Jakub Bogacz
Patryk Górniak
Software Engineer
Tieto,
[email protected]
Software Engineer
Tieto,
Patryk.Gó[email protected]
Spis tre ci
• Krótkie przypomnienie
• Wst p do tworzenia graficznych interfejsów
• QGraphics View Framework
© 2010 Tieto Corporation
Krótkie
przypomnienie
© 2010 Tieto Corporation
Czym jest QT
• Multiplatformowa biblioteka C++
• Stworzona przez firm Trolltech, która zosta a przej ta
(2008 rok) przez Noki
• Na licencji LGPL
• Przeznaczona g ównie do tworzenia interfejsów u ytkownika
• Du e wsparcie dla tworzenia aplikacji na urz dzenia
mobilne
• G ówny sk adnik Maemo 5 oraz MeeGo
• Fundamentem biblioteki jest mechanizm sygna ów oraz
slotów
© 2010 Tieto Corporation
Historia QT
•
•
•
•
•
•
•
•
1995 – pierwsza wersja biblioteki (sprzedanych 18 licencji)
1997 – u ycie Qt jako podstawowej biblioteki w KDE
1999 – Qt 2.0
2001 – Qt 3.0 wspierana równie dla MacOS
2005 – Qt 4.0 – wydane na licencji GPL
2007 – Qt dla Javy (Qt Jambi)
2008 – Nokia przejmuje Trolltech
Stycze 2009 – Qt 4.5 na licencji LGPL, wstrzymano rozwój
Qt Jambi
© 2010 Tieto Corporation
Sloty i sygna y czyli krótkie
przypomnienie - podstawy
signals:
void clicked();
public slots:
void buttonClicked();
QObject::connect(&a, SIGNAL(clicked),
&b, SLOT(buttonClicked)
© 2010 Tieto Corporation
Sloty i sygna y czyli krótkie
przypomnienie - przyk ad
#include <QObject>
class Counter: public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
© 2010 Tieto Corporation
Sloty i sygna y czyli krótkie
przypomnienie - przyk ad
void Counter::setValue(int value) {
if (value != m_value) {
m_value = value;
emit valueChanged(value);
}
}
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
© 2010 Tieto Corporation
Wst p do
tworzenia
graficznych
interfejsów
© 2010 Tieto Corporation
2010-03-26
Metody tworzenia interfejsów
ytkownika
Interfejsy
ytkownika
Interfejsy
standardowe
Komponenty
© 2010 Tieto Corporation
Interfejsy
niestandardowe
QGraphics View
Framework
QML
Przyk ady standardowych
interfejsów u ytkownika
© 2010 Tieto Corporation
Przyk ady niestandardowych
interfejsów u ytkownika
© 2010 Tieto Corporation
Historia
• QCanvas: Qt 2.3(7.03.2001) – Qt 4.2(4.10.2007)
• QGraphics View Framework: Qt 4.2(4.10.2007) - ?
• QML (Qt Quick): Qt 4.7(21.09.2010) - ?
© 2010 Tieto Corporation
Dost pno
• Komputery z zainstalowanymi bibliotekami QT
• Urz dzenia mobilne z systemami:
• Symbian S60 3rd Edition, Feature Pack 1
Nokia 5700 Nokia 6120 Nokia E51 Nokia E63 Nokia N76 Nokia N95
• Symbian S60 3rd Edition, Feature Pack 2
Nokia 5320 Nokia 5730 Nokia 6220 Classic Nokia E52
• Symbian S60 5th Edition, oraz nowsze wersje systemu
Nokia 5250 Nokia 5530 Nokia N97
• Maemo 5
Nokia N900
• MeeGO
© 2010 Tieto Corporation
QGraphics View
Framework
© 2010 Tieto Corporation
2010-03-26
QGraphics View Framework wst p
© 2010 Tieto Corporation
QGraphicsScene
• Przechowywanie i zarz dzanie obiektami QGraphicsItem:
• Dodawanie: addItem(), addText(), addElipse(), addPath(), addRect()
• Pobieranie i usuwanie: item(), itemAt(), remove(), removeAt()
• Przekazywanie zdarze , a w szczególno ci obs ugi myszki i
klawiatury do elementów sceny
• Konstruktor:
QGraphicsScene::QGraphicsScene ( const
QRectF & sceneRect, QObject * parent = 0)
QGraphicsScene::QGraphicsScene ( qreal x,
qreal y, qreal width, qreal height,
QObject * parent = 0 )
© 2010 Tieto Corporation
QGraphicsView
Reprezentuje scen i odpowiada za jej wy wietlanie.
Niezale nej wielko ci od sceny któr ma reprezentowa .
Najwa niejsze metody:
• setScene()
• mapToScene(), mapFromScene(), itemAt()
• show()
• hide()
© 2010 Tieto Corporation
Poka my scen
#include <QApplication>
#include „gui.h”
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Gui* g = new Gui();
return a.exec();
}
© 2010 Tieto Corporation
Poka my scen cd..
Gui::Gui(QObject *parent) :
QObject(parent)
{
scene = new QGraphicsScene(0,0, 500, 500);
scene->setBackgroundBrush(QBrush(Qt::black));
view = new QGraphicsView();
view->setScene(scene);
view->show();
}
© 2010 Tieto Corporation
Poka my scen cd..
© 2010 Tieto Corporation
QGraphicsItem
Reprezentuje pojedynczy obiekt na scenie. Odbiera zdarzenia
myszki oraz klawiatury (je eli ich obs uga zostanie
zaimplementowana).
virtual void paint ( QPainter * painter, const
QStyleOptionGraphicsItem * option, QWidget *
widget = 0 )
virtual QRectF boundingRect()
© 2010 Tieto Corporation
Rysujemy w asny obiekt – trójk t
void PictureItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
QPen pen(Qt::white);
pen.setWidth(4);
painter->setPen(pen);
//Rysujemy trójk t
painter->drawLine(0, 0, 0, 100);
painter->drawLine(0, 0, 60, 50);
painter->drawLine(0, 100, 60, 50);
}
© 2010 Tieto Corporation
Rysujemy w asny obiekt – trójk t
QRectF PictureItem::boundingRect() const
{
return QRectF(0,0, 60, 100);
}
© 2010 Tieto Corporation
Dodajemy trójk t do sceny
Gui::Gui {
…
rightButton = new PictureItem();
rightButton->setX(scene->width() –
rightButton->boundingRect().width());
rightButton->setY(scene->height()/2 rightButton->boundingRect().height()/2);
scene->addItem(rightButton)
…
}
© 2010 Tieto Corporation
Rysujemy w asny obiekt – trójk t
cd..
© 2010 Tieto Corporation
Dodajemy drugi trójk t
Gui::Gui {
…
leftButton = new PictureItem();
leftButton->setX(leftButton->
boundingRect().width());
leftButton->setY
((leftButton>boundingRect().height() +
scene->height())/2);
leftButton->rotate(180);
scene->addItem(leftButton)
…
}
© 2010 Tieto Corporation
Oto nasz efekt
© 2010 Tieto Corporation
Dodajemy obs ug myszki
void PictureItem::
mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event);
}
void PictureItem::
mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event);
emit clicked();
}
© 2010 Tieto Corporation
Wy wietlamy zdj cie
PhotoItem::PhotoItem(QString pathToFile,
QGraphicsObject *parent) :
path(pathToFile),
QGraphicsObject(parent)
{
//QPixmap
pixmap = new QPixmap();
//QRectF rectangle
rectangle.setRect(0,0, 300, 300);
//nasza dodatkowa metoda
updatePixmap();
}
© 2010 Tieto Corporation
Wy wietlamy zdj cie cd..
void PhotoItem::updatePixmap()
{
pixmap->load(path);
scaledPixmap = pixmap->scaled
(rectangle.size(), Qt::KeepAspectRatio);
}
QRectF PhotoItem::boundingRect() const
{
return rectangle;
}
© 2010 Tieto Corporation
Wy wietlamy zdj cie cd..
void PhotoItem::paint(QPainter *painter,..,..)
{
painter->fillRect(rectangle, Qt::black);
int x = (rectangle.width() –
scaledPixmap.width())/2;
int y = (rectangle.height() –
scaledPixmap.height())/2;
painter->drawPixmap(x,y,
scalledPximap.width(),
scalledPximap.height(),
scalledPximap);
}
© 2010 Tieto Corporation
Wy wietlamy zdj cie cd..
//Slot
void PhotoItem::setCurrentPhoto(QString
pathToFile)
{
path = pathToFile;
updatePixmap();
update(rectangle);
}
© 2010 Tieto Corporation
Logika galerii
• Klasa o nazwie CGallery
• Sloty:
• void on_nextButton_clicked();
• void on_prevButton_clicked();
• Sygna y
• void currentImage(QString);
• void prevImage(QString);
• void nextImage(QString);
• Publiczna zmienna
• QStringList fileList;
© 2010 Tieto Corporation
Pod czamy...
Gui::Gui(...) {
…
gallery = new CGallery();
photoItem = new PhotoItem(
gallery->fileList.first());
photoItem->setX(100);
photoItem->setY(100);
scene->addItem(photoItem);
…
}
© 2010 Tieto Corporation
Efekty naszej pracy..
© 2010 Tieto Corporation
Pod czamy dalej...
Gui::Gui {
…
scene->addItem(photoItem);
connect(leftButton, SIGNAL(clicked()), gallery,
SLOT(on_prevButton_clicked()));
connect(rightButton, SIGNAL(clicked()), gallery,
SLOT(on_nextButton_clicked()));
connect(gallery, SIGNAL(currentImage(QString)),
photoItem, SLOT(setCurrentPhoto(QString)));
…
}
© 2010 Tieto Corporation
Co z pozosta ymi sygna ami?
void Gui::setVisibleLeftButton(QString path)
{
if (path.isEmpty())
leftButton->setVisible(false);
}
Gui::Gui(...) {
connect(w, SIGNAL(prevImage(QString)), this,
SLOT(setVisibleLeftButton(QString)));
connect(w, SIGNAL(nextImage(QString)), this,
SLOT(setVisibleRightButton(QString)));
}
© 2010 Tieto Corporation
© 2010 Tieto Corporation
Jakub Bogacz
Patryk Górniak
Software Engineer
Tieto,
[email protected]
Software Engineer
Tieto,
[email protected]