How to change Qt's default selection behavior?
-
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 ?
-
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.
-
@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; }
-
@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; }
@tushu said in How to change Qt's default selection behavior?:
class ellipse : public QGraphicsItem
Shouldn't you subclass QGraphicsElipseItem as @SGaist already suggested?