Qt 鼠标事件 与 键盘事件

鼠标事件

鼠标常用的事件可以说有一下几种:鼠标按下、鼠标移动、鼠标移动、鼠标双击和鼠标滚轮事件。

当你想使用他们,需要包含头文件:#include

并重写一下方法:

protected:
	void mousePressEvent(QMouseEvent *event) override;			// 鼠标按下事件
	void mouseMoveEvent(QMouseEvent *event) override;			// 鼠标移动事件
	void mouseReleaseEvent(QMouseEvent *event) override;		// 鼠标释放事件
	void mouseDoubleClickEvent(QMouseEvent *event) override;	// 鼠标双击事件
	void wheelEvent(QWheelEvent *event) override;				// 鼠标滚轮事件

下面将一一分解。

鼠标按下事件

void mousePressEvent(QMouseEvent *event) override;

void MouseEvent::mousePressEvent(QMouseEvent *event) {
	
	// 鼠标左键按下
	if (event->button() == Qt::LeftButton) {
	
	// 鼠标中键按下
	} else if (event->button() == Qt::MidButton) {
	
	// 鼠标右键按下
	} else if (event->button() == Qt::RightButton) {

	}
}

当系统监测到有鼠标按下时,便会促发该函数。
当然,可以使用参数event进行判断到底是那个鼠标键按下!

鼠标左键:Qt::LeftButton
鼠标中键:Qt::MidButton
鼠标右键:Qt::RightButton

更多可以参考qt帮助文档!
Qt 鼠标事件 与 键盘事件_第1张图片

鼠标移动事件

void mouseMoveEvent(QMouseEvent *event) override;

void MouseEvent::mouseMoveEvent(QMouseEvent *event) {

}

顾名思义,鼠标在窗体上移动时促发。但是,为了节省耗能,需要鼠标按下后才会促发此函数
如果我们有需求,不需要按下鼠标键就可以促发鼠标移动事件,我看网上说:在Widget中可以在构造函数中加上这句:this->setMouseTracking(true);
这样就可以完美解决这样的问题,具体是不是这样,我没有亲自去尝试!

当然此种方式在MainWindow中就不管用了,网上说:要先把QMainWindow的CentrolWidget使用setMouseTracking(true)开启移动监视。然后在把QMainWindow的setMouseTracking(true)开启监视。

ui.centralWidget->setMouseTracking(true);
this->setMouseTracking(true);	

不过,我试过了,在我这里不管用,不知道是怎么回事(继承父类MainWindow)。也查过了许多博客,介绍都是说添加上面那两行代码即可解决。所以很无奈,如果哪位朋友知道怎么解决的请评论区告诉我,谢谢!!!

当然也是可以通过参数event判断是哪个鼠标按键按下。

鼠标释放事件

void mouseReleaseEvent(QMouseEvent *event) override;

void MouseEvent::mousePressEvent(QMouseEvent *event) {

}

当鼠标按下松开时,便会触发此函数。
左键松开、右键松开、中间松开都会触发。

当然也是可以通过参数event判断是哪个鼠标按键按下。

鼠标双击事件

void mouseDoubleClickEvent(QMouseEvent *event) override;

void MouseEvent::mouseDoubleClickEvent(QMouseEvent *event) {

}

当鼠标双击时,便会触发此函数。
左键双击、右键双击、中间双击都会触发。

当然也是可以通过参数event判断是哪个鼠标按键按下。

鼠标滚轮事件

void wheelEvent(QWheelEvent *event) override;

void MouseEvent::wheelEvent(QWheelEvent *event) {

}

几个鼠标事件常用函数

  1. Qt::MouseButton button() const
    event->button() :返回引起事件的按钮

  2. QPoint QMouseEvent::globalPos() const
    event->globalPos() :返回鼠标光标在事件发生时的全局位置。
    注意:他的(0, 0)坐标是电脑窗体的左上角,获取的坐标是基于整个电脑窗体的。

  3. QPoint pos() const
    event->pos() :返回鼠标光标相对于接收事件的小部件的位置。
    也即是说,他的(0, 0)坐标是运行窗体的左上角,获取的坐标是窗体中的坐标。


键盘事件

键盘事件有两个,键盘按下事件与键盘释放事件。

当你想使用他们,需要包含头文件:#include

并重写一下方法:

protected:
	void keyPressEvent(QKeyEvent *event) override;		// 键盘按下事件
	void keyReleaseEvent(QKeyEvent *event) override;	// 键盘释放事件

需要注意的是

  1. 回车键是Qt::Key_Return
  2. 如需按下修饰键,需要使用modifiers()方法进行返回按下的修饰键。
    alt键:Qt::AltModifier ctrl键:Qt::ControlModifier shift键:Qt::ShiftModifier
    还有许许多多的修饰键与按键,可参考qt帮助文档。

下面将一一分解。

键盘按下事件

void keyPressEvent(QKeyEvent *event) override;

void KeyEvent::keyPressEvent(QKeyEvent *event) {
	// 按下修饰键,且按下的键时ctlr
	if (event->modifiers() == Qt::ControlModifier) {	
		if (event->key() == Qt::Key_Left) {	// 左键按下

		} else if (event->key() == Qt::Key_Right) {	// 右键按下

		} else if (event->key() == Qt::Key_Up) {	// 上键按下

		} else if (event->key() == Qt::Key_Down) {	// 下键按下

		}
	} 
}

监听键盘事件,当有键盘键按下时便会触发。
使用key()函数返回当前按下的键,进行判断具体按下了键盘哪个键。
modifiers()返回修饰键。
Qt 鼠标事件 与 键盘事件_第2张图片

键盘释放事件

void keyReleaseEvent(QKeyEvent *event) override;

void KeyEvent::keyReleaseEvent(QKeyEvent *event) {

}

键盘按下松开后便会触发此函数。
键盘按下事件有的功能,键盘释放事件都有!

几个键盘事件常用函数

  1. int QKeyEvent::key() const
    event->key() :返回被按下或释放的键的代码。
    也就是说,按下哪个键,就返回哪个键。

  2. Qt::KeyboardModifiers QKeyEvent::modifiers() const
    event->modifiers() :返回事件发生后立即存在的键盘修饰符标志。
    例如alt键,ctrl键,shift键。

  3. QString QKeyEvent::text() const
    event->text() :返回此键生成的Unicode文本。
    也就是说返回键盘按下的文本。


总结:
鼠标事件与键盘事件都有着丰富的枚举来支持着,他们符合一定的条件便会触发。

你可能感兴趣的:(Qt,qt)