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. QGraphicsItem to react on CTRL left click
Forum Updated to NodeBB v4.3 + New Features

QGraphicsItem to react on CTRL left click

Scheduled Pinned Locked Moved General and Desktop
18 Posts 5 Posters 4.7k Views 4 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.
  • J Offline
    J Offline
    JanLaloux
    wrote on last edited by
    #6

    No help, not with protected: nor protected: virtual ...

    mrjjM 1 Reply Last reply
    0
    • J JanLaloux

      No help, not with protected: nor protected: virtual ...

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

      @JanLaloux
      Ok, Im on mobile so cant check the code.
      Have a look at the 40000 sample (in chip.h)
      It has a clickable item.

      1 Reply Last reply
      0
      • J Offline
        J Offline
        JanLaloux
        wrote on last edited by
        #8

        I noticed in Chip that the event passed is of type QGraphicsSceneMouseEvent * instead of QMouseEvent *. Changed it and now it works, even as public. Thanks for the support!

        mrjjM 1 Reply Last reply
        0
        • J JanLaloux

          I noticed in Chip that the event passed is of type QGraphicsSceneMouseEvent * instead of QMouseEvent *. Changed it and now it works, even as public. Thanks for the support!

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

          @JanLaloux
          Good spotted! :)

          1 Reply Last reply
          0
          • Chris KawaC Offline
            Chris KawaC Offline
            Chris Kawa
            Lifetime Qt Champion
            wrote on last edited by
            #10

            On a side note: when overriding virtual methods use the override specifier. This way you'll get an instant error message at compile time if you make a typo or mismatch arguments like in this case.

            1 Reply Last reply
            0
            • J Offline
              J Offline
              JanLaloux
              wrote on last edited by
              #11

              OK, now I understand the meaning of the Q_DECL_OVERRIDE macro I used to see in the examples...

              1 Reply Last reply
              0
              • J Offline
                J Offline
                JanLaloux
                wrote on last edited by
                #12

                I have modified my example. The mouse click works but I experience something strange. After something was clicked whatever click anywhere on the scene triggers the same mouse click method of the first clicked object! Any ideas on this?

                #include <string>;
                #include <QtWidgets/QApplication>
                #include <QtWidgets/QMessageBox>
                #include <QtWidgets/QMainWindow>
                #include <QtWidgets/QGraphicsScene>
                #include <QtWidgets/QGraphicsView>
                #include <QtWidgets/QGridLayout>
                #include <QtWidgets/QGraphicsEllipseItem>
                
                using namespace std;
                
                
                class Circle : public QGraphicsEllipseItem {
                public:
                	Circle::Circle(int Id, const qreal ax, const qreal ay, const qreal wx, const qreal wy, QGraphicsScene *scene) :
                		QGraphicsEllipseItem(ax, ay, wx, wy),
                		Id(Id)
                	{
                		setPen( QPen(QBrush(Qt::black), 1, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin) );
                		setBrush( QBrush(Qt::gray) );
                		setRect(ax, ay, wx, wy);
                		setAcceptedMouseButtons(Qt::LeftButton | Qt::RightButton);
                		scene->addItem(this);
                	}
                
                	~Circle(){}
                
                	void Circle::mousePressEvent(QGraphicsSceneMouseEvent *event) {
                		QMessageBox msgBox;
                		string msg{ "Circle " + to_string(Id) + " clicked" };
                		QString QResult{ QString::fromLatin1(msg.c_str()) };
                		msgBox.setText( QResult );
                		msgBox.exec();
                	}
                	int Id;
                };
                
                
                
                
                class MainWindow : public QMainWindow
                {
                public:
                	QWidget *baseWidget;
                	QGridLayout *baseWidgetGrid;
                	QGraphicsScene *graphicsScene;
                	QGraphicsView *graphicsView;
                
                public:
                	MainWindow::MainWindow(QWidget *parent=0) :
                		QMainWindow(parent)
                	{
                		graphicsScene = new QGraphicsScene(0, 0, 120, 120);
                		graphicsScene->addRect( 10, 10,  100, 100 );
                		new Circle( 1, 20, 20, 20, 20, graphicsScene );
                		new Circle( 2, 75, 75, 20, 20, graphicsScene );
                
                		baseWidget = new QWidget(this);
                		baseWidgetGrid = new QGridLayout(baseWidget);
                			graphicsView = new QGraphicsView(baseWidget);
                			graphicsView->setRenderHint(QPainter::Antialiasing);
                			graphicsView->setScene(graphicsScene);
                		baseWidgetGrid->addWidget(graphicsView, 0, 0, 1, 1);
                
                		setCentralWidget(baseWidget);
                	}
                
                	~MainWindow(){}
                };
                
                
                int main(int argc, char *argv[])
                {
                	QApplication Application(argc, argv);
                	MainWindow MainWin;
                	MainWin.show();
                	return Application.exec();
                }
                
                1 Reply Last reply
                0
                • mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by mrjj
                  #13

                  @JanLaloux said:

                  so when clicking outside, it would still say
                  "Circle " bla bla from the msgBox ?

                  I wonder if scene or view need
                  setMouseTracking(true);

                  J 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    @JanLaloux said:

                    so when clicking outside, it would still say
                    "Circle " bla bla from the msgBox ?

                    I wonder if scene or view need
                    setMouseTracking(true);

                    J Offline
                    J Offline
                    JanLaloux
                    wrote on last edited by
                    #14

                    @mrjj
                    Yes, wherever you click on the scene you get the messagebox with the ID of the circle that was first clicked. The code I included is "ready to go" if you want to try it.

                    mrjjM 1 Reply Last reply
                    0
                    • J JanLaloux

                      @mrjj
                      Yes, wherever you click on the scene you get the messagebox with the ID of the circle that was first clicked. The code I included is "ready to go" if you want to try it.

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

                      @JanLaloux
                      Hi , very strange. it said nothing when I clicked. not on circle or outside.

                      update:
                      Ahh I see that older post used QGraphicsSceneMouseEvent and not QMouseEvent
                      so just copy & paste error I guess.

                      I then added

                      protected:
                          virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) {
                          qDebug() << "test";
                          }
                      

                      to Circle and now it print test when click on circle but not outside.

                      So not really sure whats going on.

                      Does that work for you too?

                      #include <QApplication>
                      #include <QMessageBox>
                      #include <QtWidgets/QMainWindow>
                      #include <QtWidgets/QGraphicsScene>
                      #include <QtWidgets/QGraphicsView>
                      #include <QtWidgets/QGridLayout>
                      #include <QtWidgets/QGraphicsEllipseItem>
                      #include <qDebug>
                      
                      class Circle : public QGraphicsEllipseItem {
                      public:
                          Circle(const qreal ax, const qreal ay, const qreal wx, const qreal wy, QGraphicsScene *scene) :
                              QGraphicsEllipseItem(ax, ay, wx, wy)
                          {
                              setPen( QPen(QBrush(Qt::black), 2, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin) );
                              setBrush( QBrush(Qt::gray) );
                              setRect(ax, ay, wx, wy);
                              setAcceptedMouseButtons(Qt::LeftButton | Qt::RightButton);
                              scene->addItem(this);
                          }
                      
                          ~Circle(){}
                      protected:
                          virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) {
                          qDebug() << "test";
                          }
                      
                         virtual void mousePressEvent(QMouseEvent *event) {
                              QMessageBox msgBox;
                              QString QResult("DEER");
                              msgBox.setText( QResult );
                              msgBox.exec();
                          }
                      };
                      
                      
                      
                      class MainWindow : public QMainWindow
                      {
                      public:
                          QWidget *baseWidget;
                          QGridLayout *baseWidgetGrid;
                          QGraphicsScene *graphicsScene;
                          QGraphicsView *graphicsView;
                      
                      public:
                          MainWindow(QWidget *parent=0) :
                              QMainWindow(parent)
                          {
                              graphicsScene = new QGraphicsScene(0, 0, 100, 100);
                              new Circle(  5,  5, 20, 20, graphicsScene );
                              new Circle( 35, 35, 20, 20, graphicsScene );
                              new Circle( 65, 65, 20, 20, graphicsScene );
                      
                              baseWidget = new QWidget(this);
                              baseWidgetGrid = new QGridLayout(baseWidget);
                                  graphicsView = new QGraphicsView(baseWidget);
                                  graphicsView->setScene(graphicsScene);
                              baseWidgetGrid->addWidget(graphicsView, 0, 0, 1, 1);
                      
                              setCentralWidget(baseWidget);
                          }
                      
                          ~MainWindow(){}
                      };
                      
                      
                      int main(int argc, char *argv[])
                      {
                          QApplication Application(argc, argv);
                          MainWindow MainWin;
                          MainWin.show();
                          return Application.exec();
                      }
                      
                      1 Reply Last reply
                      0
                      • J Offline
                        J Offline
                        JanLaloux
                        wrote on last edited by
                        #16

                        It's the msgBox that is the culprit!
                        Replace the qDebug output with the messagebox I used in my code and it goes wrong. The behaviour is as it should without it, I suppose this is a bug...
                        Remark: it is not needed to make the member protected
                        Anyway, thanks a lot for the help!

                        1 Reply Last reply
                        0
                        • mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #17

                          aha!
                          Pretty strange.

                          ok, its a habit for mousepressed for widgets :)

                          np. Good with code you can just run :)

                          1 Reply Last reply
                          0
                          • W Offline
                            W Offline
                            willems1994
                            wrote on last edited by
                            #18

                            For people having the same problem that the QMessageBox keeps appearing anywhere you click, you can fix it by ungrabbing the mouse after closing the box:

                            scene->mouseGrabberItem()->ungrabMouse();
                            

                            @JanLaloux said in QGraphicsItem to react on CTRL left click:

                            @mrjj
                            Yes, wherever you click on the scene you get the messagebox with the ID of the circle that was first clicked. The code I included is "ready to go" if you want to try it.

                            1 Reply Last reply
                            2

                            • Login

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