Qt5 检测另一个小部件下的小部件

Qt5 detecting widgets under an other one

本文关键字:小部 检测 Qt5 另一个      更新时间:2023-10-16

我正在尝试检测两个小部件是否重叠而没有任何成功。下面是一个最小示例:

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void hover();
};
#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "hover.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
QPushButton* pb = new QPushButton("Button", this);
setCentralWidget(pb);
connect(pb, SIGNAL(clicked(bool)), this, SLOT(hover()));
}
MainWindow::~MainWindow() {}
void MainWindow::hover()
{
Hover* h = new Hover(centralWidget());
h->show();
}

悬停.h

#ifndef HOVER_H
#define HOVER_H
#include <QDialog>
class QMoveEvent;
class Hover : public QDialog
{
public:
Hover(QWidget* w, Qt::WindowFlags f = Qt::WindowFlags());
protected:
void moveEvent(QMoveEvent* event);
private:
QWidget* w;
};
#endif // HOVER_H

悬停.cpp

Hover::Hover(QWidget* w, Qt::WindowFlags f) : QDialog(nullptr, f), w(w)
{
setAttribute(Qt::WA_DeleteOnClose);
}
void Hover::moveEvent(QMoveEvent* event)
{
if(qApp->widgetAt(event->pos()) == w)
{
qDebug() << "YES"; // Never triggered.
}
}

正如你在上面看到的,我实现了Hover类的QDialog::moveEvent,以便在小部件被拖到MainWindowQPushButton上时得到通知。但是,当我将对话框移到按钮上时,它不起作用。

有人有解决方案吗?

感谢您的回答。

编辑

我玩弄了eyllanesc的代码。它适用于上述示例。但是,我在使用QPropertyAnimation时注意到一些奇怪的事情。事实上,QPushButton的全局坐标似乎是错误的。QPushButtonx坐标略微向右偏移。 只需将MainWindow的代码替换为以下代码:

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QPushButton;
class Hover;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void hover();
private:
QPushButton* pb;
Hover* h;
};
#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "hover.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
pb = new QPushButton("Button", this);
connect(pb, SIGNAL(clicked(bool)), this, SLOT(hover()));
}
MainWindow::~MainWindow() {}
void MainWindow::hover()
{
QPropertyAnimation* a = new QPropertyAnimation(pb, "geometry");
a->setDuration(1000);
a->setStartValue(QRect(0, 0, pb->width(), pb->height()));
a->setEndValue(QRect(50, 50, pb->width(), pb->height()));
a->start();
h = new Hover(pb);
h->setGeometry(300, 300, 50, 100);
h->show();
}

你也会这样吗?如果是这样,有人有解释吗?

再次感谢您的回答。

我们可以不使用widgetAt()函数,而是使用其区域的交集(根据文档widgetAt()很慢(

为此,我们通过函数mapToGlobal()pos()使用全局位置,以及函数size(),之后我们检查是否存在交集

void Hover::moveEvent(QMoveEvent*)
{
if(!visibleRegion().isNull() && w)
{
QRect RectW(w->mapToGlobal(QPoint(QPoint(0,0))), w->size()) ;
QRect RectHover = QRect(pos(), size());
if(!RectW.intersected(RectHover).isEmpty())
qDebug()<<"yes";
else {
qDebug()<<"no";
}
}
}