Qt5检测另一个小部件

时间:2017-07-28 23:40:04

标签: c++ qt qt5

我试图检测两个小部件是否重叠而没有任何成功。这是一个最小的例子:

mainwindow.h

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

mainwindow.cpp

#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

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

hover.cpp

#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的代码:

mainwindow.h

QPushButton

mainwindow.cpp

MainWindow

这也发生在你身上吗?如果是这样,有没有人有解释?

再次感谢您的回答。

1 个答案:

答案 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";
       }
    }
}