gpt4 book ai didi

c++ - 无法正确跟踪鼠标移动,setMouseTracking 无效 - Qt

转载 作者:行者123 更新时间:2023-11-28 06:15:59 25 4
gpt4 key购买 nike

我正在处理一个由其他人启动的项目,因此我无法更改代码的结构。我类的代码如下(这只是一个示例):

class myClass : public QWidget
{
Q_OBJECT
public:
explicit myClass();
~myClass();
bool eventFilter(QObject *watched, QEvent *e);

private:
QMainWindow* window;
FRAMEWORK_InfoWidget *zone_notif;
};

因此,我的类包含一个 QmainWindow“窗口”和一个自定义小部件“zone_notif”(基本上是一个矩形)。我想在鼠标光标经过“zone_notif”时显示一条消息,当它出来时显示另一条消息。我首先尝试了以下方法:

myClass::myClass():QWidget()
{
window = new QMainWindow();
window->setFixedSize(SCREEN_REZOLUTION);
window->setWindowTitle(QString("window"));

zone_notif = new FRAMEWORK_InfoWidget(restit_window);
zone_notif->setGeometry(299, 452, 320, 55);

window->installEventFilter(this);
this->setMouseTracking(true);
}

myClass::~myClass()
{
delete zone_notif;
delete window;
}

bool myClass::eventFilter(QObject *watched, QEvent *e)
{
if(e->type() == QEvent::MouseMove)
{
int x = cursor().pos().x() - restit_window->geometry().x();
int y = cursor().pos().y() - restit_window->geometry().y();
qDebug() << "Moving !";
if((x > zone_notif->pos().x()) && (x < zone_notif->pos().x() + zone_notif->width()) && (y > zone_notif->pos().y()) && (y < zone_notif->pos().y() + zone_notif->height()))
{
qDebug() << "OVER !";
}
else
{
qDebug() << "IN !";
}
return true;
}
return QWidget::eventFilter(watched, e);
}

但只有在移动前按下鼠标按钮才有效。

我找到了一个肮脏的解决方案:

bool myClass::eventFilter(QObject *watched, QEvent *e)
{
if(e->type() == QEvent::Enter)
{
qDebug() << "ENTREE";
window->grabMouse();
return true;
}
else if(e->type() == QEvent::Leave)
{
qDebug() << "Sortie";
window->releaseMouse();
return true;
}
else if(e->type() == QEvent::MouseMove)
{
int x = cursor().pos().x() - restit_window->geometry().x();
int y = cursor().pos().y() - restit_window->geometry().y();
qDebug() << "Moving !";
if((x > zone_notif->pos().x()) && (x < zone_notif->pos().x() + zone_notif->width()) && (y > zone_notif->pos().y()) && (y < zone_notif->pos().y() + zone_notif->height()))
{
qDebug() << "OVER !";
}
else
{
qDebug() << "IN !";
}
return true;
}
return QWidget::eventFilter(watched, e);
}

但是这个解决方案是不正确的。我的应用程序包含其他窗口,如果我将 QMainWindow 设置为全屏,我永远不会退出它,所以我的其他窗口不再可点击。

我尝试将 window->setMouseTracking(true) 更改为 zone_notif->setMouseTracking(true) 并且与 ìnstallEventFilter 相同,但它没有任何效果。

我还尝试覆盖 mouseMoveEvent :

void myClass::mouseMoveEvent(QMouseEvent *e)
{
qDebug() << "I am here !";
QWidget::mouseMoveEvent(e);
}

但它永远不会被调用。

你知道我如何让它发挥作用吗?

提前致谢

最佳答案

覆盖 QWidget::mouseMoveEvent(QMouseEvent * 事件)

您应该在鼠标跟踪打开时获取事件。

关于c++ - 无法正确跟踪鼠标移动,setMouseTracking 无效 - Qt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30307738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com