[英]Qt5 detecting widgets under an other one
我试图检测两个小部件是否重叠而没有任何成功。 这是一个最小的例子:
#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.
}
}
如上所示,我重新实现了Hover
类的QDialog::moveEvent
,以便在将小部件拖到MainWindow
的QPushButton
上时得到通知。 但是,当我在按钮上移动对话框时,它不起作用。
有没有人有办法解决吗?
谢谢你的回答。
我玩了eyllanesc的代码。 它适用于上述样本。 但是,当我使用QPropertyAnimation
时,我发现了一些奇怪的东西。 实际上, QPushButton
的全局坐标似乎是错误的。 QPushButton
的x
坐标略微向右偏移。 只需用以下代码替换MainWindow
的代码:
#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
#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();
}
这也发生在你身上吗? 如果是这样,有没有人有解释?
再次感谢您的回答。
我们可以使用它的区域的交集(根据docs 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";
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.