QT学习之事件(一)备忘

前言:所有的事件都可以改写,事件属于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,然后松开字母消失
点击非方块区域,方块不随鼠标移动
点击方块区域,方块随鼠标移动

请添加图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值