QT如何重写控件内部的函数 ——趣味小程序(按钮随机移动,鼠标无法点击)

实现效果,鼠标在移动到按钮上方时,按钮会随机移动到另一个地方,鼠标无法点击到按钮

 

值得一提的是 : 实现方法是在按钮(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运行,即可实现按钮的随机移动

原文地址:https://www.cnblogs.com/victorywr/p/12291278.html