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
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
|