本文转载自:CSDN - 知其所以然
原文链接:http://blog.csdn.net/HK_5788/article/details/42529835
鼠标事件包括移动,鼠标按下,释放(松开),单击,双击.......
要自定义鼠标事件,需重写虚函数:
- void QWidget::mousePressEvent(QMouseEvent * event) [virtual protected]
- void QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual protected]
- void QWidget::mouseMoveEvent(QMouseEvent * event) [virtual protected]
- void QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual protected]
mouse_widget.h
- #ifndef MOUSEWIDGET_H
- #define MOUSEWIDGET_H
- #include <QWidget>
- #include <QMainWindow>
- #include <QLabel>
- #include <QStatusBar>
- #include <QMouseEvent>
- #include <QTextCodec>
- class MouseEvent : public QMainWindow
- {
- Q_OBJECT
- public:
- MouseEvent(QWidget *parent = 0);
- protected:
- void mousePressEvent(QMouseEvent *e); //--鼠标按下事件
- void mouseMoveEvent(QMouseEvent *e); //--鼠标移动事件
- void mouseReleaseEvent(QMouseEvent *e); //--鼠标释放(松开)事件
- void mouseDoubleClickEvent(QMouseEvent *e); //--鼠标双击事件
- private:
- QLabel *statusLabel; //---显示鼠标移动时的实时位置
- QLabel *mousePointLabel; //---显示鼠标位置
- };
- #endif //MOUSEWIDGET_H
mouse_widget.cpp
- #include "mouse_widget.h"
- MouseEvent::MouseEvent(QWidget *parent /*= 0*/) : QMainWindow(parent)
- {
- //----Qt5解决中文乱码
- QTextCodec *codec = QTextCodec::codecForName("GB18030");
- //---显示鼠标移动时的实时位置
- statusLabel = new QLabel();
- statusLabel->setText(codec->toUnicode("当前位置:"));
- statusLabel->setFixedWidth(100);
- //---显示鼠标位置
- mousePointLabel = new QLabel();
- mousePointLabel->setText("");
- mousePointLabel->setFixedWidth(100);
- //---在状态栏增加控件
- statusBar()->addPermanentWidget(statusLabel);
- statusBar()->addPermanentWidget(mousePointLabel);
- //---设置当前窗体对鼠标追踪,默认为false,false表示不追踪
- setMouseTracking(true);
- //----设置窗口属性
- setWindowTitle(codec->toUnicode("鼠标事件信息"));
- //----窗口大小
- resize(400, 150);
- }
- //--鼠标按下事件
- void MouseEvent::mousePressEvent(QMouseEvent *e)
- {
- //----Qt5解决中文乱码
- QTextCodec *codec = QTextCodec::codecForName("GB18030");
- //----QMouseEvent类提供的x()和y()可获取鼠标相对窗口的位置
- QString str = "("+QString :: number(e->x()) +", "+QString::number(e->y())+")";
- //---点击左键
- if (Qt ::LeftButton == e->button())
- {
- statusBar()->showMessage(codec->toUnicode("左键:") + str);
- }
- //---点击左键
- if (Qt ::RightButton == e->button())
- {
- statusBar()->showMessage(codec->toUnicode("右键:") + str);
- }
- //---点击左键
- if (Qt ::MidButton == e->button())
- {
- statusBar()->showMessage(codec->toUnicode("中键:") + str);
- }
- }
- //---鼠标释放(松开)事件
- void MouseEvent::mouseReleaseEvent(QMouseEvent *e)
- {
- //----Qt5解决中文乱码
- QTextCodec *codec = QTextCodec::codecForName("GB18030");
- //----QMouseEvent类提供的x()和y()可获取鼠标相对窗口的位置
- QString str = "("+QString :: number(e->x()) +", "+QString::number(e->y())+")";
- statusBar()->showMessage(codec->toUnicode("鼠标位置:") + str, 3000);
- }
- //--s鼠标双击事件
- void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e)
- {
- //---没有实现功能
- }
- //--鼠标移动事件
- void MouseEvent::mouseMoveEvent(QMouseEvent *e)
- {
- mousePointLabel->setText("("+QString::number(e->x())+", "+QString :: number(e->y())+")");
- }
- #pragma once
- #include <QtWidgets/QApplication>
- #include "mouse_widget.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MouseEvent win;
- win.show();
- return a.exec();
- }
当用户用鼠标在指定区域内触发相应的鼠标事件,窗口的状态栏将会实时显示鼠标的动态信息。如点击鼠标左键,移动鼠标将会在状态栏实时显示鼠标的坐标~~