我正在尝试检测两个小部件是否重叠而没有任何成功。下面是一个最小示例:
主窗口.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
,以便在小部件被拖到MainWindow
的QPushButton
上时得到通知。但是,当我将对话框移到按钮上时,它不起作用。
有人有解决方案吗?
感谢您的回答。
编辑
我玩弄了eyllanesc的代码。它适用于上述示例。但是,我在使用QPropertyAnimation
时注意到一些奇怪的事情。事实上,QPushButton
的全局坐标似乎是错误的。QPushButton
的x
坐标略微向右偏移。 只需将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";
}
}
}