QT 鼠标移动追踪

曾在网上看了一个特别骚的操作,某个程序员写了一个表白神器,如下图:

原文 传送门:https://baijiahao.baidu.com/s?id=1607861831490061736&wfr=spider&for=pc

这表白神器中的拒绝按钮 是无法选中的, 鼠标移动这个按钮也移动,今天学习QT时,也试图实现 控件随着鼠标移动而移动让其选不中,不过目前只实现了一个思路:在鼠标移动 的时候打印出鼠标的位置,代码如下:

在窗口类中重写鼠标移动事件:头文件代码如下:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QEvent>

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);
    bool event(QEvent*  ev );
    void mousePressEvent(QMouseEvent* ev);
    void mouseReleaseEvent(QMouseEvent*);
    void mouseMoveEvent(QMouseEvent*);      //鼠标移动函数

    void keyPressEvent(QKeyEvent* );
    void keyReleaseEvent(QKeyEvent*);

signals:

public slots:
};

#endif // MYWIDGET_H

注意上述代码中只需要把mouseMoveEvent那一行,其他 的行不需要添加,否则若未在源文件中实现不需要的函数,编译器时是通不过的(Windows下的QT会报LINK_2019错误)

源的件中鼠标移动函数实现如下:

void MyWidget::mouseMoveEvent(QMouseEvent *ev)  //鼠标移动函数
{

    QPoint pt = ev->pos();
    qDebug()<<pt;
}

最后在main 函数中写上:

nt main(int argc, char** argv)
{
    QApplication app(argc,argv);
    MyWidget w;
    w.setMouseTracking(true);   //开启鼠标位置追踪
    w.show();


    return app.exec();
}

主要点就是setMouseTracking()函数的 调用,注意一定是在创建窗口对象完成之后在show函数前调用这个setMouseTracking函数,若在其他地方调用,因为涉及到QT中的信号循环机制,无法达到预期的效果。关于SetMouseTracking函数,QT帮助 文档中写道:

If mouse tracking is disabled (the default), the widget only receives mouse move events when at least one mouse button is pressed while the mouse is being moved.

If mouse tracking is enabled, the widget receives mouse move events even if no buttons are pressed.

Access functions:

bool

hasMouseTracking() const

void

setMouseTracking(bool enable)

等我学完了QT,回来复习的时候尝试完整实现原文功能

猜你喜欢

转载自blog.csdn.net/qq_15054345/article/details/87869975