實現效果,鼠標在移動到按鈕上方時,按鈕會隨機移動到另一個地方,鼠標無法點擊到按鈕
值得一提的是 : 實現方法是在按鈕(pushbutton)內部封裝好鼠標隨機移動的事件,在主程序中只是實例化一個按鈕對象,這種方式可以使得主程序簡潔明朗。
步驟如下:
一、建立一個新項目工程,選擇QT Widgets Application,點擊右下方choose
取個名字
選擇基類為QWidget
二、新項目建立后,需要重寫控件內部的函數
原來的QWidget中有自己封裝好的繼承於父類QPushButton的按鈕控件,現在要對按鈕進行自己的改變。
所以:右鍵單擊項目名稱,選擇“添加新文件”
選擇C++/C++ class
命名自己的對象類名,並聲明其基類為QWidget
繼續點擊下一步,添加該文件到項目move_button中,最后點擊完成
三、重寫鼠標移動函數,
在mybutton.h文件中做如下改動
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QWidget> #include <QPushButton> class MyButton : public QPushButton //重寫button內部的函數,將原來繼承於widget的父親替換為QPushButton { Q_OBJECT public: explicit MyButton(QWidget *parent = 0); ~MyButton(); signals: protected: void mouseMoveEvent(QMouseEvent *e); //重寫鼠標移動事件 public slots: }; #endif // MYBUTTON_H
在mybutton.cpp中進行功能實現
#include "mybutton.h" #include <QMouseEvent> #include<QTime> MyButton::MyButton(QWidget *parent) : QPushButton(parent) //重新寫button的函數 { qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//以當前系統時間創建隨機數生成種子 setMouseTracking(true); //使得不需要按下鼠標就能觸發mouseMoveEvent事件,否則需要按着鼠標不松才能觸發 } MyButton::~MyButton() { } void MyButton::mouseMoveEvent(QMouseEvent *e){ int current_wid_x=this->x(); //獲取本身(按鈕)的坐標 int current_wid_y=this->y(); int mouse_x=e->x();//當前鼠標在按鍵里的坐標 int mouse_y=e->y(); 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())) //判斷當前鼠標的位置是否在按鈕內部,這里可以簡化,主要是表達出式子的含義,未進行化簡 { //產生隨機數,供給按鈕變化,且變化后的值一定要在窗體中 QWidget *parent=this->parentWidget(); //獲取父容器 int btn_x=qrand()%(parent->width()-this->width());//產生隨機的新的按鈕坐標 int btn_y=qrand()%(parent->height()-this->height()); this->move(btn_x,btn_y);//按鈕移動,因為這是在按鈕內部寫的函數,所以不用刷新,就可以看到按鈕的隨機移動 } } }
接下來就是主程序里的申明和調用了
頭文件Widget.h里面:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<mybutton.h> //包含自己寫的庫文件 namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; MyButton *btn1; //定義一個按鈕指針 }; #endif // WIDGET_H
在widget.cpp中對對象進行實例化,設置對象的初始信息
#include "widget.h" #include "ui_widget.h" #define WIDTH 120 #define HEIGHT 50 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); btn1=new MyButton(this); btn1->setText("hello"); //設置按鈕的文本顯示 btn1->setGeometry(this->width()/2,this->height()/2,WIDTH,HEIGHT); //設置初始位置,在窗體中間 } Widget::~Widget() { delete ui; }
OK運行,即可實現按鈕的隨機移動