mousedialog.h
#ifndef MOUSEDIALOG_H
#define MOUSEDIALOG_H
#include <QDialog>
#include <QMouseEvent>
namespace Ui {
class MouseDialog;
}
class MouseDialog : public QDialog
{
Q_OBJECT
public:
explicit MouseDialog(QWidget *parent = 0);
~MouseDialog();
private:
//鼠标按下时执行的事件处理函数
void mousePressEvent(QMouseEvent *event);
//鼠标抬起时执行的事件处理函数
void mouseReleaseEvent(QMouseEvent *event);
//鼠标移动时执行的事件处理函数
void mouseMoveEvent(QMouseEvent *event);
private:
Ui::MouseDialog *ui;
bool m_drag;//标记是否可以拖拽
QPoint m_pos;//记录鼠标和label的相对位置
};
#endif // MOUSEDIALOG_H
mousedialog.cpp
#include "mousedialog.h"
#include "ui_mousedialog.h"
MouseDialog::MouseDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MouseDialog)
{
ui->setupUi(this);
m_drag = false;
}
MouseDialog::~MouseDialog()
{
delete ui;
}
//鼠标按下时执行的事件处理函数
void MouseDialog::mousePressEvent(QMouseEvent *event)
{
//是否为鼠标左键按下
if(event->button() == Qt::LeftButton){
//获取label所在矩形区域
QRect rect = ui->label->frameRect();
//坐标值平移,让rect和鼠标坐标系一致
rect.translate(ui->label->pos());
//判断鼠标点击位置是否在rect范围中
if(rect.contains(event->pos())==true){
m_drag = true;//标记可以执行拖拽操作
m_pos = ui->label->pos()-event->pos();//记录lable和鼠标相对位置
}
}
}
//鼠标抬起时执行的事件处理函数
void MouseDialog::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
m_drag = false;
}
}
//鼠标移动时执行的事件处理函数
void MouseDialog::mouseMoveEvent(QMouseEvent *event)
{
if(m_drag == true){
//计算label移动的新位置
QPoint newPos = m_pos + event->pos();
//设置label移动范围:不能超出父窗口
QSize s1 = size();//获取窗口大小
QSize s2 = ui->label->size();//获取label大小
//x:最小值(0)最大值(窗口宽-label宽)
if(newPos.x() < 0){
newPos.setX(0);
}
else if(newPos.x() > s1.width()-s2.width()){
newPos.setX(s1.width()-s2.width());
}
//y:最小值(0)最大值(窗口高-label高)
if(newPos.y() < 0){
newPos.setY(0);
}
else if(newPos.y() > s1.height()-s2.height()){
newPos.setY(s1.height()-s2.height());
}
//移动label到新位置
ui->label->move(newPos);
}
}
main.cpp
#include "mousedialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MouseDialog w;
w.show();
return a.exec();
}