c++ qt--事件(第六部分)

c++ qt–事件(第六部分)

一.编辑伙伴,编辑顺序(按TAB进行切换)

1.编辑伙伴

此功能在设计界面如下的位置

在这里插入图片描述

1.设置伙伴关系

在这里插入图片描述

鼠标左键长按一个Label组件然后把鼠标移到另一个组件上

2.伙伴关系的作用

伙伴关系的作用就是可以设置快捷键,通过快捷键直接定位到某个组件

3.添加快捷键

在这里插入图片描述

4.使用快捷键

ALT+设置快捷键的字符

qt中上面的菜单栏也可以用alt+相应的字符进行使用

在这里插入图片描述

2.编辑顺序

此功能在设计界面如下的位置

在这里插入图片描述

1.设置编辑顺序

直接用鼠标左键点排序的方块即可,先点的顺序就靠前

在这里插入图片描述

在这里插入图片描述

3.进行切换

按TAB键即可进行编辑对象的切换(按顺序切换)

二.事件

1.什么是事件

事件是由系统或Qt本身在不同的时刻发出的。

事件是信号的前驱(事件驱动信号)

如果使用组件,关心的是信号槽;如果使用自定义组件,关心的是事件

2.关于事件的第一个例子 监控鼠标状态(用事件来进行监控)

1.用到的组件如下

在这里插入图片描述

2.重写事件(虚函数重写)

1.创建一个文件,用来重写事件(虚函数重写)

在这里插入图片描述

在这里插入图片描述

2.修改类

在创建的文件的头文件进行的修改

在这里插入图片描述

在创建的文件的源文件进行的修改

在这里插入图片描述

3.重写事件(虚函数重写)

在创建的文件的头文件的类中写下面代码

//声明
public:
     void mousePressEvent(QMouseEvent *ev) override;//override是判断是否重写了父类的虚函数,注意qt中的虚函数的函数名是斜体的
     void mouseMoveEvent(QMouseEvent *ev) override;
     void mouseReleaseEvent(QMouseEvent *ev) override;

在创建的文件的源文件中写下面代码

mylabel1::mylabel1(QWidget *parent) : QLabel(parent)//构造函数
{
    this->setMouseTracking(true);//鼠标默认不追踪,这里设置鼠标默认追踪

}

//button 触发当前时间的按钮
//button 当前时间发生时,哪些按键时按下的
//定义
void mylabel1::mousePressEvent(QMouseEvent *ev){
    if(ev->button()==Qt::LeftButton){//如果是鼠标左键按下
        QString s=QString("鼠标左键按下:%1,%2").arg(ev->x()/*获取横坐标*/).arg(ev->y()/*获取纵坐标*/);
        this->setText(s);
    }
}

void mylabel1::mouseMoveEvent(QMouseEvent *ev){
    QString s;
    if(ev->buttons()==(Qt::LeftButton|Qt::RightButton)){//鼠标左键和按键都按下了
        s=QString("鼠标左右键:%1,%2").arg(ev->x()).arg(ev->y());//获取坐标
    }
    else if(ev->buttons()==(Qt::NoButton)){//鼠标左键和右键都按下了
        s=QString("没有按键:%1,%2").arg(ev->x()).arg(ev->y());//获取坐标
    }
      this->setText(s);
}

void mylabel1::mouseReleaseEvent(QMouseEvent *ev){

    if(ev->button()==Qt::RightButton){//鼠标右键 释放
        QString s=QString("鼠标右键释放:%1,%2").arg(ev->x()).arg(ev->y());//获取坐标
        this->setText(s);
    }
}
4.将子类与组件进行绑定

在这里插入图片描述

在这里插入图片描述

3.关于事件的第二个例子 输入电话号码 只能输入数字且只能是11位(用事件来进行监控)

1.用到的组件如下

在这里插入图片描述

2.重写事件(虚函数重写)

1.创建一个文件,用来重写事件(虚函数重写)

在这里插入图片描述

在这里插入图片描述

2.修改类

在创建的文件的头文件进行的修改

在这里插入图片描述

在创建的文件的源文件进行的修改

在这里插入图片描述

3.重写事件(虚函数重写)

在创建的文件的头文件的类中写下面代码

//声明
public:
     //事件 分发
     bool event(QEvent *) override;

     //事件处理器 event handler
     void keyPressEvent(QKeyEvent *) override;

在创建的文件的源文件中写下面代码

//定义
bool myLineEdit::event(QEvent * ev)
{
    if(ev->type()/*判断事件的类型*/==QEvent::KeyPress){ //如果当前事件类型为键盘按下事件
        QKeyEvent* pKey=(QKeyEvent*)ev;//强转为某个具体的事件

        int key=pKey->key();//获取按下的那个按键
        if((Qt::Key_0<=key&&key<=Qt::Key_9)||key==Qt::Key_Backspace){//如果是数字,则放行
            qDebug()<<"event 放行 "<<key;
            return QLineEdit::event(ev);//继续走分发
        }

        else{//拦截
             qDebug()<<"event 拦截 "<<key;
             if(key==Qt::Key_Return){//Key_Return:字母区的回车, Key_Enter:数字小键盘的回车
                 QMessageBox::information(this,"电话号码",m_strTel);//弹出提示框,显示输入的电话号码
             }
            //return true;//当前事件已经得到了处理,不会继续分发了
            return false;//当前事件 当前的组件处理不了,交由父窗口继续处理
        }
    }
     return QLineEdit::event(ev);//其他类型的事件继续走分发
}

void myLineEdit::keyPressEvent(QKeyEvent * pKey)
{
     qDebug()<<"keyPressEvent="<<pKey->key();

     if(pKey->key()==Qt::Key_Backspace){//如果是backspace键
         //m_strTel是定义在类中的属性,公有的属性
        m_strTel= m_strTel.left(m_strTel.size()-1);//截取
        QString stel=text();
        setText(stel.left(stel.size()-1));
     }
     else if(m_strTel.size()<11){//对显示的电话号码中间四位进行加密处理
         m_strTel+=QString::number(pKey->key()-Qt::Key_0);

         if(m_strTel.size()<=3){
             setText(m_strTel);
         }
         else if(m_strTel.size()>3&&m_strTel.size()<7){
             QString s=m_strTel.left(3);
             for(int i=3;i<m_strTel.size();i++){
                 s+="*";
             }
              setText(s);
         }
         else{
              QString s=m_strTel.left(3)+"****"+m_strTel.right(m_strTel.size()-7);
              setText(s);
         }
     }
}
4.将子类与组件进行绑定

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_73483024/article/details/132510968