今天要探讨一个非常非常蛋疼的问题,就是关于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-Nice-Frameless-Window:适用于Windows和OS X的Qt无框架窗口,支持Aero Snap,在Windows上具有阴影,并支持本机样式,例如圆角,在OS X上具有阴影。基于QMainWindow
Qt材料 这是PySide6 , PySide2和PyQt5的另一个样式表,看起来像Material Design(足够接近)。 有一些自定义的深色主题: 和光: 导航 安装 pip install qt - material 用法 import sys from PySide6 import Qt...
采用qt跨平台图形开发工具,窗口可任意分割,随意缩放。
1、首先,先创建一个新文件,并在里面添加新的Qt设计界面 可以得到如图,mainwindow是主界面,widget是我新添加的子界面 2、注意将子界面的.h文件添加主界面的.h中 3、在主界面的.h中,添加子界面的变量及...
qt-qml-demo-playground 有很多有趣的QML演示,这些演示并没有为Qt的高质量标准带来好处。... qmlofficedemo-.ui文件,QMainWindow和QtQuick的Qt4混搭qml-presentation-一个旧的(Qt4)qml演示框架,大多数用户
pythonqt5教程从零开始_pyQt5QtDesigner简易⼊门教程 python3.6 & pyQt5 & QtDesigner 简易⼊门教程 1.... import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.uic import loadUi
Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件。 让我们试着设想已经有了一个CustomerInfoDialog的小部件。CustomerInfoDialog 包含一系列QLineEdit. 现在,我们想用空格键...
菜单栏、工具栏、状态栏、锚接组件、中心部件的创建及使用 博客地址:https://blog.csdn.net/qq_36926037/article/details/123663392
博文《基于QMainWindow的主窗口程序例子》的代码和资源文件
QMainWindow通过setWindowFlags(Qt::FramelessWindowHint)该函数隐藏掉标题栏以后,就不能通过窗口四周来拖动大小了,所以必须要重写,重写两种方法:第一种重写是:mouseMoveEvent,该方法要设置以下两点(1)...
Qt基础 10_MainWindow 源代码
mdiArea里显示多窗体,网上查到的大部分是doc版的,我这还有mainwin 和dialog
1.实现了qmainwindow的无边框化 2.按住鼠标可以随意拖动界面,而且能超出屏幕的 3.鼠标移到界面边界时会出现相应的光标提示,可拉伸
QmainWindow主窗体
第4章:QMainWindow; 第5章:图形与图画; 第6章:Graphics View; 第7章:Model/View; 第8章:网络与通信; 第9章:磁盘文件; 第10章:事件; 第11章:其它。 (2)开源工具软件包(由于文件包...
: QMainWindow(parent, flags) { ui.setupUi(this); initialization(); validateUserLogin(); } AccessControlSystem::~AccessControlSystem() { } /*------------------------------------------- * * 初始...
主要内容有常用GUI介绍、Qt开发工具的安装及其优点、Qt入门、窗口的布局、信号和槽机制、常见对话框的使用、主窗口(QMainWindow类)的使用、菜单和工具条的实现、鼠标和键盘事件、Qt进程与线程、网络编程、互斥锁等...
QT软件学习记录
linux 下的基于QMainWindow主程序窗口,实验课上的任务及完成情况的,希望有所帮助。
利用Qt实现的考试系统