Qt - 鼠标事件
欢迎转载,请注明出处:https://blog.csdn.net/qq_39453936?spm=1010.2135.3001.5343原文链接: https://blog.csdn.net/qq_39453936/article/details/120720369鼠标相关事件QMouseEvent的详细描述QMouseEvent 相关使用mousePressEventmousePressEven
欢迎转载,请注明出处:https://blog.csdn.net/qq_39453936?spm=1010.2135.3001.5343
原文链接: https://blog.csdn.net/qq_39453936/article/details/120784898
鼠标相关事件
QMouseEvent的详细描述
- 在小部件内按下或释放鼠标按钮或移动鼠标光标时,会发生鼠标事件。
- 只有在按下鼠标按钮时才会发生鼠标移动事件,除非使用QWidget::setMouseTracking()启用了鼠标跟踪。
- 当在小部件内按下鼠标按钮时,Qt自动抓取鼠标;小部件将继续接收鼠标事件,直到释放最后一个鼠标按钮。
注意:Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击、释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理。 - 鼠标事件包含一个特殊的接受标志flag,指示接收者是否需要该事件。如果小部件未处理鼠标事件,则应调用ignore()。鼠标事件沿父窗口小部件链向上传播,直到窗口小部件使用accept()接受鼠标事件,或者事件筛选器使用鼠标事件。
注意:如果将鼠标事件传播到为其设置了Qt::WA_NoMousePropagation的小部件,则该鼠标事件将不会进一步传播到父小部件链的上游。 - 通过调用从QInputEvent继承的modifiers()函数,可以找到键盘键值的状态。
- 函数pos()、x()和y()给出光标相对于接收鼠标事件的小部件的位置。如果由于鼠标事件而移动小部件,请使用globalPos()返回的全局位置来避免抖动。
- QWidget::setEnabled()函数可用于启用或禁用小部件的鼠标和键盘事件。
- 需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:
QWidget::mousePressEvent() QWidget::mouseReleaseEvent() QWidget::mouseDoubleClickEvent() QWidget::mouseMoveEvent()
QMouseEvent 相关使用
QMouseEvent::QMouseEvent(QEvent::Type type, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::MouseEventSource source)
构造鼠标事件对象。
类型参数必须是QEvent::MouseButtonPress、QEvent::MouseButtonRelease、QEvent::MouseButtonDblClick或QEvent::MouseMove。
localPos、windowPos和screenPos点分别指定鼠标光标相对于接收小部件或项目、窗口和屏幕的位置。
导致事件的按钮作为Qt::MouseButton枚举中的值提供。如果事件类型为MouseMove,则此事件的相应按钮为Qt::NoButton。按钮是事件发生时所有按钮的状态,修饰符是所有键盘修饰符的状态。
事件的源由源指定。
-
Qt::MouseButton QMouseEvent::button() const
返回导致事件的按钮。
请注意,对于鼠标移动事件,返回的值始终为Qt::NoButton。 -
Qt::MouseButtons QMouseEvent::buttons() const
返回生成事件时的按钮状态。按钮状态是使用OR运算符的Qt::LeftButton、Qt::RightButton、Qt::MidButton的组合。对于鼠标移动事件,这是所有按下的按钮。对于鼠标按下和双击事件,这包括导致事件的按钮。对于鼠标释放事件,这不包括导致事件的按钮。
鼠标按下事件mousePressEvent
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)
可以在子类中重新实现该事件处理程序,以接收小部件的鼠标按下事件。示例:
void Widget::mousePressEvent(QMouseEvent *event)
{
//如果鼠标左键按下
if (event->button() == Qt::LeftButton) {
//获取鼠标在事件接收者中的位置pos
lastPoint = event->pos();
}
// 如果是鼠标右键按下
else if(event->button() == Qt::RightButton)
{
//···
}
}
鼠标移动事件mouseMoveEvent
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)
可以在子类中重新实现这个事件处理程序,以接收小部件的鼠标移动事件。如果关闭鼠标跟踪,则只有在移动鼠标时按下鼠标按钮,才会发生鼠标移动事件。如果打开鼠标跟踪setMouseTracking(true); ,即使未按下鼠标按钮,也会发生鼠标移动事件。
每当您移动小部件以响应鼠标事件时,globalPos()可能与当前指针位置QCursor::pos()和QWidget::mapToGlobal(pos())有很大不同。
示例:
void ScribbleArea::mouseMoveEvent(QMouseEvent *event)
{
// 这里必须使用buttons()
if ((event->buttons() & Qt::LeftButton) && scribbling)
{
//···
}
}
鼠标释放事件mouseReleaseEvent
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)
可以在子类中重新实现这个事件处理程序,以接收小部件的鼠标释放事件。
示例:
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
lastPoint = event->pos();
}
}
QWheelEvent
鼠标滚轮事件
void Widget::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)// 当滚轮远离使用者时
{
···
}
else//当滚轮向使用者方向旋转时
{
···
}
}
鼠标移入移出事件
-
[virtual protected] void QWidget::enterEvent(QEvent *event)
-
[virtual protected] void QWidget::leaveEvent(QEvent *event)
此事件处理程序可以在子类中重新实现,以接收在事件参数中传递的小部件进入或离开事件。示例:
void Widget::enterEvent(QEvent *)
{
qDebug()<<"鼠标移入";
}
void Widget::leaveEvent(QEvent *)
{
qDebug()<<"鼠标移出";
}
参考文章:https://blog.csdn.net/liyuanbhu/article/details/53710249
小白发文,欢迎指正
更多推荐
所有评论(0)