C++ 当鼠标悬停在QListWidget上时,Qt鼠标跟踪根本不起作用

C++ 当鼠标悬停在QListWidget上时,Qt鼠标跟踪根本不起作用,c++,qt,mouse,C++,Qt,Mouse,我想在我的QListWidget中获取鼠标位置。当鼠标悬停在所有其他qwidget-QMainWindow、QPushButton、CentralWidget等上时,除了QListWidget之外,跟踪是正常的 c++文件:test_1.cpp #include "test_1.h" #include "ui_test_1.h" test_1::test_1(QWidget *parent) : QMainWindow(parent), ui(new Ui::test_1) {

我想在我的
QListWidget
中获取鼠标位置。当鼠标悬停在所有其他
qwidget
-
QMainWindow
QPushButton
CentralWidget
等上时,除了
QListWidget
之外,跟踪是正常的

c++文件:test_1.cpp

#include "test_1.h"
#include "ui_test_1.h"

test_1::test_1(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::test_1)
{
    ui->setupUi(this);
    this->setMouseTracking(true);
    ui->centralWidget->setMouseTracking(true);
    ui->listWidget->setMouseTracking(true);
    ui->pushButton->setMouseTracking(true);


    ui->listWidget->addItem("aaa");
    ui->listWidget->addItem("bbb");
    ui->listWidget->addItem("ccc");
    ui->listWidget->addItem("ddd");
    ui->listWidget->addItem("eee");
}

void test_1::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << event->pos();
}

test_1::~test_1()
{
    delete ui;
}
#include "test_1.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    test_1 w;
    w.show();

    return a.exec();
}

解决这个问题的正确方法是继承
QListWidget
并实现
void mouseMoveEvent(QMouseEvent*event)

但是您还有另一个选项,比如
QListWidget
上的事件过滤器

将此项添加到您的构造函数中:

ui->listWidget->viewport()->installEventFilter(this);
并实现事件过滤器:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        qDebug() << Q_FUNC_INFO << "QEvent::MouseButtonPress";
    }
    if(event->type() == QEvent::MouseMove)
    {
        qDebug() << Q_FUNC_INFO << " pos: " << this->mapFromGlobal(QCursor::pos());
    }
    return false;
}
bool主窗口::事件过滤器(QObject*obj,QEvent*event)
{
如果(事件->类型()==QEvent::MouseButtonPress)
{
qDebug()
void test_2::mouseMoveEvent(QMouseEvent*event)
{
QPoint p=事件->位置();
QRect-widgetRect=ui->listWidget->rect();
if(widgetRect.contains(p))
{
qDebug()listWidget->grabMouse();
}
其他的
{
qDebug()列表小部件->释放鼠标();
}
}

不幸的是,该解决方案对我不起作用。我必须抓起鼠标才能在QListWidget中实现这一点。您能否将您的解决方案作为答案发布?干得好:)编码愉快!
ui->listWidget->viewport()->installEventFilter(this);
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        qDebug() << Q_FUNC_INFO << "QEvent::MouseButtonPress";
    }
    if(event->type() == QEvent::MouseMove)
    {
        qDebug() << Q_FUNC_INFO << " pos: " << this->mapFromGlobal(QCursor::pos());
    }
    return false;
}
void test_2::mouseMoveEvent(QMouseEvent *event)
{
  QPoint p = event->pos();
  QRect widgetRect = ui->listWidget->rect();

  if(widgetRect.contains(p))
  {
    qDebug() << "Inside";
    ui->listWidget->grabMouse();
  }
  else
  {
    qDebug() << "Outside";
    ui->listWidget->releaseMouse();
  }
}