很多初学者都知道只要在当前窗口.cpp文件中覆写(overwrite)鼠标事件,就可以移动无标题栏的窗口ui,但是在同一个.cpp做鼠标事件,对继承和封装性不好。因此本博客主要说的是:封装分类继承做法。
1.覆写继承QWidget类的鼠标事件在Qt中创建一个项目,继承的暂时选择QWidget,项目的名字为mouse
2.在创建好项目中添加一个新类,起名为MouseMove,公有继承QWidget类
3.在MouseMove中覆写鼠标的移动,点击和释放事件,所包含的头文件为#include <QMouseEvent>和#include<QPoint>
4.在MouseMove.cpp中覆写mousePressEvent(QMouseEvent *)、mouseReselveEvent(QMouseEvent*)和mouseMoveEvent(QMouseEvent *)三个鼠标事件。
具体的代码如下
MouseMove.h文件内容
#ifndef MOUSEMOVE_H
#define MOUSEMOVE_H
#include <QWidget>
#include <QMouseEvent>
#include <QPoint>
class MouseMove : public QWidget
{
public:
explicit MouseMove(QWidget *parent = 0);
protected:
virtual void mouseMoveEvent(QMouseEvent *);
virtual void mousePressEvent(QMouseEvent *);
virtual void mouseReleaseEvent(QMouseEvent *);
private:
QPoint last;
};
#endif // MOUSEMOVE_H</span>
MouseMove.cpp文件内容
<span style="font-size:18px;">/*===================================================
* @文件 mousemove.c
* @摘要 覆写鼠标移动事件
* @作者 xxx
* @参考 无
* @版本 1.0
* @历史 无
* ===================================================
* 日期 版本 修订者 修订记录
* 2016.10.17 1.0 彭森荣 无
* ===================================================
*/
#include "mousemove.h"
/*
* 函数名: MouseMove 鼠标事件的构造函数
* @参数[I]: event 指代鼠标事件窗口
* @返回值: 无返回值
*/
MouseMove::MouseMove(QWidget *parent)
:QWidget(parent)
{
}
/*
* 函数名: mouseMoveEvent 鼠标移动的事件
* @参数[I]: event 鼠标事件指针,指代鼠标移动这个事件
* @返回值: 无返回值
*/
void MouseMove::mouseMoveEvent(QMouseEvent *event)
{
int dx = event->x() - last.x();
int dy = event->y() - last.y();
last = event->pos();
move(dx+x(),dy+y());
}
/*
* 函数名: mousePressEvent 鼠标按下的事件
* @参数[I]: event 鼠标事件指针,指代鼠标按下这个事件
* @返回值: 无返回值
*/
void MouseMove::mousePressEvent(QMouseEvent *event)
{
last = event->pos();
}
/*
* 函数名: mouseMoveEvent 鼠标单击释放的事件
* @参数[I]: event 鼠标事件指针,指代鼠标单击释放这个事件
* @返回值: 无返回值
*/
void MouseMove::mouseReleaseEvent(QMouseEvent *event)
{
int dx = event->x() - last.x();
int dy = event->y() - last.y();
move(dx+x(),dy+y());
}
</span>
完成上述的编写之后,读者可以自行尝试运行,没有问题的暂时就编译成功了。下面我们进行的是继承这个MouseMove事件。
点击项目一开始创建的.h文件,本文在这里的项目主窗口.h文件名为:mouse.h,原本上如下
<span style="font-size:18px;">#ifndef MOUSE_H
#define MOUSE_H
#include <QWidget>
namespace Ui {
class mouse;
}
class mouse : public QWidget
{
Q_OBJECT
public:
explicit mouse(QWidget *parent = 0);
~mouse();
private:
Ui::mouse *ui;
};
#endif // MOUSE_H</span>
现在修改继承的是MouseMove类,修改的是继承的类和包含的头文件就可以了
<span style="font-size:18px;">#ifndef MOUSE_H
#define MOUSE_H
#include "mousemove.h"
namespace Ui {
class mouse;
}
class mouse : public MouseMove
{
Q_OBJECT
public:
explicit mouse(QWidget *parent = 0);
~mouse();
private:
Ui::mouse *ui;
};
#endif // MOUSE_H
</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">然后在mouse.cpp中修改如下:</span>
<pre name="code" class="cpp"><span style="font-size:18px;">#include "mouse.h"
#include "ui_mouse.h"
mouse::mouse(QWidget *parent) :
MouseMove(parent),
ui(new Ui::mouse)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint); //无边框模式
}
mouse::~mouse()
{
delete ui;
}
</span>
这样就可以进行鼠标移动了
很多初学者都知道只要在当前窗口.cpp文件中覆写(overwrite)鼠标事件,就可以移动无标题栏的窗口ui,但是在同一个.cpp做鼠标事件,对继承和封装性不好。因此本博客主要说的是:封装分类继承做法。
1.覆写继承QWidget类的鼠标事件在Qt中创建一个项目,继承的暂时选择QWidget,项目的名字为mouse
2.在创建好项目中添加一个新类,起名为MouseMove,公有继承QWidget类
3.在MouseMove中覆写鼠标的移动,点击和释放事件,所包含的头文件为#include <QMouseEvent>和#include<QPoint>
4.在MouseMove.cpp中覆写mousePressEvent(QMouseEvent *)、mouseReselveEvent(QMouseEvent*)和mouseMoveEvent(QMouseEvent *)三个鼠标事件。
具体的代码如下
MouseMove.h文件内容
#ifndef MOUSEMOVE_H
#define MOUSEMOVE_H
#include <QWidget>
#include <QMouseEvent>
#include <QPoint>
class MouseMove : public QWidget
{
public:
explicit MouseMove(QWidget *parent = 0);
protected:
virtual void mouseMoveEvent(QMouseEvent *);
virtual void mousePressEvent(QMouseEvent *);
virtual void mouseReleaseEvent(QMouseEvent *);
private:
QPoint last;
};
#endif // MOUSEMOVE_H</span>
<span style="font-size:18px;">/*===================================================
* @文件 mousemove.c
* @摘要 覆写鼠标移动事件
* @作者 xxx
* @参考 无
* @版本 1.0
* @历史 无
* ===================================================
* 日期 版本 修订者 修订记录
* 2016.10.17 1.0 彭森荣 无
* ===================================================
*/
#include "mousemove.h"
/*
* 函数名: MouseMove 鼠标事件的构造函数
* @参数[I]: event 指代鼠标事件窗口
* @返回值: 无返回值
*/
MouseMove::MouseMove(QWidget *parent)
:QWidget(parent)
{
}
/*
* 函数名: mouseMoveEvent 鼠标移动的事件
* @参数[I]: event 鼠标事件指针,指代鼠标移动这个事件
* @返回值: 无返回值
*/
void MouseMove::mouseMoveEvent(QMouseEvent *event)
{
int dx = event->x() - last.x();
int dy = event->y() - last.y();
last = event->pos();
move(dx+x(),dy+y());
}
/*
* 函数名: mousePressEvent 鼠标按下的事件
* @参数[I]: event 鼠标事件指针,指代鼠标按下这个事件
* @返回值: 无返回值
*/
void MouseMove::mousePressEvent(QMouseEvent *event)
{
last = event->pos();
}
/*
* 函数名: mouseMoveEvent 鼠标单击释放的事件
* @参数[I]: event 鼠标事件指针,指代鼠标单击释放这个事件
* @返回值: 无返回值
*/
void MouseMove::mouseReleaseEvent(QMouseEvent *event)
{
int dx = event->x() - last.x();
int dy = event->y() - last.y();
move(dx+x(),dy+y());
}
</span>
完成上述的编写之后,读者可以自行尝试运行,没有问题的暂时就编译成功了。下面我们进行的是继承这个MouseMove事件。
<span style="font-size:18px;">#ifndef MOUSE_H
#define MOUSE_H
#include <QWidget>
namespace Ui {
class mouse;
}
class mouse : public QWidget
{
Q_OBJECT
public:
explicit mouse(QWidget *parent = 0);
~mouse();
private:
Ui::mouse *ui;
};
#endif // MOUSE_H</span>
现在修改继承的是MouseMove类,修改的是继承的类和包含的头文件就可以了
<span style="font-size:18px;">#ifndef MOUSE_H
#define MOUSE_H
#include "mousemove.h"
namespace Ui {
class mouse;
}
class mouse : public MouseMove
{
Q_OBJECT
public:
explicit mouse(QWidget *parent = 0);
~mouse();
private:
Ui::mouse *ui;
};
#endif // MOUSE_H
</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">然后在mouse.cpp中修改如下:</span>
<pre name="code" class="cpp"><span style="font-size:18px;">#include "mouse.h"
#include "ui_mouse.h"
mouse::mouse(QWidget *parent) :
MouseMove(parent),
ui(new Ui::mouse)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint); //无边框模式
}
mouse::~mouse()
{
delete ui;
}
</span>
这样就可以进行鼠标移动了