ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QT setMouseTracking没反应

2022-09-08 13:01:53  阅读:381  来源: 互联网

标签:QMainWindow QT centralWidget 反应 setMouseTracking ui MainWindow 鼠标


今天用Qt Creator自动生成了一个窗口程序,想试试setMouseTracking,兴冲冲地写下了如下代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setMouseTracking(true);
}

然后,继承了mouseMoveEvent,打印一行日志

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug("MainWindow::mouseMoveEvent: (%d,%d)\n", event->x(), event->y());
}

然后在主界面上滑动鼠标,满心期待出现一堆日志,然后,日志输出窗口空空如也.
我去,出生未捷身先死.

查询了一下资料,找到一个文章:https://stackoverflow.com/questi ... th-setmousetracking
看了回复,我翻译一下,如下:
--------------------------------------------翻译开始--------------------------------------------
因为QT设计器创建了一个"隐藏的"widget于QMainWindow中,你可以从ui_MainWindow.h中看出:

centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
MainWindow->setCentralWidget(centralWidget);

因此,是centralWidget接收了所有的鼠标消息,而不是QMainWindow
如果你放下面的代码在构造函数中,

centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
setMouseTracking(true);

你将会看到鼠标消息,但是你不能按按钮,因为centralWidget不再接收任何鼠标消息了.
--------------------------------------------翻译结束--------------------------------------------

于是,我修改了一下构造函数,

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
    setMouseTracking(true);
}

果然,我看到了一堆鼠标消息的打印.
当然,这仅仅是一个测试用例,正如原作者说的那样,此时主窗口上的按钮已经无法点击了!

另外,原文还提到,您可以继承QApplication::notify(QObject* obj, QEvent* ev)来获取所有的消息.
这个没有测试,网上有资料指出,在QT6中可能会删除这个函数:https://www.cnblogs.com/LaoYuanPython/p/11931694.html
我也没有去求证,这不是本文的重点.

标签:QMainWindow,QT,centralWidget,反应,setMouseTracking,ui,MainWindow,鼠标
来源: https://www.cnblogs.com/xingzaicpp/p/16669049.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有