You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.5 KiB

#ifndef MAGNETICWIDGET_H
#define MAGNETICWIDGET_H
#include <QWidget>
#include <QPointer>
/*
* a magnetic widget
* window title bar support not good
*/
class MagneticWidget : public QWidget
{
Q_OBJECT
public:
enum AdsorbPosition {
AP_OUTSIDE_LEFT = 0x01, // 吸附外部左边框
AP_OUTSIDE_TOP = 0x02, // 吸附外部上边框
AP_OUTSIDE_RIGHT = 0x04, // 吸附外部右边框
AP_OUTSIDE_BOTTOM = 0x08, // 吸附外部下边框
AP_INSIDE_LEFT = 0x10, // 吸附内部左边框
AP_INSIDE_TOP = 0x20, // 吸附内部上边框
AP_INSIDE_RIGHT = 0x40, // 吸附内部右边框
AP_INSIDE_BOTTOM = 0x80, // 吸附内部下边框
AP_ALL = 0xFF, // 全吸附
};
Q_DECLARE_FLAGS(AdsorbPositions, AdsorbPosition)
public:
explicit MagneticWidget(QWidget* adsorbWidget, AdsorbPositions adsorbPos = AP_ALL);
~MagneticWidget();
bool isAdsorbed();
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
void moveEvent(QMoveEvent *event) override;
private:
void getGeometry(QRect& relativeWidgetRect, QRect& targetWidgetRect);
private:
AdsorbPositions m_adsorbPos = AP_ALL;
QPoint m_relativePos;
bool m_adsorbed = false;
QPointer<QWidget> m_adsorbWidget;
AdsorbPosition m_curAdsorbPosition;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(MagneticWidget::AdsorbPositions)
#endif // MAGNETICWIDGET_H