zoukankan      html  css  js  c++  java
  • 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运行,即可实现按钮的随机移动

  • 相关阅读:
    使用eclipse创建Spring Boot项目
    Oracle 一个表的数据update到另一个表
    C3P0连接池属性配置注释
    Druid连接池
    Oracle 五笔码函数
    Oracle 拼音码函数
    JAVA JDK环境变量配置
    一 测试基础之测试方法
    SonarQube+Jenkins,搭建持续交付平台
    swagger集成到springBoot 项目中
  • 原文地址:https://www.cnblogs.com/victorywr/p/12291278.html
Copyright © 2011-2022 走看看