实现效果,鼠标在移动到按钮上方时,按钮会随机移动到另一个地方,鼠标无法点击到按钮
值得一提的是 : 实现方法是在按钮(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运行,即可实现按钮的随机移动