一、鼠标事件
1.声明事件,然后再cpp文件中去实现
//鼠标点击事件
void mousePressEvent(QMouseEvent *ev) override;
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *ev) override;
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *ev) override;
//进入窗口事件
void enterEvent(QEvent *);
//离开窗口事件
void leaveEvent(QEvent *);
2.以鼠标点击事件为例
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
int x = ev->x();
int y = ev->y();
if(ev->button() == Qt::LeftButton)
{
qDebug()<<"left is clicked";
}
else if(ev->button() == Qt::RightButton)
{
qDebug()<<"right is clicked";
}
else if(ev->button() == Qt::MidButton)
{
qDebug()<<"mid is clicked";
}
QString text = QString("<center><h1>Mouse Press:(%1,%2)</h1></center>").arg(x).arg(y);
this->setText(text);
}
ev->x();ev->y();就是在获取坐标的x,y轴的值,然后显示在自定义的Label上。
通过ev->button(),可以获知是点击的左键还是右键还是其他的。
二、键盘事件
1.声明事件
void keyPressEvent(QKeyEvent *event);
2.实现事件
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug()<<event->text();
qDebug()<<event->key();
}
text打印出来可以看到点击的是哪个字符,key打印的是int值,可以与QT提供的键值表对比,得知按下哪个键。
三、定时器事件
1.声明事件
void timerEvent(QTimerEvent *event);
2.实现事件
void Widget::timerEvent(QTimerEvent *event)
{
qDebug()<<"开始计时";
static int sec = 0;
sec++;
qDebug()<<sec;
if(sec==15)
{
this->killTimer(this->TimerId);
}
}
定时器事件需要开启,以毫秒为单位
TimerId=this->startTimer(1000);
关闭时,需要使用ID关闭定时器。
如果启动多个定时器事件,可以使用event->timerId()来进行比较,从而知道是哪个定时器事件。
四、事件的接受和忽略
1.自定义一个Button控件继承于QPushButton
实现鼠标按下的事件
void MyButton::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
qDebug()<<"left is pressed";
}
QPushButton::mousePressEvent(ev);
}
在窗体的cpp文件中连接clicked信号
connect(ui->pushButton,&MyButton::clicked,
[=]()
{
qDebug()<<"is clicked";
}
);
QPushButton::mousePressEvent(ev);的作用就是继续把信号传递给父类,让其他的事件能够接收。
如果不加这句,就不会输出is clicked这句话,因为事件没有继续传递下去。
2.accept函数和ignore函数
调用accept函数就是接受事件,使得事件不再继续传递。
ignore函数就是忽略事件,将事件传递给父组件,与上面不同的是,这里传递的是父组件而不是父类,也就是说如果上一级组件是Widget,则事件会传递给Widget。
五、event函数
bool Widget::event(QEvent *event)
{
switch(event->type())
{
case QEvent::KeyPress:
keyPressEvent( static_cast<QKeyEvent*>(event));
return QWidget::event(event);
default:
return QWidget::event(event);
}
}
用来管理事件,事件首先会传递给event,有event()来管理,如果在event中不下发事件,其他的事件就不会执行。
return QWidget::event(event);是为了处理事件后,让事件继续传递。
六、事件过滤器
bool Widget::eventFilter(QObject *obj,QEvent *event)
{
if(obj==ui->label)
{
if(event->type()==QEvent::MouseMove)
{
qDebug()<<"new Mouse";
}
return true; //返回true,不让事件继续传播
}
else
{
return QWidget::event(event); //返回给基类,让事件继续传播
}
}
注意:需要给控件安装事件过滤器,可以在窗口的构造函数中进行安装
ui->label->installEventFilter(this);
注意:在设置鼠标移动时,可以用下面的方法,直接得到鼠标的舰艇事件,不需要再点击一下才得到鼠标的监听
ui->label->setMouseTracking(true);