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. Can't see rubberband
Forum Updated to NodeBB v4.3 + New Features

Can't see rubberband

Scheduled Pinned Locked Moved General and Desktop
1 Posts 1 Posters 722 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.
  • I Offline
    I Offline
    i92guboj
    wrote on last edited by
    #1

    Hello.

    I've successfully managed to get working rectangle-zooming in a QLabel, more of less the way I want.

    I've done this via eventFilter() in my main class, and installing the usual event filter for the QLabel so that the main class will be managing this. It makes sense since the images are used in many places and needed to be global anyway.

    Now I am trying to make this more visually appealing, by drawing a rubber band over the selection, so the user knows what to expect when s/he releases the mouse button.

    The examples I've found work via mousePressEvent(), mouseMoveEvent() and mouseReleaseEvent(). I am trying to adapt that to work in the eventFilter(), since it's there that I am doing all the work. So I ended up with this:

    @
    bool kooker::eventFilter(QObject *object, QEvent *event)
    {
    if(object == ui->gv_foto_medio)
    {
    if(event->type() == QEvent::MouseButtonPress)
    {
    QMouseEvent me = static_cast<QMouseEvent>(event);
    pos_global = me->pos();
    return true;
    }
    else if(event->type() == QEvent::MouseButtonRelease)
    {
    QMouseEvent me = static_cast<QMouseEvent>(event);
    QPoint pos = me->pos();
    if(pos == pos_global)
    {
    re_zoom_foto_media();
    return true;
    }
    qDebug() << Q_FUNC_INFO << QString("Mouse was pressed at %1,%2 and released at %3,%4").arg(pos_global.x()).arg(pos_global.y()).arg(pos.x()).arg(pos.y());
    double posx, posy;
    if(pos_global.x() < pos.x())
    {
    posx = pos_global.x();
    }
    else
    {
    posx = pos.x();
    }

            if(pos_global.y() < pos.y())
            {
                posy = pos_global.y();
            }
            else
            {
                posy = pos.y();
            }
    
            raton_sobre_foto_mediana(posx, posy);
            return true;
        }
    }
    else if(object == ui->gv_plano_medio)
    {
        if(event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *me = static_cast<QMouseEvent*>(event);
            pos_global = me->pos();
    
            if (rubberBand == NULL)
            {
                rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
            }
            rubberBand->setGeometry(QRect(pos_global, QSize()));
            rubberBand->show();
    
            return true;
        }
        else if(event->type() == QEvent::MouseButtonRelease)
        {
            QMouseEvent *me = static_cast<QMouseEvent*>(event);
            QPoint pos = me->pos();
            if(pos == pos_global)
            {
                re_zoom_plano_medio();
                return true;
            }
            qDebug() << Q_FUNC_INFO << QString("Mouse was pressed at %1,%2 and released at %3,%4").arg(pos_global.x()).arg(pos_global.y()).arg(pos.x()).arg(pos.y());
            double posx, posy;
            if(pos_global.x() < pos.x())
            {
                posx = pos_global.x();
            }
            else
            {
                posx = pos.x();
            }
    
            if(pos_global.y() < pos.y())
            {
                posy = pos_global.y();
            }
            else
            {
                posy = pos.y();
            }
    
            raton_sobre_plano_mediano(posx, posy);
            rubberBand->hide();
            return true;
        }
    }
    else if(event->type() == QEvent::MouseMove)
    {
        QMouseEvent *me = static_cast<QMouseEvent*>(event);
        QPoint pos = me->pos();
        rubberBand->setGeometry(QRect(pos_global, pos).normalized());
        rubberBand->show();
        return true;
    }
    
    return QObject::eventFilter(object, event);
    

    }
    @

    As said, the zooming works ok. However, I see no rubberband at all. I've tried to set the rectangle to something like (10,10,80,80) in the mouseMoveEvent part, just to make sure there wasn't any funkiness going on with the coordinates, but no difference...

    I also tried to do as in the examples, and use those methods I mentioned above in my QLabel derivative. But it didn't work either (I really didn't expect it to, since it's the main class who's filtering the events anyway).

    I've been some days tinkering with this, but I haven't ever seen a rubberband, outside my KDE install :P

    Thanks for reading and for any tip you can share :)

    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