QT setMouseTracking没反应

今天用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
我也没有去求证,这不是本文的重点.

posted @ 2022-09-08 12:45  xingzaicpp  阅读(134)  评论(0编辑  收藏  举报