在做FaceMotion项目中,由于告诉计算机每一个marker的位置,这样就需要用户在界面中能够灵活拖动label,
然后把label放在marker所在的位置。那么如何能够实现这样的功能呢,下面给出了一种可行的方法。
Q_OBJECT
Widget(QWidget *parent = 0);
bool eventFilter(QObject *, QEvent *);
QLabel *label;
label=new QLabel("hello",this);
label->installEventFilter(this);
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;
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
//Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QLabel>
class Widget : public QWidget
{
public:
protected slots:
private:
};
#endif // WIDGET_H
//Widget.cpp
#include <QEvent>
#include <QLabel>
#include <QMouseEvent>
#include "Widget.h"
Widget::Widget(QWidget *parent):QWidget(parent)
{
}
bool Widget::eventFilter(QObject *, QEvent *evt)
{
}
//main.cpp
#include "Widget.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
}
运行结果如图1:
图一