QT中在界面中任何拖动控件位置

在做FaceMotion项目中,由于告诉计算机每一个marker的位置,这样就需要用户在界面中能够灵活拖动label, 然后把label放在marker所在的位置。那么如何能够实现这样的功能呢,下面给出了一种可行的方法。
//Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QLabel>
class Widget : public QWidget
{
      Q_OBJECT
public:
      Widget(QWidget *parent = 0);
protected slots:
      bool eventFilter(QObject *, QEvent *);
private:
     QLabel *label;
};
#endif // WIDGET_H

//Widget.cpp
#include <QEvent>
#include <QLabel>
#include <QMouseEvent>
#include "Widget.h"

Widget::Widget(QWidget *parent):QWidget(parent)
{
     label=new QLabel("hello",this);
     label->installEventFilter(this);
}

bool Widget::eventFilter(QObject *, QEvent *evt)
{
     static QPoint lastPnt;
     static bool isHover = false;
     if(evt->type() == QEvent::MouseButtonPress)
     {
           QMouseEvent* e = static_cast<QMouseEvent*>(evt);
           if(label->rect().contains(e->pos()) && //is the mouse is clicking the key
                 (e->button() == Qt::LeftButton)) //if the mouse click the right key
           {
                 lastPnt = e->pos();
                 isHover = true;
           }
     }
     else if(evt->type() == QEvent::MouseMove && isHover)
     {
           QMouseEvent* e = static_cast<QMouseEvent*>(evt);
           int dx = e->pos().x() - lastPnt.x();
           int dy=e->pos().y()-lastPnt.y();
           label->move(label->x()+dx,label->y()+dy);
     }else if(evt->type() == QEvent::MouseButtonRelease && isHover)
     {
           isHover = false;
     }
     return false;
}

//main.cpp
#include "Widget.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
     QApplication a(argc, argv);
     Widget w;
     w.show();
     return a.exec();
}
运行结果如图1:
QT中在界面中任何拖动控件位置
图一

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值