鼠标常用的事件可以说有一下几种:鼠标按下、鼠标移动、鼠标移动、鼠标双击和鼠标滚轮事件。
当你想使用他们,需要包含头文件:#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
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) {
}
Qt::MouseButton button() const
event->button() :返回引起事件的按钮
QPoint QMouseEvent::globalPos() const
event->globalPos() :返回鼠标光标在事件发生时的全局位置。
注意:他的(0, 0)坐标是电脑窗体的左上角,获取的坐标是基于整个电脑窗体的。
QPoint pos() const
event->pos() :返回鼠标光标相对于接收事件的小部件的位置。
也即是说,他的(0, 0)坐标是运行窗体的左上角,获取的坐标是窗体中的坐标。
键盘事件有两个,键盘按下事件与键盘释放事件。
当你想使用他们,需要包含头文件:#include
并重写一下方法:
protected:
void keyPressEvent(QKeyEvent *event) override; // 键盘按下事件
void keyReleaseEvent(QKeyEvent *event) override; // 键盘释放事件
需要注意的是:
Qt::Key_Return
Qt::AltModifier
ctrl键:Qt::ControlModifier
shift键:Qt::ShiftModifier
下面将一一分解。
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()返回修饰键。
void keyReleaseEvent(QKeyEvent *event) override;
void KeyEvent::keyReleaseEvent(QKeyEvent *event) {
}
键盘按下松开后便会触发此函数。
键盘按下事件有的功能,键盘释放事件都有!
int QKeyEvent::key() const
event->key() :返回被按下或释放的键的代码。
也就是说,按下哪个键,就返回哪个键。
Qt::KeyboardModifiers QKeyEvent::modifiers() const
event->modifiers() :返回事件发生后立即存在的键盘修饰符标志。
例如alt键,ctrl键,shift键。
QString QKeyEvent::text() const
event->text() :返回此键生成的Unicode文本。
也就是说返回键盘按下的文本。
总结:
鼠标事件与键盘事件都有着丰富的枚举来支持着,他们符合一定的条件便会触发。