头文件#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(); }