我试图检测两个小部件是否重叠而没有任何成功。这是一个最小的例子:
abstract public class Animal {
abstract public void sound();
}
public class Dog extends Animal {
public void sound() {
System.out.println("bark");
}
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound();
}
#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
#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();
}
#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
正如您在上面所看到的,我重新实现了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.
}
}
类的QDialog::moveEvent
,以便在小部件被拖到Hover
MainWindow
时收到通知。但是,当我在按钮上移动对话框时,它不起作用。
有没有人有解决方案?
感谢您的回答。
我玩了eyllanesc的代码。它适用于上述样本。但是在使用QPushButton
时我发现了一些奇怪的东西。事实上,QPropertyAnimation
的全球坐标似乎是错误的。 QPushButton
的{{1}}坐标略微偏向右侧。
只需用以下代码替换x
的代码:
QPushButton
MainWindow
这也发生在你身上吗?如果是这样,有没有人有解释?
再次感谢您的回答。
答案 0 :(得分:3)
我们可以使用其区域的交集(根据文档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";
}
}
}