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 change Qt's default selection behavior?
Forum Updated to NodeBB v4.3 + New Features

How to change Qt's default selection behavior?

Scheduled Pinned Locked Moved Unsolved General and Desktop
4 Posts 3 Posters 388 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.
  • T Offline
    T Offline
    tushu
    wrote on last edited by
    #1

    I am new to QGraphicsView. So for the practice purpose I was drawing some shapes like Rectangle, Ellipse, Polygon, Polyline, Text etc.
    I observed here that, whenever we click on these drawn objects ( select them using mouse click )
    dashed line rectangle appears around the object which indicates that, object is selected.
    If I want to change that Qt's default behavior of selection, how to do that ?

    I do not want dashed rectangle around circle, when it will be clicked by mouse, but that dashed should be around its circumference.

    void Widget::on_ellipsePushButton_clicked()
    {
        QGraphicsEllipseItem *ellipse = new QGraphicsEllipseItem();
        ellipse = scene->addEllipse(2,2,80,80);
        QPen mPen;
        mPen.setWidth(3);
        mPen.setColor(Qt::gray);
    
        ellipse->setPen(mPen);
        ellipse->setBrush(QBrush(Qt::blue));
    
        scene->addItem(ellipse);
    }
    

    Above code simply prints ellipse.
    I got help to override paint method.

    void Widget::paint(QPainter *painter, QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        auto selected = option->state & QStyle::State_Selected;
        option->state &=  ~QStyle::State_Selected;
        paint(painter, option, widget);
    
        if (selected) {
    
          qDebug()<<"Item is selected ";
          painter->setPen(Qt::DotLine);
        }
        option->state &= selected;
    }
    

    But I dont know, how to call this paint method. I am new to Qt, can anyone help me ?

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

      Hi and welcome to devnet,

      That method will be called automatically but you have put it in the wrong place.

      You need to subclass QGraphicsElipseItem and add the method there.

      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
      1
      • T Offline
        T Offline
        tushu
        wrote on last edited by tushu
        #3

        @SGaist Here is my full code, I changed it according to your comment but still not able to solve problem. paint() method is not getting called. I applied some logs and found that, mousePressEvent is not occuring.

        ellipse.h

        class ellipse : public QGraphicsItem
        {
           
        public:
           ellipse();
           virtual void paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
           bool pressed;
        
        protected:
           void mousePressEvent(QGraphicsSceneMouseEvent *event);
           void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
        };
        
        widget.h     
        
        
        #include "ellipse.h"
        QT_BEGIN_NAMESPACE
            namespace Ui { class Widget; }
            QT_END_NAMESPACE
            class Widget : public QWidget
            {
                Q_OBJECT
            public:
                Widget(QWidget *parent = nullptr);
                ~Widget();
            private:
                Ui::Widget *ui;
                QGraphicsScene *scene;
            };
        

        ellipse.cpp

        ellipse::ellipse()
        {
            pressed = false;
        }
         void ellipse :: paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
         {
                if(pressed)
                {
                    QPainterPath path;
                    path.addEllipse(2,2,220,220);
                    painter->save();
                    painter->setBrush(Qt::NoBrush);
                    painter->setPen(QPen(option->palette.windowText(), 0, Qt::DashLine));
                    painter->drawPath(path);
                    painter->restore();
                }
         }
        
         void ellipse::mousePressEvent(QGraphicsSceneMouseEvent *event)
         {
             pressed = true;
             update();
             QGraphicsItem::mousePressEvent(event);
         }
        
         void ellipse::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
         {
             pressed = false;
             update();
             QGraphicsItem::mouseReleaseEvent(event);
         }
        

        widget.cpp

        #include "ellipse.h"

        Widget::Widget(QWidget *parent)
            : QWidget(parent)
            , ui(new Ui::Widget)
        {
            ui->setupUi(this);
        
           scene = new QGraphicsScene(this);
           ui->graphicsView->setScene(scene);
        
           QGraphicsEllipseItem *ellipse1 = new QGraphicsEllipseItem();
           ellipse1 = scene->addEllipse(2,2,220,220);
           ellipse1->setFlag(QGraphicsItem::ItemIsSelectable);
           scene->addItem(ellipse1);
        }
        
        Widget::~Widget()
        {
            delete ui;
        }
        
        jsulmJ 1 Reply Last reply
        0
        • T tushu

          @SGaist Here is my full code, I changed it according to your comment but still not able to solve problem. paint() method is not getting called. I applied some logs and found that, mousePressEvent is not occuring.

          ellipse.h

          class ellipse : public QGraphicsItem
          {
             
          public:
             ellipse();
             virtual void paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
             bool pressed;
          
          protected:
             void mousePressEvent(QGraphicsSceneMouseEvent *event);
             void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
          };
          
          widget.h     
          
          
          #include "ellipse.h"
          QT_BEGIN_NAMESPACE
              namespace Ui { class Widget; }
              QT_END_NAMESPACE
              class Widget : public QWidget
              {
                  Q_OBJECT
              public:
                  Widget(QWidget *parent = nullptr);
                  ~Widget();
              private:
                  Ui::Widget *ui;
                  QGraphicsScene *scene;
              };
          

          ellipse.cpp

          ellipse::ellipse()
          {
              pressed = false;
          }
           void ellipse :: paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
           {
                  if(pressed)
                  {
                      QPainterPath path;
                      path.addEllipse(2,2,220,220);
                      painter->save();
                      painter->setBrush(Qt::NoBrush);
                      painter->setPen(QPen(option->palette.windowText(), 0, Qt::DashLine));
                      painter->drawPath(path);
                      painter->restore();
                  }
           }
          
           void ellipse::mousePressEvent(QGraphicsSceneMouseEvent *event)
           {
               pressed = true;
               update();
               QGraphicsItem::mousePressEvent(event);
           }
          
           void ellipse::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
           {
               pressed = false;
               update();
               QGraphicsItem::mouseReleaseEvent(event);
           }
          

          widget.cpp

          #include "ellipse.h"

          Widget::Widget(QWidget *parent)
              : QWidget(parent)
              , ui(new Ui::Widget)
          {
              ui->setupUi(this);
          
             scene = new QGraphicsScene(this);
             ui->graphicsView->setScene(scene);
          
             QGraphicsEllipseItem *ellipse1 = new QGraphicsEllipseItem();
             ellipse1 = scene->addEllipse(2,2,220,220);
             ellipse1->setFlag(QGraphicsItem::ItemIsSelectable);
             scene->addItem(ellipse1);
          }
          
          Widget::~Widget()
          {
              delete ui;
          }
          
          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @tushu said in How to change Qt's default selection behavior?:

          class ellipse : public QGraphicsItem

          Shouldn't you subclass QGraphicsElipseItem as @SGaist already suggested?

          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