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