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運行,即可實現按鈕的隨機移動

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM