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. Send action Codes to PushButton
QtWS25 Last Chance

Send action Codes to PushButton

Scheduled Pinned Locked Moved Solved General and Desktop
actionpush buttondrawlines
10 Posts 3 Posters 3.7k Views
  • 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.
  • M4RZB4NiM Offline
    M4RZB4NiM Offline
    M4RZB4Ni
    wrote on last edited by M4RZB4Ni
    #1

    Hello,
    I have a class with scene name
    and this class have codes that draw lines in a GraphicView
    this class is wrote for mainwindow that Use toolBar for
    Drawing
    but i want to
    So change the code that draw lines when i click pushButton
    not toolBar.
    Can any body change codes for me?
    MainWindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QGraphicsView>
    #include <QToolBar>
    #include "scene.h"
    #include <QAction>
    
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    public slots:
        void actionGroupClicked(QAction*);
    private:
        Ui::MainWindow *ui;
        QGraphicsView* view;
        Scene* scene;
    
        void createActions();
        void createConnections();
        void createToolBar();
    
        QAction* lineAction;
        QAction* selectAction;
        QActionGroup *actionGroup;
        QToolBar* drawingToolBar;
    };
    
    #endif // MAINWINDOW_H
    

    mainWindow.cpp:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        scene = new Scene(this);
        scene->setSceneRect(0,0,200,200);
        ui->graphicsView->setScene(scene);
        ui->graphicsView->setRenderHints(QPainter::Antialiasing);
        //setCentralWidget(ui->graphicsView);
    
        createActions();
        createConnections();
        createToolBar();
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    void MainWindow::createActions(){
        lineAction = new QAction("Draw line", this);
        lineAction->setData(int(Scene::DrawLine));
        lineAction->setIcon(QIcon(":/icons/line.png"));
        lineAction->setCheckable(true);
    
        selectAction = new QAction("Select object", this);
        selectAction->setData(int(Scene::SelectObject));
        selectAction->setIcon(QIcon(":/icons/select.png"));
        selectAction->setCheckable(true);
    
        actionGroup = new QActionGroup(this);
        actionGroup->setExclusive(true);
        actionGroup->addAction(lineAction);
        actionGroup->addAction(selectAction);
    }
    
    void MainWindow::createConnections(){
        connect(actionGroup, SIGNAL(triggered(QAction*)),
                this, SLOT(actionGroupClicked(QAction*)));
    }
    
    void MainWindow::actionGroupClicked(QAction *action){
        scene->setMode(Scene::Mode(action->data().toInt()));
    }
    
    void MainWindow::createToolBar(){
        drawingToolBar = new QToolBar;
        addToolBar(Qt::TopToolBarArea, drawingToolBar);
        drawingToolBar->addAction(selectAction);
        drawingToolBar->addAction(lineAction);
    }
    

    scene.h:

    #ifndef SCENE_H
    #define SCENE_H
    
    #include <QGraphicsScene>
    #include <QGraphicsSceneMouseEvent>
    #include <QGraphicsLineItem>
    #include <QAction>
    #include <QGraphicsView>
    #include <QKeyEvent>
    
    class Scene : public QGraphicsScene
    {
    public:
        scene();
        enum Mode {NoMode, SelectObject, DrawLine};
        Scene(QObject* parent = 0);
        void setMode(Mode mode);
    protected:
        void mousePressEvent(QGraphicsSceneMouseEvent *event);
        void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
        void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
        void keyPressEvent(QKeyEvent *event);
    private:
        Mode sceneMode;
        QPointF origPoint;
        QGraphicsLineItem* itemToDraw;
        void makeItemsControllable(bool areControllable);
    };
    
    #endif // SCENE_H
    
    

    scene.cpp:

    #include "scene.h"
    
    Scene::Scene(QObject* parent): QGraphicsScene(parent)
    {
        sceneMode = NoMode;
        itemToDraw = 0;
    }
    
    void Scene::setMode(Mode mode){
        sceneMode = mode;
        QGraphicsView::DragMode vMode =
                QGraphicsView::NoDrag;
        if(mode == DrawLine){
            makeItemsControllable(false);
            vMode = QGraphicsView::NoDrag;
        }
        else if(mode == SelectObject){
            makeItemsControllable(true);
            vMode = QGraphicsView::RubberBandDrag;
        }
        QGraphicsView* mView = views().at(0);
        if(mView)
            mView->setDragMode(vMode);
    }
    
    void Scene::makeItemsControllable(bool areControllable){
        foreach(QGraphicsItem* item, items()){
            item->setFlag(QGraphicsItem::ItemIsSelectable,
                          areControllable);
            item->setFlag(QGraphicsItem::ItemIsMovable,
                          areControllable);
        }
    }
    
    void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event){
        if(sceneMode == DrawLine)
            origPoint = event->scenePos();
        QGraphicsScene::mousePressEvent(event);
    }
    
    void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *event){
        if(sceneMode == DrawLine){
            if(!itemToDraw){
                itemToDraw = new QGraphicsLineItem;
                this->addItem(itemToDraw);
                itemToDraw->setPen(QPen(Qt::black, 3, Qt::SolidLine));
                itemToDraw->setPos(origPoint);
            }
            itemToDraw->setLine(0,0,
                                event->scenePos().x() - origPoint.x(),
                                event->scenePos().y() - origPoint.y());
        }
        else
            QGraphicsScene::mouseMoveEvent(event);
    }
    
    void Scene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event){
        itemToDraw = 0;
        QGraphicsScene::mouseReleaseEvent(event);
    }
    
    void Scene::keyPressEvent(QKeyEvent *event){
        if(event->key() == Qt::Key_Delete)
            foreach(QGraphicsItem* item, selectedItems()){
                removeItem(item);
                delete item;
            }
        else
            QGraphicsScene::keyPressEvent(event);
    }
    
    

    Thanks
    M4RZB4Ni

    1 Reply Last reply
    0
    • M Offline
      M Offline
      Maxim DC
      wrote on last edited by
      #2

      You could subclass the Button and then add an enum to define what to draw an make a variable of it, in the drawing function, do a switch case statement for every draw type on that one variable.

      M4RZB4NiM 1 Reply Last reply
      0
      • M Maxim DC

        You could subclass the Button and then add an enum to define what to draw an make a variable of it, in the drawing function, do a switch case statement for every draw type on that one variable.

        M4RZB4NiM Offline
        M4RZB4NiM Offline
        M4RZB4Ni
        wrote on last edited by
        #3

        @Maxim-DC
        i dont know what are you saying
        Exactly
        can you edit code please?

        Thanks
        M4RZB4Ni

        M 1 Reply Last reply
        0
        • M4RZB4NiM M4RZB4Ni

          @Maxim-DC
          i dont know what are you saying
          Exactly
          can you edit code please?

          M Offline
          M Offline
          Maxim DC
          wrote on last edited by
          #4
          This post is deleted!
          M4RZB4NiM 1 Reply Last reply
          0
          • M Maxim DC

            This post is deleted!

            M4RZB4NiM Offline
            M4RZB4NiM Offline
            M4RZB4Ni
            wrote on last edited by
            #5

            @Maxim-DC
            i have a graphicView and i want to draw line on it and erase lines
            what i must do?
            can you write a example for me?
            thanks:)

            Thanks
            M4RZB4Ni

            M 1 Reply Last reply
            0
            • M4RZB4NiM M4RZB4Ni

              @Maxim-DC
              i have a graphicView and i want to draw line on it and erase lines
              what i must do?
              can you write a example for me?
              thanks:)

              M Offline
              M Offline
              Maxim DC
              wrote on last edited by
              #6

              @M4RZB4Ni

              I think this will work, but i haven't tested it yet

              // view.h
              ...
              class View: public QGraphicsView
              {
              public:
                  View();
                  enum DrawType { Draw, Erase };
                  void paintEvent(QPaintEvent *) override;
                  
                  View::DrawType type;
              
              public slots:
                  void toggleType();
              private:
                  QPushButton button;
                  QPainter painter;
              };
              
              // view.cpp
              #include <view.h>
              
              View::View()
              {
                  type = View::Draw;
              
                  QObject::connect(&button, SIGNAL(clicked(bool)), this, SLOT(toggleType()));
              }
              
              void View::paintEvent(QPaintEvent *) 
              {
                  painter.restore()
                  switch (type)
                  {
                      case: View::Draw: painter.drawPoint(10, 10);
                      case: View::Erase: painter.eraseRect(10, 10, 100, 100)
                  }
                  painter.save();
              }
              
              void View::toggleType()
              {
                  switch (type)
                  {
                      case: View::Draw: type = View::Erase
                      case: View::Erase: type = View::Draw
                  }
              }
              
              M4RZB4NiM 1 Reply Last reply
              1
              • M Maxim DC

                @M4RZB4Ni

                I think this will work, but i haven't tested it yet

                // view.h
                ...
                class View: public QGraphicsView
                {
                public:
                    View();
                    enum DrawType { Draw, Erase };
                    void paintEvent(QPaintEvent *) override;
                    
                    View::DrawType type;
                
                public slots:
                    void toggleType();
                private:
                    QPushButton button;
                    QPainter painter;
                };
                
                // view.cpp
                #include <view.h>
                
                View::View()
                {
                    type = View::Draw;
                
                    QObject::connect(&button, SIGNAL(clicked(bool)), this, SLOT(toggleType()));
                }
                
                void View::paintEvent(QPaintEvent *) 
                {
                    painter.restore()
                    switch (type)
                    {
                        case: View::Draw: painter.drawPoint(10, 10);
                        case: View::Erase: painter.eraseRect(10, 10, 100, 100)
                    }
                    painter.save();
                }
                
                void View::toggleType()
                {
                    switch (type)
                    {
                        case: View::Draw: type = View::Erase
                        case: View::Erase: type = View::Draw
                    }
                }
                
                M4RZB4NiM Offline
                M4RZB4NiM Offline
                M4RZB4Ni
                wrote on last edited by
                #7

                @Maxim-DC
                code showed a error !
                error: 'void Scene::paintEvent(QPaintEvent*)' marked override, but does not override
                void paintEvent(QPaintEvent *) override;
                ^

                Thanks
                M4RZB4Ni

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  Hi,

                  Why not use QGraphicsLineItem ?

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  M4RZB4NiM 1 Reply Last reply
                  0
                  • SGaistS SGaist

                    Hi,

                    Why not use QGraphicsLineItem ?

                    M4RZB4NiM Offline
                    M4RZB4NiM Offline
                    M4RZB4Ni
                    wrote on last edited by M4RZB4Ni
                    #9

                    @SGaist
                    Hi,
                    Because id dont know how i must use it!
                    for my graphicView!
                    i want to draw line with mouse!

                    Thanks
                    M4RZB4Ni

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      You could use a QRubberBand to setup the line and once you release it add the QGraphicsLineItem to your scene.

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      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