c++ - 如何获取子小部件的全局几何图形
问题描述
我在自定义框架内有标签。我尝试在鼠标事件上移动 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;
}
}
解决方案
不确定我是否完全理解这个问题,但是可以从该小部件的成员函数中找到小部件左上角的全局坐标 - 使用...
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);
}
}
推荐阅读
- pandas - 熊猫将值从一列复制到另一列,如果一个存在而另一个是 NaN/Null
- javascript - 反应:未捕获的类型错误:无法读取 mapStateToProps 中未定义的属性“名称”
- c# - 如何解决此“未指定身份验证方案,并且未找到 DefaultChallengeScheme”
- python - 无法在带有 Errno 97 的 AWS lambda 上使用 wget.download 下载文件
- mysql - 如何避免在这个 sql 中使用 mysql 函数?
- typescript - 如何避免`后续的属性声明必须具有与接口相同的类型`
- laravel - 使用 Livewire 和 Filepond 编辑模型时处理预先存在的图像
- c++ - 为什么括号中的 AND 与没有的评估不同?
- jquery - jQuery 选择器,只要它没有特定的类,就可以按类及其子元素对元素的点击进行定位
- c++ - 如何通过带有 WinHTTP (C++) 的代理发送带有标头和 json 数据的 HTTP 发布请求