gpt4 book ai didi

c++ - Qt5检测另一个下的小部件

转载 作者:行者123 更新时间:2023-11-30 02:24:23 25 4
gpt4 key购买 nike

我正在尝试检测两个小部件是否重叠但没有成功。这是一个最小的例子:

主窗口.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";
}
}
}

关于c++ - Qt5检测另一个下的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45383795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com