鼠标事件包括移动,鼠标按下,释放(松开),单击,双击.......
要自定义鼠标事件,需重写虚函数:
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())+")");
}
main.cpp
#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();
}
运行结果图:
当用户用鼠标在指定区域内触发相应的鼠标事件,窗口的状态栏将会实时显示鼠标的动态信息。如点击鼠标左键,移动鼠标将会在状态栏实时显示鼠标的坐标~~