前言:所有的事件都可以改写,事件属于protected标签下的virtual成员函数
所以如果要改写事件,只需要再类当中的protected标签下重写事件函数即可
1、关闭事件 QCloseEvent
例子:重写closeEvent事件函数
函数原型:[virtual protected] void QWidget::closeEvent(QCloseEvent *event)
Qt内部示例如下
编写一个例子效果如下,
界面如下,功能描述,点击【关闭关闭事件】之后该窗口无法关闭,点击【打开关闭事件】之后窗口可以正常关闭
目录结构
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QCloseEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QCloseEvent *ev; //新增加一个自己的事件
int flag = 0; //利用标记位来控制接受和忽略事件
protected:
virtual void closeEvent(QCloseEvent *event); //重写closeEvent函数
private slots:
void on_pushclose_clicked();
void on_pushopen_clicked();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
flag = 0;
this->close(); //先调用close触发关闭事件
}
Widget::~Widget()
{
delete ui;
}
void Widget::closeEvent(QCloseEvent *event)
{
//如果用不到可以用 Q_UNUSE(event);
//只有在特定情况下才忽略关闭信号
if(flag == 0) {
//忽略关闭事件
event->ignore();
}
//用全局变量获取事件以便在槽中进行操作
this->ev = event;
}
void Widget::on_pushclose_clicked()
{
ev->ignore();
flag = 0;
}
void Widget::on_pushopen_clicked()
{
ev->accept();
flag = 1;
}
关闭事件主要作用:处理某些来不及处理的内存泄露问题
2、键盘事件 QKeyEvent
例子:重写keyPressEvent事件函数
函数原型:[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event)
学会利用组合键和单键
编写例子如下:
界面如下:一个label控件
要求:输入键盘时将按键的值写进label中,按下 Backspace或者Delete时删除一个字母,
按下ctrl+c时复制内容,ctrl+v在文本框后面粘贴,ctrl+x剪切文本框内容
代码:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QKeyEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QString copy;//用于存储拷贝的字符串
protected:
virtual void keyPressEvent(QKeyEvent *ev);//重写按键函数
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::keyPressEvent(QKeyEvent *ev)
{
QString str;
//按backspace和delete 删除一个
if(ev->key() == Qt::Key_Backspace||ev->key() == Qt::Key_Delete){
str = ui->label->text();
str.chop(1); //删除一个
ui->label->setText(str);
}else if(ev->modifiers() == Qt::ControlModifier &&ev->key() == Qt::Key_C){
copy.clear();//先情况copy中的内容
copy = ui->label->text(); //将label中的文字获取到copy中
}else if(ev->modifiers() == Qt::ControlModifier &&ev->key() == Qt::Key_V){
str = ui->label->text()+copy;
ui->label->setText(str);
}else if(ev->modifiers() == Qt::ControlModifier &&ev->key() == Qt::Key_X){
copy.clear();
copy = ui->label->text();
ui->label->clear();
}else{
//按键盘输入键盘字母r
str = ui->label->text()+ev->text();
ui->label->setText(str);
}
}
输入hello 1
删除一个
ctrl+c ctrl+v
ctrl+x
ctrl+v 两次
3、鼠标事件 QMouseEvent
例子:重写mousePressEvent、mouseReleaseEvent、mouseMoveEvent 事件函数
函数原型:
[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)
[virtual protected] void QWidget::moveEvent(QMoveEvent *event)
例子:
鼠标点击时,label中显示字母P,松开时清空
鼠标点击坐标在框内时,方块跟随鼠标移动,
鼠标点击在框外时,方块不跟随鼠标移动。
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QPoint>
#include <QRect>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QPoint lablep;
QPoint mousep;
bool isclicked; //是否点在框内
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
isclicked = false;
}
Widget::~Widget()
{
delete ui;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
ui->label->setText(" P");//按下显示字母P
lablep = ui->label->pos();//更新label的坐标位置
mousep = event->pos();//更新鼠标点击的位置
QRect rect = ui->label->rect(); //获取label的范围
isclicked = rect.contains(event->pos()-lablep);
//判断是否点击在label内 输入的坐标以rect的左上角为坐标原点,所以要减去p的位置
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);//排除警告
ui->label->clear();//松开清空
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
QPoint p;
p = event->pos();
//只有点击在方框内部才会跟着鼠标移动
if(isclicked == true){
ui->label->move(p - mousep + lablep);
}
}
效果如下
先点击屏幕出现字母p,然后松开字母消失
点击非方块区域,方块不随鼠标移动
点击方块区域,方块随鼠标移动