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);
}
}
}