头文件#include < QMousEvent >
// 鼠标按下
QWidget::mousePressEvent(QMouseEvent * event) [virtual];
// 鼠标释放-抬起
QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual];
// 鼠标移动
QWidget::mouseMoveEvent(QMouseEvent * event) [virtual];
// 鼠标双击
QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual];
button (); // 获取当前鼠标按键
if ( event->button () == Qt::LeftButton) {
}
Qt::LeftButton // 左键
Qt::RightButton // 右键
Qt::MidButton // 中键
/* 代码演示 - 使用鼠标拖拽lab组件 */
- // .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* enevt); // 鼠标移动
- private:
- Ui::MouseDialog *ui;
- private:
- bool m_bDrag; // 标记鼠标是否是左键选中lable
- QPoint m_ptPos; // 记录鼠标和label相对位置
- };
- #endif // MOUSEDIALOG_H
// .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* enevt); // 鼠标移动
private:
Ui::MouseDialog *ui;
private:
bool m_bDrag; // 标记鼠标是否是左键选中lable
QPoint m_ptPos; // 记录鼠标和label相对位置
};
#endif // MOUSEDIALOG_H
- // .cpp
- #include "MouseDialog.h"
- #include "ui_MouseDialog.h"
- 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 ();
- // 平移,保证鼠标和矩形区域坐标系一致
- rcBlock.translate (ui->label->pos ());
- // 判断点击的位置是否在rcBlock之内
- if (rcBlock.contains (event->pos ()) == true) {
- m_bDrag = true;
- m_ptPos = ui->label->pos () - event->pos (); // QPoint
- }
- }
- }
- void MouseDialog::mouseReleaseEvent (QMouseEvent* event) {
- // 判断是否是左键抬起
- if (event->button () == Qt::LeftButton) {
- m_bDrag = false;
- }
- }
- void MouseDialog::mouseMoveEvent (QMouseEvent* event) {
- if (m_bDrag) {
- // 计算新的坐标位置
- QPoint ptPos = m_ptPos + event->pos ();
- // 设置label移动的边界区域限制
- // 获取父窗口大小
- QSize szClient = size ();
- // 获取label的矩形区域 == 大小
- // QRect rcBlock = ui->label->frameRect (); 此行无用
- // x:0 (窗口.宽度 - label.宽度)
- if (ptPos.x () < 0) {
- ptPos.setX (0);
- } else
- if (ptPos.x () > szClient.width () - ui->label->width ()) {
- ptPos.setX (szClient.width () - ui->label->width ());
- }
- // y:0 (窗口.高度 - label.高度)
- if (ptPos.y () < 0) {
- ptPos.setY (0);
- } else
- if (ptPos.y () > szClient.height () - ui->label->height ()) {
- ptPos.setY (szClient.height () - ui->label->height ());
- }
- // 移动label到新的位置
- ui->label->move (ptPos);
- }
- }
// .cpp
#include "MouseDialog.h"
#include "ui_MouseDialog.h"
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 ();
// 平移,保证鼠标和矩形区域坐标系一致
rcBlock.translate (ui->label->pos ());
// 判断点击的位置是否在rcBlock之内
if (rcBlock.contains (event->pos ()) == true) {
m_bDrag = true;
m_ptPos = ui->label->pos () - event->pos (); // QPoint
}
}
}
void MouseDialog::mouseReleaseEvent (QMouseEvent* event) {
// 判断是否是左键抬起
if (event->button () == Qt::LeftButton) {
m_bDrag = false;
}
}
void MouseDialog::mouseMoveEvent (QMouseEvent* event) {
if (m_bDrag) {
// 计算新的坐标位置
QPoint ptPos = m_ptPos + event->pos ();
// 设置label移动的边界区域限制
// 获取父窗口大小
QSize szClient = size ();
// 获取label的矩形区域 == 大小
// QRect rcBlock = ui->label->frameRect (); 此行无用
// x:0 (窗口.宽度 - label.宽度)
if (ptPos.x () < 0) {
ptPos.setX (0);
} else
if (ptPos.x () > szClient.width () - ui->label->width ()) {
ptPos.setX (szClient.width () - ui->label->width ());
}
// y:0 (窗口.高度 - label.高度)
if (ptPos.y () < 0) {
ptPos.setY (0);
} else
if (ptPos.y () > szClient.height () - ui->label->height ()) {
ptPos.setY (szClient.height () - ui->label->height ());
}
// 移动label到新的位置
ui->label->move (ptPos);
}
}
- // main.cpp
- #include "MouseDialog.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MouseDialog w;
- w.show();
- return a.exec();
- }
// main.cpp
#include "MouseDialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MouseDialog w;
w.show();
return a.exec();
}