(C++) QGraphicsPixmapItemExample3

February 24, 2017 · View on GitHub

 

 

 

 

 

(C++) QGraphicsPixmapItemExample3

 

QGraphicsPixmapItem example 3: clickable and selectable pixmap is a QGraphicsPixmapItem example. This example shows how to put multiple movable QGraphicsPixmapItems on screen and let them respond to mouse clicks using a boost::signal and let the user select one or more item (and show this by drawing those items differently).

 

Technical facts

 

Application type(s)

Operating system(s) or programming environment(s)

IDE(s):

Project type:

C++ standard:

Compiler(s):

Libraries used:

  • Qt Qt: version 5.4.1 (32 bit)
  • STL STL: GNU ISO C++ Library, version 4.9.2

 

 

 

 

 

Qt project file: ./CppQGraphicsPixmapItemExample3/CppQGraphicsPixmapItemExample3.pro

 


exists (../../DesktopApplication.pri) {   include(../../DesktopApplication.pri) } !exists (../../DesktopApplication.pri) {   QT += core printsupport   QT += gui   greaterThan(QT_MAJOR_VERSION, 4): QT += widgets svg   CONFIG   += console   CONFIG   -= app_bundle   TEMPLATE = app   CONFIG(release, debug|release) {     DEFINES += NDEBUG NTRACE_BILDERBIKKEL   }   QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra -Weffc++   unix {     QMAKE_CXXFLAGS += -Werror   } } exists(../../Libraries/Boost.pri) {   include(../../Libraries/Boost.pri) } !exists(../../Libraries/Boost.pri) {   win32 {     INCLUDEPATH += \       ../../Libraries/boost_1_55_0   } } SOURCES += \     qtmain.cpp \     qtwidget.cpp \     qtitem.cpp HEADERS += \     qtwidget.h \     qtitem.h RESOURCES += \     CppQGraphicsPixmapItemExample3.qrc

 

 

 

 

 

./CppQGraphicsPixmapItemExample3/qtitem.h

 


#ifndef QTITEM_H #define QTITEM_H #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #pragma GCC diagnostic ignored "-Wunused-but-set-parameter" #include <QGraphicsPixmapItem> #include <boost/signals2.hpp> #pragma GCC diagnostic pop ///A QGraphicsPixmapItem that loads its pixmap from resources ///and is clickable struct QtItem : public QGraphicsPixmapItem {   QtItem(QGraphicsItem *parent = 0);   ///Signal emitted when clicked   boost::signals2::signal<void (QtItem*)> m_clicked_signal;   protected:   void mousePressEvent(QGraphicsSceneMouseEvent *event);   void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); }; #endif // QTITEM_H

 

 

 

 

 

./CppQGraphicsPixmapItemExample3/qtitem.cpp

 


#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #pragma GCC diagnostic ignored "-Wunused-but-set-parameter" #include <cassert> #include <QPainter> #include "qtitem.h" #pragma GCC diagnostic pop QtItem::QtItem(QGraphicsItem *parent)   : QGraphicsPixmapItem(parent),     m_clicked_signal{} {   assert(this->pixmap().isNull()     && "Assume no pixmap loaded yet");   //Load the pixmap from resources   this->setPixmap(QPixmap(":/images/PicR.png"));   assert(!this->pixmap().isNull()     && "Assume pixmap is loaded successfully");   //Let the item have (0.0,0.0) as its center,   //so it will remain in place when rotating   this->setOffset(-pixmap().rect().center());   this->setFlags(       QGraphicsItem::ItemIsMovable     | QGraphicsItem::ItemIsSelectable); } void QtItem::mousePressEvent(QGraphicsSceneMouseEvent *) {   //Emit the boost signal   m_clicked_signal(this); } void QtItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {   //Let QGraphicsPixmapItem handle most of the painting   QGraphicsPixmapItem::paint(painter,option,widget);   //Draw a thick red line around the pixmap when it is selected   if (this->isSelected())   {     painter->setPen(QPen(QColor(255,0,0),3));     painter->drawRoundedRect(this->boundingRect().adjusted(3.0,3.0,-3.0,-3.0),6.0,6.0);   } }

 

 

 

 

 

./CppQGraphicsPixmapItemExample3/qtmain.cpp

 


#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #pragma GCC diagnostic ignored "-Wunused-but-set-parameter" #include <QApplication> #include "qtwidget.h" #pragma GCC diagnostic pop int main(int argc, char *argv[]) {   QApplication a(argc, argv);   QtWidget w;   w.setGeometry(100,100,400,400);   w.show();   return a.exec(); }

 

 

 

 

 

./CppQGraphicsPixmapItemExample3/qtwidget.h

 


#ifndef QTWIDGET_H #define QTWIDGET_H #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #pragma GCC diagnostic ignored "-Wunused-but-set-parameter" #include <QGraphicsView> #pragma GCC diagnostic pop ///Forward declaration struct QtItem; struct QtWidget : public QGraphicsView {   QtWidget();   ///Respond to a click on a QtItem   void OnItemClick(QtItem * const item); }; #endif // QTWIDGET_H

 

 

 

 

 

./CppQGraphicsPixmapItemExample3/qtwidget.cpp

 


#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #pragma GCC diagnostic ignored "-Wunused-but-set-parameter" #include <cassert> #include <boost/bind.hpp> #include <boost/lambda/bind.hpp> #include <QGraphicsScene> #include <QGraphicsPixmapItem> #include "qtitem.h" #include "qtwidget.h" #pragma GCC diagnostic pop QtWidget::QtWidget() {   QGraphicsScene * const scene = new QGraphicsScene(this);   this->setScene(scene);   const int n_items = 8;   for (int i=0; i!=n_items; ++i)   {     QtItem * const item = new QtItem;     item->m_clicked_signal.connect(       boost::bind(         &QtWidget::OnItemClick,this, boost::lambda::_1));     //Scatter those items around a bit     item->setPos(       - 128 + (std::rand() % 256),       - 128 + (std::rand() % 256));     scene->addItem(item);   } } void QtWidget::OnItemClick(QtItem * const item) {   item->setRotation(item->rotation() + 10.0); }