event->globalPos() - frameGeometry().topLeft()
时间: 2024-05-19 13:16:35 浏览: 117
这是一个Qt中计算鼠标点击位置相对于窗口左上角的坐标的语句。其中,event是一个鼠标事件,globalPos()返回的是鼠标点击的全局坐标,frameGeometry()返回的是窗口的位置和大小信息,topLeft()返回的是窗口左上角的坐标。这条语句用于将鼠标点击位置的全局坐标转换为相对于窗口左上角的坐标,以便于后续的操作。
相关问题
qt移动窗口
在 Qt 中,可以通过重写 QWidget 的 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent 函数来实现移动窗口的功能。
首先,在 QWidget 的子类中重写 mousePressEvent 函数,记录当前鼠标位置和窗口位置的差值:
```cpp
void MyWidget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}
```
然后,在重写 mouseMoveEvent 函数时,判断鼠标左键是否按下,如果按下,则计算窗口新的位置,并将窗口移动到新位置:
```cpp
void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
move(event->globalPos() - m_dragPosition);
event->accept();
}
}
```
最后,在重写 mouseReleaseEvent 函数时,清空记录的鼠标位置和窗口位置的差值:
```cpp
void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
m_dragPosition = QPoint();
event->accept();
}
```
完整的代码如下:
```cpp
#include <QWidget>
#include <QMouseEvent>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}
protected:
void mousePressEvent(QMouseEvent *event) override
{
if(event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
if(event->buttons() & Qt::LeftButton)
{
move(event->globalPos() - m_dragPosition);
event->accept();
}
}
void mouseReleaseEvent(QMouseEvent *event) override
{
m_dragPosition = QPoint();
event->accept();
}
private:
QPoint m_dragPosition;
};
```
将上述代码应用到你的窗口中,就可以实现移动窗口的功能了。
QT笔记之自定义窗口拖拽移动
好的,我可以为您讲解如何在QT中实现自定义窗口的拖拽移动。
首先,我们需要重写QWidget的mousePressEvent和mouseMoveEvent两个事件函数。
在mousePressEvent中,我们需要记录下鼠标按下时的坐标和窗口左上角的坐标,以便计算窗口移动的偏移量。
在mouseMoveEvent中,我们需要计算鼠标移动的偏移量,并将窗口的位置进行相应的调整。
以下是示例代码:
```cpp
void MyWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
}
}
void MyWindow::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
QPoint newPos = event->globalPos() - m_dragPosition;
move(newPos);
}
}
```
在上面的代码中,m_dragPosition是一个QPoint类型的成员变量,用于记录鼠标按下时的坐标和窗口左上角的坐标的差值。
最后,我们需要在窗口的构造函数中设置窗口的样式为Qt::FramelessWindowHint,以去掉窗口的边框和标题栏。
完整的示例代码如下:
```cpp
#include "mywindow.h"
#include <QMouseEvent>
MyWindow::MyWindow(QWidget *parent)
: QWidget(parent)
{
setFixedSize(400, 300);
setWindowFlags(Qt::FramelessWindowHint);
}
void MyWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
}
}
void MyWindow::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
QPoint newPos = event->globalPos() - m_dragPosition;
move(newPos);
}
}
```
希望这个简单的示例对您有所帮助。