1.項目目標
本次根據Qt的鼠標移動事件實現一個趣味小程序:當鼠標移動到按鈕時,按鈕就會隨機出現在置,以至于根本點擊不到按鈕。?????
?2.項目步驟
首先現在ui界面設計控件(也可以用代碼的方式創建,就不多說了)
第一個按鈕不需要移動,所以點擊它后只需要一個簡單的槽函數把QLabel的文本更改一下即可。?
?接下來重點是第二個按鈕,如何實現它的隨機移動從而讓鼠標點擊不到呢?這個時候就可以用到鼠標移動事件了。當鼠標移動到按鈕中,按鈕會隨機移動,所以我們還需要qrand來進行隨機數的設置。
由于是對按鈕進行鼠標移動事件,所以我們需要一個繼承按鈕的類來進行相關設置。
?在完成基本配置后,就可以進行后續操作了。接下來就是添加鼠標移動事件的函數了
//在.h文件中添加如下聲明代碼,點擊改行代碼按住alt+F4自動給.cpp添加定義代碼void mouseMoveEvent(QMouseEvent* event);//鼠標移動事件
?
還需要注意的一點是此時并不是真正的隨機,所以還需要設置隨機數種子,把它設置為當前時間?。
設置完畢后我們運行代碼,發現按鈕并不會移動,因為我們還沒指定某一個按鈕去移動它,所以我們需要把第二個按鈕的類設置為我們剛剛創建好的類。
?
?此時再運行程序,按鈕會移動,成功。
3.代碼展示
?因為主界面沒什么改變,只添加了一個槽函數,所以不展示了,只展示MyEven.h和MyEvent.cpp
//MyEvent.h#ifndef MYEVENT_H
#define MYEVENT_H#include <QWidget>
#include <QPushButton>class MyEvent : public QPushButton
{Q_OBJECT
public:explicit MyEvent(QWidget *parent = nullptr);void mouseMoveEvent(QMouseEvent* event);//鼠標移動事件signals:};#endif // MYEVENT_H
//MyEvent.cpp#include <QTime>MyEvent::MyEvent(QWidget *parent) : QPushButton(parent)
{setMouseTracking(true);qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//設置為按當前時間
}void MyEvent::mouseMoveEvent(QMouseEvent* event)
{int current_x=this->x();//獲取按鈕的x軸坐標int current_y=this->y();//獲取按鈕的軸坐標int mouse_x=event->x();//獲取鼠標的x軸坐標int mouse_y=event->y();//獲取鼠標的y軸坐標if((current_x+mouse_x>=mouse_x)&&(current_x+mouse_x<=current_x+this->width())){if((current_y+mouse_y>=current_y)&&(current_y+mouse_y<=current_y+this->height())){//按鈕應該在父容器里面移動,不能超出QWidget *parent=this->parentWidget();//獲取父類,也就是QWidget對象//取x軸和y軸的隨機值int btn_x=qrand()%(parent->width()-this->width());int btn_y=qrand()%(parent->height()-this->height());this->move(btn_x,btn_y);}}
}
?