您现在的位置是:首页 > 技术文章网站首页技术文章

[Qt+Vs]实现躲避鼠标按钮

  • WangYe
  • 2021-01-29 13:22:15
  • 311 次阅读
简单实现自定义躲避鼠标按钮,让鼠标点不到按钮;

效果:


源码:

stdafx.h

#include <QtWidgets>
#include <QMouseEvent>


MyButton.h

#include "stdafx.h"
#include <qpushbutton.h>
class MyButton : public QPushButton
{
    Q_OBJECT

public:
    explicit MyButton(QWidget *parent = nullptr);

private:

protected:
    void mouseMoveEvent(QMouseEvent *e);

signals:

public slots:

};


MyButton.cpp

#include "MyButton.h"

MyButton::MyButton(QWidget* parent) : QPushButton(parent)
{
    /*不需要按着鼠标左键右键,一进去就立马触发事件。
    如果屏蔽该语句的话,则需要点击鼠标左键或右键才能触发mouseMoveEvent事件。*/
    setMouseTracking(true);

    /*一开始要产生随机数种子,用当前时间作为它的种子*/
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//当前系统的时间
}

void MyButton::mouseMoveEvent(QMouseEvent* e)
{
    /*判断鼠标的点是不是在窗体里面:先获取窗体本身的大小*/
    int current_wid_x = this->x();//按钮的x和y
    int current_wid_y = this->y();

    /*鼠标当前位置的值*/
    int mouse_x = e->x(); //鼠标移动的大小
    int mouse_y = e->y();

    /*调试信息*/
    qDebug() << "x1:" << current_wid_x << "     y1:" << current_wid_y<< endl;
    qDebug() << "x2:" << mouse_x << "       y2:" << mouse_y << endl;

    /*鼠标x轴方向 位置 >= 按钮左边 且 <=   (判断鼠标x轴在窗体里面)(相对于按钮的)*/
    if ((mouse_x + current_wid_x >= current_wid_x) && (mouse_x + current_wid_x <= current_wid_x + this->width())) {
        if ((mouse_y + current_wid_y >= current_wid_y) && (mouse_y + current_wid_y <= current_wid_y + this->height())) {

            //产生X轴和Y轴方向的随机数,供给按钮变换。变化后的值一定要在窗体中。

            //按钮应该在父容器里面移动,不能超出
            QWidget* parentW = this->parentWidget();//获取父容器的大小

            int btn_x = qrand() % (parentW->width() - this->width());    //X

            int btn_y = qrand() % (parentW->height() - this->height());  //Y

            this->move(btn_x, btn_y);
            //this->update();//这里的按钮不是画家画的,所以就不用update
        }
    }
}


Avoid_Mouse.h

#include <QtWidgets/QWidget>
#include "MyButton.h"

class Avoid_Mouse : public QWidget
{
    Q_OBJECT

public:
    Avoid_Mouse(QWidget *parent = Q_NULLPTR);
    ~Avoid_Mouse();
protected:
    void InitUI();
private:
    MyButton* on_Button01; //分配自定义按钮空间

};


Avoid_Mouse.cpp

#include "Avoid_Mouse.h"
#include "stdafx.h"

#define WIDTH 120
#define HEIGHT 50

Avoid_Mouse::Avoid_Mouse(QWidget *parent)
    : QWidget(parent)
{
    InitUI();
}

Avoid_Mouse::~Avoid_Mouse()
{
}

void Avoid_Mouse::InitUI()
{
    on_Button01 = new MyButton(this);
    on_Button01->setText("Hello~");
    on_Button01->setGeometry((this->width() - WIDTH) / 2, (this->height() - HEIGHT) / 2, WIDTH, HEIGHT);//指定位置
}


main.cpp

#include "Avoid_Mouse.h"
#include "stdafx.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Avoid_Mouse w;
    w.show();
    return a.exec();
}


TAG: Qt Vs 躲避

文章评论 (0)



Top