Qt透明窗口鼠标穿透问题及解决办法

这篇具有很好参考价值的文章主要介绍了Qt透明窗口鼠标穿透问题及解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


问题:

最近写了个项目,需要播放视频并在视频上做标记框去完成一些功能
因为视频播放使用了VLC-qt的库,封装好的窗口控件
没办法直接在该视频窗口上绘图(也许可以?)
出于不想动别人写好的库的想法,想着在视频窗口上加一个透明蒙版-即一个透明窗口,在透明窗口上进行绘图操作

实现:

这个是业务窗口逻辑

void Dialog::on_select_videowindow_clicked()
{
	//获取本窗口中视频窗口的位置,并转换为相对屏幕坐标
    QPoint p = ui->video->mapToGlobal(QPoint(0, 0));
    QSize size = ui->video->size();
	//当没创建新创口界面时,new一个出来
    if(m_screen == NULL)
    {
        m_screen = new Screen(0,p.x(),p.y(),size.width(),size.height());
    }
    else
    {
        //设置回初始状态
        m_screen->init(true);
    }
    m_screen->show();
}

这个是透明蒙版的构造函数

Screen::Screen(QWidget *parent, int x, int y, int w, int h)
    : QWidget(parent),
      m_widthInfoRect(QRectF(0, 0, 0, 0)),
      m_control(NULL)
{
    setWindowFlags(Qt::FramelessWindowHint);//设置无标题栏
    setMouseTracking(true);//捕获鼠标事件

    setAttribute(Qt::WA_QuitOnClose,false);//设置本窗口不关联程序退出
    setAttribute(Qt::WA_TransparentForMouseEvents, false);//设置鼠标不穿透
    setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口透明背景
    setWindowFlag(Qt::WindowStaysOnTopHint);//设置本窗口处在顶层
	//初始化本窗口参数
    init(true);
}

分析:

如上,获取了视频窗口的位置及大小,并将透明窗口覆盖在video窗口上
然后重写了Screen的部分鼠标事件及绘图事件,实现标记功能
但实际操作发现,当鼠标点击透明窗口时无法触发该透明窗口的鼠标事件,即鼠标穿透了,点击到了视频窗口上。
明明已经设置了WA_TransparentForMouseEvents属性为false,但鼠标依然穿透了。
setAttribute(Qt::WA_TransparentForMouseEvents, false)未生效

重新实现:

经过一段时间的研究,将代码修改后
重写paintEvent事件解决了这个问题
如下:

Screen::Screen(QWidget *parent, int x, int y, int w, int h)
    : QWidget(parent),
      m_widthInfoRect(QRectF(0, 0, 0, 0)),
      m_control(NULL)
{
    setWindowFlags(Qt::FramelessWindowHint);//设置无标题栏
    setMouseTracking(true);//捕获鼠标事件
    
    m_pixmap = QPixmap(w,h);
    //全局路径的初始化,一个全屏闭合回路
    m_globalPath.lineTo(m_pixmap.width(), 0);
    m_globalPath.lineTo(m_pixmap.width(), m_pixmap.height());
    m_globalPath.lineTo(0, m_pixmap.height());
    m_globalPath.lineTo(0, 0);

    setAttribute(Qt::WA_QuitOnClose,false);//设置本窗口不关联程序退出
//    setAttribute(Qt::WA_TransparentForMouseEvents, false);//设置鼠标不穿透
    setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口透明背景
    setWindowFlag(Qt::WindowStaysOnTopHint);//设置本窗口处在顶层
	//初始化本窗口参数
    init(true);
}

void Screen::paintEvent(QPaintEvent *e)
{
	//解决鼠标穿透问题
    Q_UNUSED(e);
    QPainter paint(this);
    paint.setPen(Qt::transparent);
    paint.setBrush(QColor(0, 0, 0, 1));
    //关键是这一步  绘制一个全局的路径
    paint.drawPath(m_globalPath);

	//其他绘图事件
}

可以看到透明窗口上再绘制一个透明全屏幕路径后完美的解决了这个问题
发现设不设置Qt::WA_TransparentForMouseEvents这个属性好像没有什么影响,也许默认就是false。

效果如下:
pyqt5 鼠标穿透,qt,qt,人机交互

结论:

猜测:就是因为当前窗口上什么都没有只有一个透明背景导致鼠标穿透了,再窗口上再绘制透明图片(即让窗口上有东西)即可解决这个问题。

但具体底层机制不明,还得深入学习下。
不过就目前来讲,应该够用了。文章来源地址https://www.toymoban.com/news/detail-764294.html

到了这里,关于Qt透明窗口鼠标穿透问题及解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • javaFx实现鼠标穿透画布,同时操作画布和桌面,背景透明,类似ppt批注

    javaFx实现鼠标穿透画布,同时操作画布和桌面,背景透明,类似ppt批注

    目录          一、实现的功能和效果 二、程序实现 三、总结         今天,我们要用javaFx来实现一个鼠标穿透画布的功能,该需求来自于在我们的javaFx桌面应用中,需要实现一个悬浮的桌面侧边工具栏,在工具栏中有画笔绘制,批注的功能,能够实现在任何软件之上做

    2024年02月13日
    浏览(9)
  • Qt中设置鼠标透明度的应用及示例

    Qt是一个功能强大的跨平台应用程序开发框架,可以用于开发各种类型的应用程序。在Qt中,我们可以设置鼠标的透明度,即将鼠标事件传递给下方的控件,而不让鼠标事件被当前控件捕获。这对于一些特定的应用场景非常有用,比如在一些需要显示信息的遮罩层上,我们可以

    2024年02月08日
    浏览(9)
  • 如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口

    如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口

    在Qt框架中,要实现一个无标题栏、半透明、置顶(悬浮)的窗口,需要一些特定的设置和技巧。废话不多说,下面我将以DrawClient软件为例,介绍一下实现这种效果的四个要点。 要点一:移除标题栏(去除关闭、最小化、最大化按钮) 在窗口的构造函数中设置窗口的样式,

    2024年02月19日
    浏览(8)
  • QT 虚拟键盘问题解决,dialog,模态窗口,无感知

    目前各个帖子都没有完美解决QT下模态窗口的键盘无响应问题,此帖已解决此问题。 问题原因:原因主要是模态窗口卡住了虚拟键盘的事件响应,导致两者冲突,出现界面假死现象 目前主要解决方案是设置Dialog为非模态窗口,此法属于绕过虚拟键盘问题,模态窗口的作用就没

    2024年02月09日
    浏览(50)
  • Qt鼠标悬停+悬浮窗口

    Qt鼠标悬停+悬浮窗口

    这两个功能,有很多办法可以实现,这里记一下笔者常用的。 mouseHover.h mouseHover.cpp QRImage.h QRImage.cpp MainWindow.h MainWindow.cpp

    2024年02月06日
    浏览(19)
  • Ubuntu开机桌面黑屏只有鼠标问题解决办法(搜狗输入法导致)

    参考: Ubuntu开机桌面黑屏只有鼠标问题解决办法(搜狗输入法导致) 问题描述 笔者在安装完搜狗输入法重启电脑后,电脑开机黑屏,只有鼠标的光标可以移动。笔者一开始以为是系统问题,网上查阅资料才发现有大量的网友都因为搜狗输入法而导致电脑黑屏,如果读者近期

    2024年02月16日
    浏览(8)
  • Qt 窗口随鼠标移动效果

    实现在窗口任意位置按下鼠标左键都可以移动窗口的效果,完整代码如下: mainwindow.h: mainwindow.cpp:

    2024年02月13日
    浏览(7)
  • Qt获取鼠标移动事件,窗口内任意位置按下鼠标左键拖动窗口

    Qt获取鼠标移动事件,窗口内任意位置按下鼠标左键拖动窗口

    重写窗口的两个事件函数mousePressEvent和mouseMoveEvent即可: 在mousePressEvent 中,按下鼠标左键时,记录窗口坐标,其中窗口坐标的计算是由鼠标事件获取到鼠标在整个屏幕中的坐标(ev-globalpos()),然后再使用pos()获取到鼠标在窗口内的相对位置,两者之差就是窗口在整个屏幕上

    2024年02月12日
    浏览(12)
  • QT 触控事件和鼠标事件的分离(问题已解决)

    问题:QT图形视图框架,QGraphicsScene中默认接收触控事件,会将第一个点当作鼠标事件处理。 在开发者开发的时候,可能会有这样的需求,希望自己的触控事件和鼠标事件能够分割开来。 找到的解决方法: 方案一: 问题没有解决,修改这两个参数,也无法让QT的触控单击事件

    2024年02月16日
    浏览(10)
  • Element plus el-table 鼠标滚动失灵的问题及解决办法

    Element plus el-table 鼠标滚动失灵的问题及解决办法

    Bug:ElementUI el-table 鼠标滚轮下滑动失灵的情况 我测出来的这个问题条件很苛刻,需要达到以下几个条件才会触发: 1.element plus(其他版本没试) 2.el-table-column组件有fixed属性时 3.template标签中有el-button,并且el-button有size=“small”时 4.我的浏览器缩放(Ctrl+滚轮)达到110%时 会

    2024年02月13日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包