qt 按下鼠标左键并拖动鼠标,按钮随着鼠标的光标移动,同时在状态栏显示鼠标以用户区坐标系表示的位置坐标;
时间: 2024-05-05 14:22:16 浏览: 194
可以通过重载 QWidget 的 mousePressEvent、mouseMoveEvent、mouseReleaseEvent 三个事件来实现。
具体代码如下:
```cpp
void MyButton::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_dragging = true;
m_dragStartPos = event->pos();
}
}
void MyButton::mouseMoveEvent(QMouseEvent *event)
{
if (m_dragging) {
auto currentPos = event->pos();
auto diff = currentPos - m_dragStartPos;
move(pos() + diff);
m_dragStartPos = currentPos;
// 将鼠标位置转换为用户区坐标系表示的位置坐标,并在状态栏显示
auto pos = mapToParent(event->pos());
QString text = QString("X: %1, Y: %2").arg(pos.x()).arg(pos.y());
QStatusBar *statusBar = qApp->activeWindow()->statusBar();
statusBar->showMessage(text);
}
}
void MyButton::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_dragging = false;
}
}
```
其中,m_dragging 用于标记是否正在拖动,m_dragStartPos 记录了拖动开始时的鼠标位置。在 mousePressEvent 中设置 m_dragging 为 true,并记录 m_dragStartPos。在 mouseMoveEvent 中,如果正在拖动,就计算当前鼠标位置和 m_dragStartPos 的差值,将按钮移动相应的距离,并更新 m_dragStartPos。同时,将鼠标位置转换为用户区坐标系表示的位置坐标,并在状态栏显示。在 mouseReleaseEvent 中,设置 m_dragging 为 false。
阅读全文