首页 > 解决方案 > 如何获取子小部件的全局几何图形

问题描述

我在自定义框架内有标签。我尝试在鼠标事件上移动 MainWindow(所有应用程序):

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

但!this->geometry()返回局部几何。
那么,我怎样才能得到孩子的全局几何?


我尝试做的事情:当您按下鼠标并移动时 - 所有应用程序都应该随着您的光标移动而移动,直到您按下鼠标按钮。我想让这个交互式标签。

完整代码:
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

共产党:

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

标签: c++qtqt5c++17

解决方案


不确定我是否完全理解这个问题,但是可以从该小部件的成员函数中找到小部件左上角的全局坐标 - 使用...

mapToGlobal(QPoint(0, 0));

同样,全局几何将是...

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

编辑: 如果目标是允许拖动顶级窗口,那么您的mouseMoveEvent实现应该类似于(未经测试)......

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

推荐阅读