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();
}
}