1、概述
源码放在文章末尾
该项目实现了会逃跑的按钮:
两个按钮,一个为普通按钮,另一个为会跑走的按钮
鼠标移到上面时,立刻跑掉
针对鼠标、键盘、触屏进行优化
随机交换两个按钮的文字、偶尔钻到另一个按钮下面、鼠标移开自动重置到原来状态
项目demo演示如下:
项目部分代码如下所示:
#ifndef ESCAPEDIALOG_H
#define ESCAPEDIALOG_H#include <QObject>
#include <QDialog>
#include <QLabel>
#include <QVBoxLayout>
#include <QDateTime>
#include <random>
#include <QDebug>
#include <QPropertyAnimation>
#include <QTimer>
#include <QKeyEvent>
#include "hoverbutton.h"class EscapeDialog : public QDialog
{
#define MARGIN 20Q_OBJECT
public:EscapeDialog(QString title, QString msg, QString esc, QString nor, QWidget* parent = nullptr);protected:void resizeEvent(QResizeEvent *event) override;void leaveEvent(QEvent* event) override;private:void resetBtnPos();void recoverEscBtnPos();void moveEscBtnAni(QPoint aim);qint64 getTimestamp();int getRandom(int min, int max);bool isEqual(int a, int b);public slots:void slotPosEntered(QPoint point); // 鼠标进入事件:移动按钮或者交换按钮void slotEscapeButton(QPoint p = QPoint()); // 移动按钮void slotExchangeButton(); // 交换按钮private:QLabel* msg_lab;HoverButton* esc_btn/*accept*/, *nor_btn/*reject*/;std::random_device rd;std::mt19937 mt;bool exchanged; // 两个按钮是否交换了位置int escape_count; // 跑动的次数(包括交换)int last_escape_index; // 上次交换位置的次数(免得经常性的交换)bool has_overlapped; // 是否和另一个按钮进行重叠
};#endif // ESCAPEDIALOG_H