今天要探讨一个非常非常蛋疼的问题,就是关于QMainWindow令人头疼的鼠标事件,如果从解决问题的角度来说,今天要探讨的是QMainWindow的对MouseMove监视的解决方案。
问题:在QMainWindow使用鼠标移动监测事件时,还是需要按键后移动才能实时监控鼠标当前坐标,而不能直接监视移动的鼠标,换句话说就是移动鼠标,程序并没有进入MouseMoveEvent中!
具体情况:设置两个标签,实时监控移动中的鼠标位置坐标
void Similary::mouseMoveEvent(QMouseEvent* e)
{
QString str1 = QString::number(e->x());
QString str2 = QString::number(e->y());
imgLab1->setText(str1);
imgLab2->setText(str2);
}
结果:鼠标要点击后按住按键不放并且移动才能显示实时位置坐标。就算是setmousetracking(1),亲测也是不管用的。
经过找寻答案,我发现了又是因为QMainWindow的独特之处!如果使用UI(QT设计师)添加控件,那么在QMainWindow窗体上会自动添加一个centralWidget层,而我们使用的是QMAinWindow的鼠标移动监测事件,centralWidget将QMainWindow遮挡住了,所以鼠标移动也无法进入mouseMoveEvent。那你会说,好吧,那我就用代码就好了,不用UI设计!我们上回说道,如果QMainWindow要添加布局管理器,是避免不了使用centralWidget层的,那么,难道要想使用鼠标事件就不能使用布局管理器了么?
解决办法:
1.重写控件的鼠标事件!这个方法的话,如果窗体上很多控件,那得写死去,所以我放弃了这种方法。
2.使用事件过滤器EventFilter,该方法简单可行。我们可以改用这种方法,不但可以监视鼠标移动,也可以监测鼠标的其他时间。
步骤:1>给要监视的窗体、控件安装事件过滤器;
2>为了监视鼠标移动事件,开启鼠标追踪,即setMouseTracking(1);
3>给窗体添加eventFilter成员函数
4>重写eventFilter
程序举例:
project.cpp
构造函数中:
//安装事件过滤器
imgLab1->installEventFilter(this);
imgLab2->installEventFilter(this);
btn1->installEventFilter(this);
btn2->installEventFilter(this);
//开启鼠标移动跟踪
imgLab1->setMouseTracking(true);
imgLab2->setMouseTracking(true);
btn1->setMouseTracking(true);
btn1->setMouseTracking(true);
centralWidget()->setMouseTracking(true);
this->setMouseTracking(true);
project.h
类定义中:
protected:
bool eventFilter(QObject *,QEvent *);//事件过滤器
project.cpp
成员函数定义:
bool SimilarProject::eventFilter(QObject* o, QEvent* e)
{
if((o == btn1) && (e->type() == QEvent::MouseButtonPress))
{
}
else if((o == btn2) && (e->type() == QEvent::MouseButtonPress))
{
}
else if((o == imgLab1) && (e->type() == QEvent::MouseButtonPress))
{
}
else if((o == imgLab1) && (e->type() == QEvent::MouseMove))
{
}
else if ((o == imgLab1) && (e->type() == QEvent::MouseButtonRelease))
{
}
return false;
}
注:如果返回true则表示不过滤该事件,返回false则可持续过滤事件
相关推荐
在实际开发中,开发者需要对Qt的QDockWidget、QMainWindow和QLayout等类有深入理解,以便充分利用高级停靠系统的功能。同时,利用Qt Designer可以可视化地设计界面布局,然后通过UI文件生成代码,简化开发流程。 六...
1. **Core模块**:它是Qt的基础,提供数据类型、内存管理、线程支持、事件处理和日志记录等功能。例如,QObject类是所有Qt对象的基类,提供了信号与槽机制,这是Qt异步通信的关键。 2. **Gui模块**:提供图形用户...
在Qt中,MainWindow是一个继承自QMainWindow的类,提供了菜单栏、工具栏、状态栏等基础元素,开发者可以在这个基础上添加自定义的控件和功能。 【qt音乐播放器】部分,核心是利用Qt的多媒体模块(QMediaPlayer和...
该项目的核心是利用QMainWindow类进行构建,QMainWindow是Qt中的一个核心组件,用于创建带有菜单栏、工具栏和状态栏的复杂窗口应用程序。 在Windows平台上,Qt-Nice-Frameless-Window实现了Aero Snap功能。Aero ...
在Qt框架下,鼠标事件是窗口系统与用户交互的关键部分,允许用户通过鼠标进行各种操作。本实例将深入探讨在Linux环境下如何利用Qt来处理鼠标事件,并实现编译成功的项目。 首先,Qt提供了多种鼠标事件类,如`...
4. **性能优化**: 利用Qt的事件过滤、事件派发机制和绘图优化技术提升应用性能。 5. **部署**: Qt提供了qmake和jom等工具,简化了跨平台的编译和部署流程。 6. **设计原则**: 遵循Qt的设计原则,如KISS(Keep It ...
Python-qt项目可能使用QMainWindow创建了主窗口,并添加了自定义布局和控件。 3. **布局管理(Layout Management)**:Qt提供网格布局(QGridLayout)、垂直布局(QVBoxLayout)、水平布局(QHBoxLayout)等多种...
它通过继承和扩展Qt的QDockWidget、QMainWindow等类,提供了一些额外的API,如QDockDivider、QDockContainer等,来支持更丰富的停靠操作。 1. **QDockDivider**:这是一个用于在停靠区域内划分空间的组件,用户可以...
在本文中,我们将深入探讨如何在ROS(Robot Operating System)环境中结合Qt框架,利用Qt Designer设计界面,并通过form class实现在不同窗口之间的跳转。Qt Designer是一个强大的工具,用于创建图形用户界面(GUI)...
**Qt-窗口分割** Qt是一个强大的跨平台应用程序开发框架,由Qt公司开发,它支持Windows、Linux、macOS、Android和iOS等多个操作系统。Qt库提供了丰富的API,使得开发者能够创建具有高级用户界面的桌面和移动应用...
6. **应用程序开发**: 使用QT 4.1.4,开发者可以利用丰富的类库(如QWidget, QMainWindow, QPushButton等)构建GUI应用。同时,QT提供网络、数据库、多媒体、OpenGL等多个模块,支持多种功能的实现。 7. **版本更新...
总结起来,"QT-数字软键盘代码程序"是一个利用Qt库构建的数字输入工具,涉及到的知识点包括Qt框架的基本概念、信号与槽机制、布局管理、部件操作、事件处理、用户界面设计以及状态管理。通过这个项目,开发者不仅...
总的来说,"qt-pic-30.tar"提供的资源对于想要入门QT编程的人来说是一份宝贵的资料。通过学习和实践,开发者不仅可以创建功能丰富的应用程序,还可以利用QT的跨平台特性,将这些应用程序部署到不同的操作系统上。
本教程将详细讲解如何利用Qt库中的信号和槽机制,以及鼠标事件来实现这一功能。 首先,我们需要了解Qt中的基本窗口类`QWidget`或其子类如`QMainWindow`。`QWidget`是所有Qt GUI组件的基础,它提供了显示和用户交互...
QApplication类是整个应用程序的入口点,负责初始化Qt库并处理事件循环。QWidget是所有可视组件的基础,包括窗口、按钮等。QLayout则用于管理控件的排列和尺寸,确保在不同屏幕尺寸下界面仍能保持良好的布局。 在这...
Qt材料 这是PySide6 , PySide2和PyQt5的另一个样式表,看起来像Material Design(足够接近)。 有一些自定义的深色主题: 和光: 导航 安装 pip install qt - material 用法 import sys from PySide6 import Qt...
4. **第4章 QMainWindow**:QMainWindow是QT框架中的一个关键组件,用于构建复杂的多窗口应用。学习者将了解如何使用菜单栏、工具栏、状态栏以及如何添加和管理子窗口。 5. **第5章 图形与图画**:这部分教学如何...
在构建登录界面时,我们通常会使用QMainWindow作为主窗口,它是QT中的一个基类,可以承载各种子部件。在这个例子中,"nGui"可能就是我们自定义的主窗口类。在主窗口中,我们可以添加两个QLineEdit,分别用于输入...
5. **事件处理**:QT的信号和槽机制是其事件驱动编程的核心。在mediaplayer中,当用户点击播放、暂停、停止等按钮时,相应的槽函数会被触发执行对应的操作。 6. **多媒体格式支持**:QT多媒体模块通过后台的...