Alrott SlimRG
Alrott SlimRG

Reputation: 141

How to get global geometry of child widget

I have label inside custom frame. I try to movement of MainWindow (all aplication) on mouse event:

void settingslogolabel::mouseMoveEvent(QMouseEvent *ev)
{
    if ((ev->buttons() & Qt::LeftButton) && firstCIsNotNull){
             window()->move( mapToGlobal(ev->pos() - m_dragPosition - this->geometry().topLeft()));
    }
}

BUT! this->geometry() returns local geometry.
So, how can I get global geometry of child?


What I try to make: When you press mouse and move - all application should move as your cursor move, until you up mouse button. I want to make this interactive for label.

Full code:
HPP:

#ifndef SETTINGSLOGOLABEL_H
#define SETTINGSLOGOLABEL_H

#include <QLabel>
#include <QWidget>
#include <QMouseEvent>

class settingslogolabel : public QLabel
{
    Q_OBJECT
public:
    explicit settingslogolabel(QWidget *parent = 0);

    void mouseMoveEvent(QMouseEvent *ev);
    void mousePressEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

private:
    QPoint m_dragPosition;
    bool firstCIsNotNull = true;
private:
};

#endif // SETTINGSLOGOLABEL_H

CPP:

#include "settingslogolabel.hpp"

settingslogolabel::settingslogolabel(QWidget *parent) :
    QLabel(parent)
{
}

void settingslogolabel::mouseMoveEvent(QMouseEvent *ev)
{
    if ((ev->buttons() & Qt::LeftButton) && firstCIsNotNull){
             window()->move( mapToGlobal(ev->pos() - m_dragPosition - this->geometry().topLeft()));
    }
}

void settingslogolabel::mousePressEvent(QMouseEvent *ev)
{
    if (ev->button() == Qt::LeftButton) {
            m_dragPosition = ev->pos();
            firstCIsNotNull = true;
    }
}

void settingslogolabel::mouseReleaseEvent(QMouseEvent *ev)
{
    if (ev->button() == Qt::LeftButton) {
            firstCIsNotNull = false;
    }
}

Upvotes: 1

Views: 1032

Answers (1)

G.M.
G.M.

Reputation: 12879

Not sure I fully understand the problem but, the global coordinates of the top left corner of a widget can be found -- from within that widget's member functions -- using...

mapToGlobal(QPoint(0, 0));

Similarly, the global geometry would be...

rect().translated(mapToGlobal(QPoint(0, 0)));

Edit: If the aim is to allow dragging of the top level window then your mouseMoveEvent implementation should be something like (untested)...

void settingslogolabel::mouseMoveEvent (QMouseEvent *ev)
{
    if ((ev->buttons() & Qt::LeftButton) && firstCIsNotNull) {
        auto delta = ev->pos() - m_dragPosition;
        window()->move(window()->pos() + delta);
    }
}

Upvotes: 4

Related Questions