Qt学习之路之鼠标事件

鼠标事件包括移动,鼠标按下,释放(松开),单击,双击.......

自定义鼠标事件,需重写虚函数:

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();
}
运行结果图:


Qt学习之路之鼠标事件_第1张图片


当用户用鼠标在指定区域内触发相应的鼠标事件,窗口的状态栏将会实时显示鼠标的动态信息。如点击鼠标左键,移动鼠标将会在状态栏实时显示鼠标的坐标~~

你可能感兴趣的:(qt,鼠标事件)