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]