(C++) QtExample32

February 24, 2017 · View on GitHub

 

 

 

 

 

(C++) QtExample32

 

QtQt
CreatorLubuntu

 

Qt example 32: moveable and selectable thin lines is a Qt example to create some lines that are moveable, yet selectable easy.

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: ./CppQtExample32/CppQtExample32.pro

 


exists(../../DesktopApplication.pri) {   include(../../DesktopApplication.pri) } !exists(../../DesktopApplication.pri) {   QT += core gui   greaterThan(QT_MAJOR_VERSION, 4): QT += widgets   TEMPLATE = app   CONFIG(debug, debug|release) {     message(Debug mode)   }   CONFIG(release, debug|release) {     message(Release mode)     DEFINES += NDEBUG NTRACE_BILDERBIKKEL   }   QMAKE_CXXFLAGS += -std=c++11 -Wall -Wextra   unix {     QMAKE_CXXFLAGS += -Werror   } } exists(../../Libraries/Boost.pri) {   include(../../Libraries/Boost.pri) } !exists(../../Libraries/Boost.pri) {   win32 {     INCLUDEPATH += \       ../../../Projects/Libraries/boost_1_55_0   } } SOURCES += \     qtmain.cpp \     dialog.cpp \     qtarrowswidget.cpp \     qtarrowitem.cpp HEADERS += \     dialog.h \     qtarrowswidget.h \     qtarrowitem.h FORMS += dialog.ui

 

 

 

 

 

./CppQtExample32/dialog.h

 


#ifndef DIALOG_H #define DIALOG_H #include <QDialog> namespace Ui { class Dialog; } class Dialog : public QDialog {   Q_OBJECT      public:   explicit Dialog(QWidget *parent = 0);   ~Dialog();      private:   Ui::Dialog *ui; }; #endif // DIALOG_H

 

 

 

 

 

./CppQtExample32/dialog.cpp

 


#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include "qtarrowswidget.h" #include "dialog.h" #include "ui_dialog.h" #pragma GCC diagnostic pop Dialog::Dialog(QWidget *parent) :     QDialog(parent),     ui(new Ui::Dialog) {   ui->setupUi(this);   ui->layout->addWidget(new QtArrowsWidget); } Dialog::~Dialog() {   delete ui; }

 

 

 

 

 

./CppQtExample32/qtarrowitem.h

 


#ifndef QTARROWITEM_H #define QTARROWITEM_H #include <QGraphicsLineItem> struct QtArrowItem : public QGraphicsLineItem {   QtArrowItem(     const double x1,     const double y1,     const bool tail,     const double x2,     const double y2,     const bool head,     QGraphicsItem *parent = 0);   protected:   ///Paint a QtTextPositionItem   void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);   ///The rectangle that containg the item, used for rough calculations like   ///collision detection   QRectF boundingRect() const;   ///More precise shape compared to boundingRect   ///In this example, it is redefined to ease selecting those thin lines   QPainterPath shape() const;   ///Show arrow at head   const bool m_head;   ///Show arrow at tail   const bool m_tail; }; #endif // QTARROWITEM_H

 

 

 

 

 

./CppQtExample32/qtarrowitem.cpp

 


#include <iostream> #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include <QCursor> #include <QFont> #include <QGraphicsSceneMouseEvent> #include <QPainter> #include "qtarrowitem.h" #pragma GCC diagnostic pop QtArrowItem::QtArrowItem(   const double x1,   const double y1,   const bool tail,   const double x2,   const double y2,   const bool head,   QGraphicsItem *parent)   : QGraphicsLineItem(x1,y1,x2,y2,parent),     m_head(head),     m_tail(tail) {   this->setFlag(QGraphicsItem::ItemIsMovable);   this->setFlag(QGraphicsItem::ItemIsSelectable); } QPainterPath QtArrowItem::shape() const {   //Thanks to norobro for posting this code at   //http://www.qtcentre.org/threads/49201-Increase-margin-for-detecting-tooltip-events-of-QGraphicsLineItem   QPainterPath path;   QPainterPathStroker stroker;   path.moveTo(line().p1());   path.lineTo(line().p2());   stroker.setWidth(10);   return stroker.createStroke(path); } QRectF QtArrowItem::boundingRect() const {   return shape().boundingRect(); } void QtArrowItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) {   //painter->setRenderHint(QPainter::Antialiasing);   if (this->isSelected())   {     QPen thick_pen;     thick_pen.setWidth(3);     thick_pen.setColor(QColor(255,0,0));     painter->setPen(thick_pen);   }   else   {     QPen pen;     pen.setWidth(1);     painter->setPen(pen);   }   painter->drawLine(this->line()); }

 

 

 

 

 

./CppQtExample32/qtarrowswidget.h

 


#ifndef QTARROWSWIDGET_H #define QTARROWSWIDGET_H #include <QGraphicsView> struct QtArrowsWidget : public QGraphicsView {   QtArrowsWidget(); }; #endif // QTARROWSWIDGET_H

 

 

 

 

 

./CppQtExample32/qtarrowswidget.cpp

 


#include <cassert> #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include <QGraphicsScene> #include <QGraphicsPixmapItem> #include "qtarrowitem.h" #include "qtarrowswidget.h" #pragma GCC diagnostic pop QtArrowsWidget::QtArrowsWidget() {   QGraphicsScene * const scene = new QGraphicsScene(this);   this->setScene(scene);   const int n_lines = 10;   for (int i=0; i!=n_lines; ++i)   {     const double x1 = ((static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX)) * 600.0) - 300.0;     const double y1 = ((static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX)) * 400.0) - 200.0;     const bool tail = (std::rand() >> 4) % 2;     const double x2 = ((static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX)) * 600.0) - 300.0;     const double y2 = ((static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX)) * 400.0) - 200.0;     const bool head = (std::rand() >> 4) % 2;     QtArrowItem * item = new QtArrowItem(x1,y1,tail,x2,y2,head);     scene->addItem(item);   } }

 

 

 

 

 

./CppQtExample32/qtmain.cpp

 


#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #include <QApplication> #include <QDesktopWidget> #include "dialog.h" #pragma GCC diagnostic pop int main(int argc, char *argv[]) {   QApplication a(argc, argv);   Dialog w;   {     //Resize the dialog and put it in the screen center     w.setGeometry(0,0,600,400);     const QRect screen = QApplication::desktop()->screenGeometry();     w.move( screen.center() - w.rect().center() );   }   w.show();   return a.exec(); }