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. Popup and pushButton - how to solve it
Forum Updated to NodeBB v4.3 + New Features

Popup and pushButton - how to solve it

Scheduled Pinned Locked Moved Unsolved General and Desktop
18 Posts 2 Posters 2.8k 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
    TomNow99
    wrote on last edited by TomNow99
    #7

    @mrjj I find it here:
    https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qpushbutton.cpp.html

    I find that function which I have to replace

    void QPushButtonPrivate::_q_popupPressed()

    But the problem is that I need class QPushButtonPrivate. Of course I find that too. But when I check QPushButtonPrivate I saw that I need QMenu and QMenuPrivate. I think there is better way to replace that QPushButtonPrivate function.

    EDIT:
    Of course I can have new class like QPushButton2. I don't need change QPushButton

    mrjjM 1 Reply Last reply
    0
    • T TomNow99

      @mrjj I find it here:
      https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qpushbutton.cpp.html

      I find that function which I have to replace

      void QPushButtonPrivate::_q_popupPressed()

      But the problem is that I need class QPushButtonPrivate. Of course I find that too. But when I check QPushButtonPrivate I saw that I need QMenu and QMenuPrivate. I think there is better way to replace that QPushButtonPrivate function.

      EDIT:
      Of course I can have new class like QPushButton2. I don't need change QPushButton

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

      @TomNow99
      Hi
      well in other cases you would apply the patch to Qt source and rebuild
      the Widget Module. But for such small thing, im not sure its worth it.

      Did you try with event filer on Application instead?
      That should work.
      Or use grabmouse to be sure to get it.

      1 Reply Last reply
      0
      • T Offline
        T Offline
        TomNow99
        wrote on last edited by
        #9

        @mrjj But I don't understand your idea.

        Filter on application. Do you think about eventFilter and installEventFilter? But in application? Do you think about that variable which I create in main.cpp?

        mrjjM 1 Reply Last reply
        0
        • T TomNow99

          @mrjj But I don't understand your idea.

          Filter on application. Do you think about eventFilter and installEventFilter? But in application? Do you think about that variable which I create in main.cpp?

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

          @TomNow99
          Hi
          Like
          qApp->installEventFilter(filter)
          qApp is macro to access the one from main.

          That should allow you to see the click out side.

          BUT

          But Before testing that, could you test with grabMouse on dialog ?
          it should allow you to get the final click with the code you have.

          https://doc.qt.io/qt-5/qwidget.html#grabMouse

          Make SURE to call releaseMouse()
          when you close dialog. always.

          1 Reply Last reply
          0
          • T Offline
            T Offline
            TomNow99
            wrote on last edited by TomNow99
            #11

            @mrjj But what I have to add in installEventFilter function? I always add "this", but here?

            And this grabWindow... I add this in click where I show dialog. But when I add this I can't click button to close dialog.

            mrjjM 1 Reply Last reply
            0
            • T TomNow99

              @mrjj But what I have to add in installEventFilter function? I always add "this", but here?

              And this grabWindow... I add this in click where I show dialog. But when I add this I can't click button to close dialog.

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

              @TomNow99
              hi
              The "this" is the pointer to the QObject that has the filter func
              see here
              https://forum.qt.io/topic/83995/eventfilter-anywhere-in-the-program/3
              its sets on the QApp. So I guess this for you would be where you have the filterfunction, maybe the dialog or the button.

              Its grapmouse :) Did you read about it ?
              What it does ?
              If you tell dialog to grab mouse you cannot click button while dialog is open. but it will work with click outside but that click is used to close dialog and it wont go to button that is outside.

              1 Reply Last reply
              1
              • T Offline
                T Offline
                TomNow99
                wrote on last edited by
                #13

                @mrjj I understand filter. Thank you :)

                GrabMouse - I understand fifty - fifty :D

                True - I can't click on button. But when I click outside the button ( MainWindow, where I add button ) ) I can't close dialog. When I clicked outside app ( for example click on desktop ) I close dialog.

                mrjjM 1 Reply Last reply
                0
                • T TomNow99

                  @mrjj I understand filter. Thank you :)

                  GrabMouse - I understand fifty - fifty :D

                  True - I can't click on button. But when I click outside the button ( MainWindow, where I add button ) ) I can't close dialog. When I clicked outside app ( for example click on desktop ) I close dialog.

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

                  @TomNow99
                  Ok good :)
                  well grabmouse simply make all events go to one widget instead of the normal way where they go to widget under mouse
                  so we say "give me all"

                  Should also work clicking in MainWindow. you should also get that event.

                  1 Reply Last reply
                  0
                  • T Offline
                    T Offline
                    TomNow99
                    wrote on last edited by
                    #15

                    @mrjj Now my code looks like:

                    MainWindow ( where I have button which shows / hides dialog ):

                    #include "mainwindow.h"
                    #include "ui_mainwindow.h"
                    
                    MainWindow::MainWindow(QWidget *parent)
                        : QMainWindow(parent)
                        , ui(new Ui::MainWindow)
                    {
                        ui->setupUi(this);
                        button = new QPushButton(this);
                        button->setGeometry(100,100,100,100);
                        connect(button, SIGNAL(clicked()), this, SLOT(clickedSlot()));
                        widget = new tenWidget; // tenWidget is a dialog
                        widget->setFixedSize(300,300);
                        widget->setFocus();
                    
                    }
                    
                    MainWindow::~MainWindow()
                    {
                        delete ui;
                    }
                    
                    void MainWindow::clickedSlot()
                    {
                        static int click=1;
                    
                        if(click%2==1)
                        {
                            widget->show();
                            grabMouse();
                        }
                        else
                        {
                            //widget->hide();
                        }
                        click++;
                    }
                    
                    

                    and the dialog ( tenWidget ):

                    #include "tenwidget.h"
                    
                    tenWidget::tenWidget(QWidget *parent)
                    {
                        setWindowFlag( Qt::FramelessWindowHint);
                        setStyleSheet("QDialog {background-color:red}");
                    }
                    
                    void tenWidget::focusOutEvent(QFocusEvent *event)
                    {
                        hide();
                        releaseMouse();
                    }
                    

                    Do you think about something like that? Or somewhere I have error?

                    mrjjM 1 Reply Last reply
                    0
                    • T TomNow99

                      @mrjj Now my code looks like:

                      MainWindow ( where I have button which shows / hides dialog ):

                      #include "mainwindow.h"
                      #include "ui_mainwindow.h"
                      
                      MainWindow::MainWindow(QWidget *parent)
                          : QMainWindow(parent)
                          , ui(new Ui::MainWindow)
                      {
                          ui->setupUi(this);
                          button = new QPushButton(this);
                          button->setGeometry(100,100,100,100);
                          connect(button, SIGNAL(clicked()), this, SLOT(clickedSlot()));
                          widget = new tenWidget; // tenWidget is a dialog
                          widget->setFixedSize(300,300);
                          widget->setFocus();
                      
                      }
                      
                      MainWindow::~MainWindow()
                      {
                          delete ui;
                      }
                      
                      void MainWindow::clickedSlot()
                      {
                          static int click=1;
                      
                          if(click%2==1)
                          {
                              widget->show();
                              grabMouse();
                          }
                          else
                          {
                              //widget->hide();
                          }
                          click++;
                      }
                      
                      

                      and the dialog ( tenWidget ):

                      #include "tenwidget.h"
                      
                      tenWidget::tenWidget(QWidget *parent)
                      {
                          setWindowFlag( Qt::FramelessWindowHint);
                          setStyleSheet("QDialog {background-color:red}");
                      }
                      
                      void tenWidget::focusOutEvent(QFocusEvent *event)
                      {
                          hide();
                          releaseMouse();
                      }
                      

                      Do you think about something like that? Or somewhere I have error?

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

                      @TomNow99
                      Hi
                      I was thinking tenWidget both had grab and release mouse.
                      As if you let button grab mouse then im not sure you can click on anything in tenWidget.

                      So i would let it grabmouse so it can get the click out side event.
                      then it can close it. but you cant click on button while its up but clicking over it will close anyway.
                      its not just really the button :)

                      1 Reply Last reply
                      0
                      • T Offline
                        T Offline
                        TomNow99
                        wrote on last edited by TomNow99
                        #17

                        @mrjj I read your post the fourth time and I don't know what I should do next :D

                        Should I change the place in the code where I grab or release mouse?

                        EDIT:
                        Of course I change:

                        grabWindow();
                        

                        to

                        widget->grabMouse();
                        

                        in mainWindow.

                        But the effect is the same.

                        mrjjM 1 Reply Last reply
                        0
                        • T TomNow99

                          @mrjj I read your post the fourth time and I don't know what I should do next :D

                          Should I change the place in the code where I grab or release mouse?

                          EDIT:
                          Of course I change:

                          grabWindow();
                          

                          to

                          widget->grabMouse();
                          

                          in mainWindow.

                          But the effect is the same.

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

                          @TomNow99
                          Hi
                          well widget->grabMouse(); should be fine
                          I dont see the event filter ?
                          But you have on on the tenWidget (widget) correct ?

                          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