[Interest] How can I block the WindowActivate and FocusIn events when showing window programmatically
Yili Pan
pyl0420 at gmail.com
Sat Nov 1 22:50:54 CET 2014
Hi John:
Thanks:) Actually we have some problem with the resize and move also, I can
understand most of your solution, but could you explain more about why
calling doing this part
moving = true;
movedWidget = somewidget;
somewidget->move();
return <whatever>;
inside of a event filter?
Thanks,
-Yili
On Fri, Oct 31, 2014 at 11:56 AM, John Weeks <john at wavemetrics.com> wrote:
> It's the same situation with Move and Resize events. In Qt 4, you could do
> this:
>
> bool myclass::eventFilter(QObject * target, QEvent *event)
> {
> static bool moving = false;
>
> case QEvent::move:
>
> // In Qt 4, the move event comes synchronously, so we know
> that only our call to QWidget::move
> // can cause a reentrant call here.
> if (moving)
> return;
>
> moving = true;
> ... call QWidget::move ....
> moving = false;
> }
>
>
> But in Qt 5 the Move event is put on the queue and delivered
> asynchronously. So now I have this sort of code:
>
> class myclass
> {
> ...
>
> private:
> bool moving;
> QWidget * movedWidget;
> };
>
> bool myclass::eventFilter(QObject * target, QEvent *event)
> {
> somewidget = qobject_cast<QWidget *>(target);
>
> case QEvent::move:
> // in Qt 5, the call to QWidget::move doesn't cause a
> reentrant call here, it triggers
> // another move event later on. So we have to store away
> info on this call to QWidget::move,
> // and detect that move event later on when it looks like
> other move events.
> if (moving && somewidget == movedWidget)
> {
> moving = false;
> movedWidget = NULL; // not at C++11
> yet!
> return false;
> }
>
> moving = true;
> movedWidget = somewidget;
> somewidget->move();
> return <whatever>;
> }
>
> I put in a check on the widget that was moved out of paranoia that some
> other move event could sneek in while I was waiting. In our case, we have
> the same filter on multiple widgets.
>
> Warning: I could have made some typo in the process of abstracting the
> method from much more complex code...
>
> -John Weeks
>
> On Oct 31, 2014, at 7:35 AM, Yili Pan <pyl0420 at gmail.com> wrote:
>
> > Hi Bo:
> >
> > Thank you for the reply!
> >
> > I do not want to filter out all the WindowActivate or FocusIn event
> tough, only these are triggered by calling QWidget::show(). But because the
> events are processed asynchronously in Qt5, when I catch them in the
> eventfilter, I don't know whether they are originated from calling show()
> or they are spontaneous event caused by manual interaction. I also tried to
> filter out the event by telling whether they are spontaneous, but
> unfortunately no matter where they originate from, they are spontaneous
> (could this be a bug??). Any thoughts or suggestion :)
> >
> > Thank you!
> >
> > -Yili
> >
> > On Fri, Oct 31, 2014 at 4:01 AM, Bo Thorsen <bo at vikingsoft.eu> wrote:
> > Den 30-10-2014 20:30, Yili Pan skrev:
> > > Hi:
> > >
> > > We want to block the widget's WindowActivate and FocusIn event
> > > triggered by calling its show() function, with Qt4, we used to do
> > > that by setting flag before and after show() and filter out the event
> > > in eventfilter based on the flag. But with Qt5, the events are
> > > processed asynchronously, we cannot block the event in the same way
> > > anymore.
> > >
> > > Any ideas how I can identify those events that are caused by calling
> > > QWdiget::show() and filter them out?
> >
> > You can use an event filter for this. Take a look at the documentation
> > for QObject::installEventFilter, it should be simple to follow.
> >
> > Bo.
> >
> > --
> > Viking Software
> > Qt and C++ developers for hire
> > http://www.vikingsoft.eu
> >
> > _______________________________________________
> > Interest mailing list
> > Interest at qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/interest
> >
> > _______________________________________________
> > Interest mailing list
> > Interest at qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/interest
>
> -John
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20141101/c2c72622/attachment.html>
More information about the Interest
mailing list