Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to create an Arrow in QT
Forum Updated to NodeBB v4.3 + New Features

How to create an Arrow in QT

Scheduled Pinned Locked Moved Solved General and Desktop
19 Posts 3 Posters 10.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ManiRonM ManiRon

    @mrjj I saw the sample but i was not able to understand haw they have created the arrow thats why i asked for a simple sample

    mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by mrjj
    #6

    @ManiRon
    Ok.?
    its just the paint function you need..

    anyway, here it goes

    void DrawLineWithArrow(QPainter& painter, QPoint start, QPoint end) {
    
      painter.setRenderHint(QPainter::Antialiasing, true);
    
      qreal arrowSize = 40; // size of head
      painter.setPen(Qt::black);
      painter.setBrush(Qt::black);
    
      QLineF line(end, start);
    
      double angle = std::atan2(-line.dy(), line.dx());
      QPointF arrowP1 = line.p1() + QPointF(sin(angle + M_PI / 3) * arrowSize,
                                            cos(angle + M_PI / 3) * arrowSize);
      QPointF arrowP2 = line.p1() + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                                            cos(angle + M_PI - M_PI / 3) * arrowSize);
    
      QPolygonF arrowHead;
      arrowHead.clear();
      arrowHead << line.p1() << arrowP1 << arrowP2;
      painter.drawLine(line);
      painter.drawPolygon(arrowHead);
    
    }
    ... call like
    DrawLineWithArrow(paint, QPoint(0, 0), QPoint(300, 300));
    

    alt text

    ManiRonM 1 Reply Last reply
    6
    • mrjjM mrjj

      @ManiRon
      Ok.?
      its just the paint function you need..

      anyway, here it goes

      void DrawLineWithArrow(QPainter& painter, QPoint start, QPoint end) {
      
        painter.setRenderHint(QPainter::Antialiasing, true);
      
        qreal arrowSize = 40; // size of head
        painter.setPen(Qt::black);
        painter.setBrush(Qt::black);
      
        QLineF line(end, start);
      
        double angle = std::atan2(-line.dy(), line.dx());
        QPointF arrowP1 = line.p1() + QPointF(sin(angle + M_PI / 3) * arrowSize,
                                              cos(angle + M_PI / 3) * arrowSize);
        QPointF arrowP2 = line.p1() + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                                              cos(angle + M_PI - M_PI / 3) * arrowSize);
      
        QPolygonF arrowHead;
        arrowHead.clear();
        arrowHead << line.p1() << arrowP1 << arrowP2;
        painter.drawLine(line);
        painter.drawPolygon(arrowHead);
      
      }
      ... call like
      DrawLineWithArrow(paint, QPoint(0, 0), QPoint(300, 300));
      

      alt text

      ManiRonM Offline
      ManiRonM Offline
      ManiRon
      wrote on last edited by ManiRon
      #7

      @mrjj said in How to create an Arrow in QT:

      DrawLineWithArrow(paint, QPoint(0, 0), QPoint(300, 300));

      I tried to call like the way you mentioned (DrawLineWithArrow(paint, QPoint(0, 0), QPoint(300, 300));) but it is throwing error, Am i making any mistake ? This was the error

      C:\Qt\Qt5.5.0\Examples\Qt-5.5\widgets\graphicsview\diagramscene\mainwindow.cpp:87: error: no matching function for call to 'MainWindow::DrawLineWithArrow(QPainter*&, QPoint, QPoint)'
      DrawLineWithArrow(paint,QPoint(0,0), QPoint(0,0));
      ^

      mrjjM 1 Reply Last reply
      0
      • ManiRonM ManiRon

        @mrjj said in How to create an Arrow in QT:

        DrawLineWithArrow(paint, QPoint(0, 0), QPoint(300, 300));

        I tried to call like the way you mentioned (DrawLineWithArrow(paint, QPoint(0, 0), QPoint(300, 300));) but it is throwing error, Am i making any mistake ? This was the error

        C:\Qt\Qt5.5.0\Examples\Qt-5.5\widgets\graphicsview\diagramscene\mainwindow.cpp:87: error: no matching function for call to 'MainWindow::DrawLineWithArrow(QPainter*&, QPoint, QPoint)'
        DrawLineWithArrow(paint,QPoint(0,0), QPoint(0,0));
        ^

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #8

        @ManiRon

        Hi
        You could show how you defined "paint" as that could help.

        If you call it from the painter function of the sample
        where paint is a pointer you need
        DrawLineWithArrow( * paint,QPoint(0,0), QPoint(330,330));

        Or simply change it to take a pointer and not a ref (&)

        If doubt plese show the complete code from where u call it.

        ManiRonM 3 Replies Last reply
        0
        • mrjjM mrjj

          @ManiRon

          Hi
          You could show how you defined "paint" as that could help.

          If you call it from the painter function of the sample
          where paint is a pointer you need
          DrawLineWithArrow( * paint,QPoint(0,0), QPoint(330,330));

          Or simply change it to take a pointer and not a ref (&)

          If doubt plese show the complete code from where u call it.

          ManiRonM Offline
          ManiRonM Offline
          ManiRon
          wrote on last edited by
          #9
          This post is deleted!
          1 Reply Last reply
          0
          • mrjjM mrjj

            @ManiRon

            Hi
            You could show how you defined "paint" as that could help.

            If you call it from the painter function of the sample
            where paint is a pointer you need
            DrawLineWithArrow( * paint,QPoint(0,0), QPoint(330,330));

            Or simply change it to take a pointer and not a ref (&)

            If doubt plese show the complete code from where u call it.

            ManiRonM Offline
            ManiRonM Offline
            ManiRon
            wrote on last edited by
            #10

            @mrjj I Found the error i didnt define the paint correctly

            1 Reply Last reply
            0
            • mrjjM mrjj

              @ManiRon

              Hi
              You could show how you defined "paint" as that could help.

              If you call it from the painter function of the sample
              where paint is a pointer you need
              DrawLineWithArrow( * paint,QPoint(0,0), QPoint(330,330));

              Or simply change it to take a pointer and not a ref (&)

              If doubt plese show the complete code from where u call it.

              ManiRonM Offline
              ManiRonM Offline
              ManiRon
              wrote on last edited by
              #11

              @mrjj

                              #include "mainwindow.h"
                              
                              #include "ui_mainwindow.h"
                              
                              #include "qpainter.h"
                              
                              #include "math.h"
                              
                              #include "cmath"
                              
                              #include "QPointF"
                              
                              #include "QPolygonF"
                              
                              
                              
                              MainWindow::MainWindow(QWidget *parent) :
                              
                                  QMainWindow(parent),
                              
                                  ui(new Ui::MainWindow)
                              
                              {
                              
                                  ui->setupUi(this);
                              
                              
                              
                                  QPainter paint;
                              
                              
                              
                                  DrawLineWithArrow(paint,QPoint(0,0), QPoint(0,0));
                              
                              }
                              
                              
                              
                              MainWindow::~MainWindow()
                              
                              {
                              
                                  delete ui;
                              
                              }
                              
                              void MainWindow::DrawLineWithArrow(QPainter& painter, QPoint start, QPoint end)
                              
                              {
                              
                              
                              
                                painter.setRenderHint(QPainter::Antialiasing, true);
                              
                              
                              
                                qreal arrowSize = 40; // size of head
                              
                                painter.setPen(Qt::black);
                              
                                painter.setBrush(Qt::black);
                              
                              
                              
                                QLineF line(end, start);
                              
                              
                              
                                double angle = std::atan2(-line.dy(), line.dx());
                              
                                QPointF arrowP1 = line.p1() + QPointF(sin(angle + M_PI / 3) * arrowSize,
                              
                                                                      cos(angle + M_PI / 3) * arrowSize);
                              
                                QPointF arrowP2 = line.p1() + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                              
                                                                      cos(angle + M_PI - M_PI / 3) * arrowSize);
                              
                              
                              
                                QPolygonF arrowHead;
                              
                                arrowHead.clear();
                              
                                arrowHead << line.p1() << arrowP1 << arrowP2;
                              
                                painter.drawLine(line);
                              
                                painter.drawPolygon(arrowHead);
                              
                              
                              
                              }
              

              This is my whole code , Now my doubt is where i will be able to see this arrow

              jsulmJ 1 Reply Last reply
              0
              • ManiRonM ManiRon

                @mrjj

                                #include "mainwindow.h"
                                
                                #include "ui_mainwindow.h"
                                
                                #include "qpainter.h"
                                
                                #include "math.h"
                                
                                #include "cmath"
                                
                                #include "QPointF"
                                
                                #include "QPolygonF"
                                
                                
                                
                                MainWindow::MainWindow(QWidget *parent) :
                                
                                    QMainWindow(parent),
                                
                                    ui(new Ui::MainWindow)
                                
                                {
                                
                                    ui->setupUi(this);
                                
                                
                                
                                    QPainter paint;
                                
                                
                                
                                    DrawLineWithArrow(paint,QPoint(0,0), QPoint(0,0));
                                
                                }
                                
                                
                                
                                MainWindow::~MainWindow()
                                
                                {
                                
                                    delete ui;
                                
                                }
                                
                                void MainWindow::DrawLineWithArrow(QPainter& painter, QPoint start, QPoint end)
                                
                                {
                                
                                
                                
                                  painter.setRenderHint(QPainter::Antialiasing, true);
                                
                                
                                
                                  qreal arrowSize = 40; // size of head
                                
                                  painter.setPen(Qt::black);
                                
                                  painter.setBrush(Qt::black);
                                
                                
                                
                                  QLineF line(end, start);
                                
                                
                                
                                  double angle = std::atan2(-line.dy(), line.dx());
                                
                                  QPointF arrowP1 = line.p1() + QPointF(sin(angle + M_PI / 3) * arrowSize,
                                
                                                                        cos(angle + M_PI / 3) * arrowSize);
                                
                                  QPointF arrowP2 = line.p1() + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                                
                                                                        cos(angle + M_PI - M_PI / 3) * arrowSize);
                                
                                
                                
                                  QPolygonF arrowHead;
                                
                                  arrowHead.clear();
                                
                                  arrowHead << line.p1() << arrowP1 << arrowP2;
                                
                                  painter.drawLine(line);
                                
                                  painter.drawPolygon(arrowHead);
                                
                                
                                
                                }
                

                This is my whole code , Now my doubt is where i will be able to see this arrow

                jsulmJ Online
                jsulmJ Online
                jsulm
                Lifetime Qt Champion
                wrote on last edited by jsulm
                #12

                @ManiRon You need to overwrite paintEvent to be able to paint! https://doc.qt.io/qt-5/qwidget.html#paintEvent
                "Now my doubt is where i will be able to see this arrow" - on the widget where you overwrite paintEvent.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                ManiRonM 2 Replies Last reply
                2
                • jsulmJ jsulm

                  @ManiRon You need to overwrite paintEvent to be able to paint! https://doc.qt.io/qt-5/qwidget.html#paintEvent
                  "Now my doubt is where i will be able to see this arrow" - on the widget where you overwrite paintEvent.

                  ManiRonM Offline
                  ManiRonM Offline
                  ManiRon
                  wrote on last edited by
                  #13

                  @jsulm I tried it on my Mainwindow and i was not able to see

                  1 Reply Last reply
                  0
                  • jsulmJ jsulm

                    @ManiRon You need to overwrite paintEvent to be able to paint! https://doc.qt.io/qt-5/qwidget.html#paintEvent
                    "Now my doubt is where i will be able to see this arrow" - on the widget where you overwrite paintEvent.

                    ManiRonM Offline
                    ManiRonM Offline
                    ManiRon
                    wrote on last edited by ManiRon
                    #14

                    @jsulm said in How to create an Arrow in QT:

                    You need to overwrite paintEvent to be able to paint!

                    You need to overwrite paintEvent to be able to paint!

                    I am new to this thats why , can you please explain How this can be done ?

                    jsulmJ 1 Reply Last reply
                    0
                    • ManiRonM ManiRon

                      @jsulm said in How to create an Arrow in QT:

                      You need to overwrite paintEvent to be able to paint!

                      You need to overwrite paintEvent to be able to paint!

                      I am new to this thats why , can you please explain How this can be done ?

                      jsulmJ Online
                      jsulmJ Online
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #15

                      @ManiRon Take a look at this example: https://doc.qt.io/qt-5/qtwidgets-painting-basicdrawing-example.html

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      ManiRonM 2 Replies Last reply
                      2
                      • jsulmJ jsulm

                        @ManiRon Take a look at this example: https://doc.qt.io/qt-5/qtwidgets-painting-basicdrawing-example.html

                        ManiRonM Offline
                        ManiRonM Offline
                        ManiRon
                        wrote on last edited by
                        #16

                        @jsulm
                        Thanks Sir, I got it and made it, Here i provide my working code so that it will be useful for others

                                 #include "mainwindow.h"
                                 
                                 #include "ui_mainwindow.h"
                                 
                                 #include "qpainter.h"
                                 
                                 #include "math.h"
                                 
                                 #include "cmath"
                                 
                                 #include "QPointF"
                                 
                                 #include "QPolygonF"
                                 
                                 #include "QPaintEvent"
                                 
                                 
                                 
                                 MainWindow::MainWindow(QWidget *parent) :
                                 
                                     QMainWindow(parent),
                                 
                                     ui(new Ui::MainWindow)
                                 
                                 {
                                 
                                     ui->setupUi(this);
                                 
                                 
                                 
                                     setBackgroundRole(QPalette::Base);
                                 
                                     setAutoFillBackground(true);
                                 
                                 
                                 
                                 
                                 
                                 }
                                 
                                 
                                 
                                 MainWindow::~MainWindow()
                                 
                                 {
                                 
                                     delete ui;
                                 
                                 }
                                 
                                 void MainWindow::DrawLineWithArrow(QPainter& painter, QPoint start, QPoint end)
                                 
                                 {
                                 
                                 
                                 
                                   painter.setRenderHint(QPainter::Antialiasing, true);
                                 
                                 
                                 
                                   qreal arrowSize = 40; // size of head
                                 
                                   painter.setPen(Qt::black);
                                 
                                   painter.setBrush(Qt::black);
                                 
                                 
                                 
                                   QLineF line(end, start);
                                 
                                 
                                 
                                   double angle = std::atan2(-line.dy(), line.dx());
                                 
                                   QPointF arrowP1 = line.p1() + QPointF(sin(angle + M_PI / 3) * arrowSize,
                                 
                                                                         cos(angle + M_PI / 3) * arrowSize);
                                 
                                   QPointF arrowP2 = line.p1() + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                                 
                                                                         cos(angle + M_PI - M_PI / 3) * arrowSize);
                                 
                                 
                                 
                                   QPolygonF arrowHead;
                                 
                                   arrowHead.clear();
                                 
                                   arrowHead << line.p1() << arrowP1 << arrowP2;
                                 
                                   painter.drawLine(line);
                                 
                                   painter.drawPolygon(arrowHead);
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 }
                                 
                                 void MainWindow::paintEvent(QPaintEvent *)
                                 
                                 {
                                 
                                     static const QPoint points[2] = {
                                 
                                         QPoint(50, 100),
                                 
                                         QPoint(20, 20),
                                 
                                     };
                                 
                                         QPainter painter(this);
                                 
                                         painter.setPen(pen);
                                 
                                         painter.setBrush(brush);
                                 
                                 
                                 
                                     painter.setRenderHint(QPainter::Antialiasing, true);
                                 
                                 
                                 
                                     qreal arrowSize = 40; // size of head
                                 
                                     painter.setPen(Qt::black);
                                 
                                     painter.setBrush(Qt::black);
                                 
                                 
                                 
                                     QLineF line(points[1], points[0]);
                                 
                                 
                                 
                                     double angle = std::atan2(-line.dy(), line.dx());
                                 
                                     QPointF arrowP1 = line.p1() + QPointF(sin(angle + M_PI / 3) * arrowSize,
                                 
                                                                           cos(angle + M_PI / 3) * arrowSize);
                                 
                                     QPointF arrowP2 = line.p1() + QPointF(sin(angle + M_PI - M_PI / 3) * arrowSize,
                                 
                                                                           cos(angle + M_PI - M_PI / 3) * arrowSize);
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                     QPolygonF arrowHead;
                                 
                                     arrowHead.clear();
                                 
                                     arrowHead << line.p1() << arrowP1 << arrowP2;
                                 
                                     painter.drawLine(line);
                                 
                                     painter.drawPolygon(arrowHead);
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 
                                 //    painter.setRenderHint(QPainter::Antialiasing, false);
                                 
                                 //    painter.setPen(palette().dark().color());
                                 
                                 //    painter.setBrush(Qt::NoBrush);
                                 
                                 //    painter.drawRect(QRect(0, 0, width() - 1, height() - 1));
                                 
                                 
                                 
                                 //    painter.restore();
                                 
                                 
                                 
                                 }
                        
                        1 Reply Last reply
                        1
                        • jsulmJ jsulm

                          @ManiRon Take a look at this example: https://doc.qt.io/qt-5/qtwidgets-painting-basicdrawing-example.html

                          ManiRonM Offline
                          ManiRonM Offline
                          ManiRon
                          wrote on last edited by ManiRon
                          #17

                          @jsulm One more doubt if i want to use QPainterpath to draw the same arrow how this can be done

                          Why I ask the same in QPainterPath is that i want to use it in QCustomplot

                          mrjjM 1 Reply Last reply
                          0
                          • ManiRonM ManiRon

                            @jsulm One more doubt if i want to use QPainterpath to draw the same arrow how this can be done

                            Why I ask the same in QPainterPath is that i want to use it in QCustomplot

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by mrjj
                            #18

                            @ManiRon said in How to create an Arrow in QT:

                            QPainterPath

                            Yes i think you can convert the code to use QPainterPath .
                            it has a line function
                            https://doc.qt.io/qt-5/qpainterpath.html#lineTo
                            and a
                            https://doc.qt.io/qt-5/qpainterpath.html#addPolygon
                            for the QPolygonF arrowHead;

                            ManiRonM 1 Reply Last reply
                            0
                            • mrjjM mrjj

                              @ManiRon said in How to create an Arrow in QT:

                              QPainterPath

                              Yes i think you can convert the code to use QPainterPath .
                              it has a line function
                              https://doc.qt.io/qt-5/qpainterpath.html#lineTo
                              and a
                              https://doc.qt.io/qt-5/qpainterpath.html#addPolygon
                              for the QPolygonF arrowHead;

                              ManiRonM Offline
                              ManiRonM Offline
                              ManiRon
                              wrote on last edited by
                              #19

                              @mrjj Thanks but i used QPixmap and it worked thanks all for helping me out

                              1 Reply Last reply
                              0

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved