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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值