[Interest] Glueing widgets together

Sensei senseiwa at gmail.com
Sat Jun 29 13:12:24 CEST 2013


Thanks Tony, that is quite the same code for me. The only difference is
that my follower isn't a child of the widget that must be followed.

It might be a platform issue as suggested: I'm on a Mac...

On Saturday, June 29, 2013, Tony Rietwyk wrote:

> > Sent: Friday, 28 June 2013 10:48 PM
> >
> > On 6/28/13 10:54 AM, Tony Rietwyk wrote:
> > > Hi Sensei,
> > >
> > > I have a master dialog with a slave dialog attached to one border.
> > > This was done using eventFilter in the slave to listen to the master
> > > Move and Resize events - not MouseMove.  It's only 10 lines of code,
> > > works well and there is no jerkiness.  It put the code in the slave,
> > > since it can be attached to many different dialogs in my app.
> > >
> > > The same code should work for peer dialogs - but you must be careful
> > > to prevent recursion by settings flags in the other dialog before
> > > moving it so it doesn't try to move the first one.  The recursion
> > > could cause the delays and high CPU usage.
> > >
> > > Can you show the code that isn't working?
> >
> > Sure!
> >
> > My code is as follows. It works, in the sense that, as I said, the
> follower
> > moves to the right position. However, I can move the main window and the
> > follower, visibly after a while, pops out where it should be. It's a very
> > annoying visual glitch.
> >
> > I've tried two codes, one with overriding the event, one with a filter.
> >
> > =====================
> > // The follower
> > void SubContainer::followActivated(QMoveEvent *event) {
> >      qWarning(">> MOVE IT!");
> >
> >      // Move the follower where the options_ button is
> >      QPoint local  = options_->pos();
> >      QPoint global = mapToGlobal(local);
> >
> >      global.setX(global.x() + 0*options_->width());
> >      global.setY(global.y() + options_->height());
> >
> >      qWarning("show on (%d, %d) (%d, %d)", local.x(), local.y(),
> global.x(),
> > global.y());
> >
> >      follower_->move(global);
> > }
> >
> >
> >
> > // Move event handler
> > void MainWindow::moveEvent(QMoveEvent *event) {
> >      qWarning("I LIKE TO MOVE IT");
> >      container_->getSubContainer()->followActivated(event);
> > }
> > =====================
> >
> >
> >
> > I've tried also (of course not at the same time as the above code) to
> install an
> > event filter, however, and the results are the same:
> >
> >
> > =====================
> > // Event filtering
> > bool SubContainer::eventFilter(QObject *object, QEvent *event)
> > {
> >      // The target_ variable contains the MainWindow object
> >      if ((object == target_) && (event->type() == QEvent::Move))
> >      {
> >          qWarning("=== filtering object %p / target %p", object,
> target_);
> >          followActivated(NULL);
> >      }
> >      return true;
> > }
> > =====================
> >
> > There's always a delay in moving the MainWindow and the follower moving
> > to its right position.
> >
> > I'm puzzled. How did you succeed in having these two dialogs move
> > simultaneously? Can you post an excerpt?
> >
> > Thanks & Cheers!
>
> Hi Sensei,
>
> My code is just:
>
> bool Slave::eventFilter(QObject *obj, QEvent *ev)
> {
>   if (obj == Master)
>      move( Master->frameGeometry().left() +
> Master->frameGeometry().width(),
> Master->frameGeometry().top() );
>
>   return Ancestor::eventFilter(obj, ev);
> }
>
> Note that I do not return true - since I want the move to be handled by the
> Master as normal.
>
> The Master is the parent of the Slave, and the Slave is created with window
> flag Qt::Tool.
>
> Hope that helps,
>
> Tony.
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org <javascript:;>
> http://lists.qt-project.org/mailman/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130629/662e24fd/attachment.html>


More information about the Interest mailing list