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
    #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