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. QGraphicsObject: ContextMenu does not show up
Forum Updated to NodeBB v4.3 + New Features

QGraphicsObject: ContextMenu does not show up

Scheduled Pinned Locked Moved Solved General and Desktop
16 Posts 4 Posters 1.3k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #6

    Hi,

    Make it a member variable and delete it in your class destructor.

    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
    2
    • S sandro4912

      if i create menu dynamically who deallocates it later? I can't assign the Room to it as a parent since is not derrived from QWidget.

      Also i tryed:

      void Room::drawRoom(QPainter *painter)
      {
          qDebug() << boundingRect();
          qDebug() << roomImage().size();
      
          painter->drawImage(boundingRect(), roomImage());
      }
      

      Which outputs:

      QRectF(0,0 100x100)
      QSize(100, 100)
      

      So it should theoretically pop the menu in the whole image but it doesn't?

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #7

      @sandro4912
      For dynamically created QMenu, then as @SGaist says.

      But are you sure you need QMenu:popUp() and not just QMenu::exec() for your use case? It depends how you want it to work. If the simple exec() suffices you should be able to just use a stack (local) variable QMenu menu. You don't need the menu after it has returned the action the user clicked.

      For your coordinates/click area, I don't think we're going to know. Is your image indeed 100x100 size, or is that maybe some default? Why don't you play with a bigger/smaller image and see what the pattern is?

      1 Reply Last reply
      1
      • S Offline
        S Offline
        sandro4912
        wrote on last edited by sandro4912
        #8

        there is nothing wrong with the image but to sort it out i did this:

        void Room::paint(
                QPainter *painter,
                const QStyleOptionGraphicsItem *option,
                QWidget *widget)
        {
            QRectF rect{boundingRect()};
            painter->setPen(Qt::black);
            painter->drawRect(rect);
        }
        
        QRectF Room::boundingRect() const
        {
            return QRectF{ 0, 0, 200, 200};
        }
        

        Still the Menu is not popped up on the whole rect. It only appeas like on 1/3 of the size of QRectF{ 0, 0, 200, 200}; so is not always half. Does contextMenuEvent maybe check the size from somewhere else but not from the boundingRect ? Or is this simply a bug in QT?

        I also compiled the code an a second OS to sort out that its not annother bug with KDE/Neon. But on Windows 10 same behaviour.

        Also I stayed with the local Menu:

        void Room::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
        {
            qDebug() << boundingRect();
            qDebug() << roomImage().size();
        
            QMenu menu;
            menu.addAction(mGuessWumpusAction);
            menu.addAction(mGuessBatAction);
            menu.addAction(mGuessPitAction);
            menu.exec(event->screenPos());
        }
        

        Any more ideas??

        Christian EhrlicherC 1 Reply Last reply
        0
        • S Offline
          S Offline
          sandro4912
          wrote on last edited by
          #9

          let me know if you need more information to find a solution for this issue. Maybe is even a qt bug.

          1 Reply Last reply
          0
          • S sandro4912

            there is nothing wrong with the image but to sort it out i did this:

            void Room::paint(
                    QPainter *painter,
                    const QStyleOptionGraphicsItem *option,
                    QWidget *widget)
            {
                QRectF rect{boundingRect()};
                painter->setPen(Qt::black);
                painter->drawRect(rect);
            }
            
            QRectF Room::boundingRect() const
            {
                return QRectF{ 0, 0, 200, 200};
            }
            

            Still the Menu is not popped up on the whole rect. It only appeas like on 1/3 of the size of QRectF{ 0, 0, 200, 200}; so is not always half. Does contextMenuEvent maybe check the size from somewhere else but not from the boundingRect ? Or is this simply a bug in QT?

            I also compiled the code an a second OS to sort out that its not annother bug with KDE/Neon. But on Windows 10 same behaviour.

            Also I stayed with the local Menu:

            void Room::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
            {
                qDebug() << boundingRect();
                qDebug() << roomImage().size();
            
                QMenu menu;
                menu.addAction(mGuessWumpusAction);
                menu.addAction(mGuessBatAction);
                menu.addAction(mGuessPitAction);
                menu.exec(event->screenPos());
            }
            

            Any more ideas??

            Christian EhrlicherC Offline
            Christian EhrlicherC Offline
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on last edited by
            #10

            @sandro4912 said in QGraphicsObject: ContextMenu does not show up:

            Still the Menu is not popped up on the whole rect. It only appeas like on 1/3 of the size of QRectF{ 0, 0, 200, 200}; so is not always half. Does contextMenuEvent maybe check the size from somewhere else but not from the boundingRect ?

            I don't understand what you say here - does the popup / context menu event only works on 1/3 of your widget? Is the popup not as big as you expect?

            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
            Visit the Qt Academy at https://academy.qt.io/catalog

            1 Reply Last reply
            0
            • S Offline
              S Offline
              sandro4912
              wrote on last edited by
              #11

              the popup itself looks perfect.

              The problem is it does not get triggered in the whole 200x200 area of the widget. It only looks like it gets shown in a smaller rectangle from the top left point.

              so in 200x200 maybe only in 80x80 from top left point it gets created.

              I would expect in the whole rectangle the context menu gets triggere.

              maybe i should make a minimal running example so it can be verifyed.

              1 Reply Last reply
              0
              • Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #12

                Ok, now it's clear to me. There are two examples (diagramscene, boxes) which work fine for me. Maybe you can try them out.

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  sandro4912
                  wrote on last edited by
                  #13

                  I made a minimal program and it works:

                  #ifndef RECTANGLE_H
                  #define RECTANGLE_H
                  
                  #include <QGraphicsObject>
                  
                  class Rectangle : public QGraphicsObject
                  {
                      Q_OBJECT
                  public:
                      explicit Rectangle(QGraphicsObject *parent = nullptr);
                  
                      QRectF boundingRect() const override;
                  
                      void paint(QPainter *painter,
                                 const QStyleOptionGraphicsItem *option,
                                 QWidget *widget) override;
                  
                  protected:
                      void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
                  };
                  
                  #endif // RECTANGLE_H
                  
                  #include "rectangle.h"
                  
                  #include <QGraphicsSceneContextMenuEvent>
                  #include <QPainter>
                  #include <QMenu>
                  
                  Rectangle::Rectangle(QGraphicsObject *parent)
                      : QGraphicsObject(parent)
                  {
                  }
                  
                  QRectF Rectangle::boundingRect() const
                  {
                      return QRectF{ 0, 0, 100, 100};
                  }
                  
                  void Rectangle::paint(
                          QPainter *painter,
                          const QStyleOptionGraphicsItem *option,
                          QWidget *widget)
                  {
                      Q_UNUSED(option)
                      Q_UNUSED(widget)
                  
                      QRectF rect{boundingRect()};
                      painter->setPen(Qt::black);
                      painter->drawRect(rect);
                  }
                  
                  void Rectangle::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
                  {
                      QMenu menu;
                      menu.addAction("Action 1");
                      menu.addAction("Action 2");
                      menu.exec(event->screenPos());
                  }
                  
                  #include "rectangle.h"
                  
                  #include <QApplication>
                  #include <QGraphicsScene>
                  #include <QGraphicsView>
                  
                  int main(int argc, char *argv[])
                  {
                      QApplication app(argc, argv);
                  
                      QGraphicsScene scene;
                  
                      Rectangle rectangle;
                      scene.addItem(&rectangle);
                  
                      QGraphicsView view;
                      view.setScene(&scene);
                  
                      view.show();
                      return QApplication::exec();
                  }
                  

                  Everything fine here the popup shows up in all the widget. The reason it does not work in my programm is. At some point i changed the class from QGraphicsObject to QGraphicsWidget. If we modify the minimal programm to have QGraphicsWidget as a base for Rectangle we get the Issue again:

                  #ifndef RECTANGLE_H
                  #define RECTANGLE_H
                  
                  #include <QGraphicsWidget>
                  
                  class Rectangle : public QGraphicsWidget
                  {
                      Q_OBJECT
                  public:
                      explicit Rectangle(QGraphicsWidget *parent = nullptr);
                  
                      QRectF boundingRect() const override;
                  
                      void paint(QPainter *painter,
                                 const QStyleOptionGraphicsItem *option,
                                 QWidget *widget) override;
                  
                  protected:
                      void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
                  };
                  
                  #endif // RECTANGLE_H
                  
                  #include "rectangle.h"
                  
                  #include <QGraphicsSceneContextMenuEvent>
                  #include <QPainter>
                  #include <QMenu>
                  
                  Rectangle::Rectangle(QGraphicsWidget *parent)
                      : QGraphicsWidget(parent)
                  {
                  }
                  
                  QRectF Rectangle::boundingRect() const
                  {
                      return QRectF{ 0, 0, 100, 100};
                  }
                  
                  void Rectangle::paint(
                          QPainter *painter,
                          const QStyleOptionGraphicsItem *option,
                          QWidget *widget)
                  {
                      Q_UNUSED(option)
                      Q_UNUSED(widget)
                  
                      QRectF rect{boundingRect()};
                      painter->setPen(Qt::black);
                      painter->drawRect(rect);
                  }
                  
                  void Rectangle::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
                  {
                      QMenu menu;
                      menu.addAction("Action 1");
                      menu.addAction("Action 2");
                      menu.exec(event->screenPos());
                  }
                  
                  #include "rectangle.h"
                  
                  #include <QApplication>
                  #include <QGraphicsScene>
                  #include <QGraphicsView>
                  
                  int main(int argc, char *argv[])
                  {
                      QApplication app(argc, argv);
                  
                      QGraphicsScene scene;
                  
                      Rectangle rectangle;
                      scene.addItem(&rectangle);
                  
                      QGraphicsView view;
                      view.setScene(&scene);
                  
                      view.show();
                      return QApplication::exec();
                  }
                  

                  So why is the behaviour different with QGraphicWidget? How can it get fixed there?

                  1 Reply Last reply
                  0
                  • Christian EhrlicherC Offline
                    Christian EhrlicherC Offline
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by Christian Ehrlicher
                    #14

                    You forgot to set a proper size of the QGraphicsWidget: https://doc.qt.io/qt-5/qgraphicswidget.html#size-prop - since it's a widget you have to treat it like a widget which also means you have to set a proper size since there is no layout from where the size could be calculated from.

                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                    Visit the Qt Academy at https://academy.qt.io/catalog

                    1 Reply Last reply
                    2
                    • S Offline
                      S Offline
                      sandro4912
                      wrote on last edited by
                      #15

                      I solved the issue by resize in the constructor:

                          resize(boundingRect().size());
                      

                      That should be it or any other things to concern?

                      1 Reply Last reply
                      0
                      • Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #16

                        @sandro4912 said in QGraphicsObject: ContextMenu does not show up:

                        That should be it or any other things to concern?

                        That's fine.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        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