利用QT写一个鼠标事件的例子 鼠标拖动方格子 以及坐标转换
新建一个带ui的项目
1.ui界面
2.添加头文件
#include <QDialog>
#include <QMouseEvent>
3.添加函数及变量声明
private:
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
private:
Ui::MouseDialog *ui;
bool m_bDrag;//判断是否是左键选中
QPoint m_ptPos;//记录鼠标和label相对位置
4.添加.cpp函数
MouseDialog::MouseDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MouseDialog)
{
ui->setupUi(this);
}
MouseDialog::~MouseDialog()
{
delete ui;
}
void MouseDialog::mousePressEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton){
//获取label矩形区域
QRect rcBlock = ui->label->frameRect();
//平移,让rcBlck和窗口坐标系一致
rcBlock.translate(ui->label->pos());
//判断鼠标点击的坐标是否在label区域内
if(rcBlock.contains(event->pos()) == true){
m_bDrag = true;
//计算相对偏移量
m_ptPos = ui->label->pos()-event->pos();
}
}
}
void MouseDialog::mouseReleaseEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton){
m_bDrag = false;
}
}
void MouseDialog::mouseMoveEvent(QMouseEvent *event){
if(m_bDrag){
//计算新坐标
QPoint ptPos = event->pos() + m_ptPos;
//获取窗口大小
QSize szClient = size();
//获取label位置
QRect rcBlock = ui->label->frameRect();
//x坐标范围(0--(窗口x-label宽度))
if(ptPos.x() < 0)
ptPos.setX(0);
else if(ptPos.x() >
szClient.width()-rcBlock.width()){
ptPos.setX(szClient.width()-rcBlock.width());
}
//y坐标范围(0--(窗口y-label高度))
if(ptPos.y() < 0)
ptPos.setY(0);
else if(ptPos.y() >
szClient.height()-rcBlock.height()){
ptPos.setY(szClient.height()-rcBlock.height());
}
//移动到新的位置
ui->label->move(ptPos);
}
}
5.运行