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
我也没有去求证,这不是本文的重点.
标签:QMainWindow,QT,centralWidget,反应,setMouseTracking,ui,MainWindow,鼠标 来源: https://www.cnblogs.com/xingzaicpp/p/16669049.html