事件
所有的事件都被称为QEvent
鼠标事件
鼠标进入的事件叫QEnterEvent, 只要鼠标进入就有
void myLabel::enterEvent(QEvent *event)
{
qDebug()<<"小飞棍来喽";
}
void myLabel::leaveEvent(QEvent *event)
{
qDebug()<<"小飞棍走喽";
}
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
if(ev->buttons() & Qt::LeftButton){
qDebug()<<"小飞棍动喽";
}
}
void myLabel::mousePressEvent(QMouseEvent *ev)
{
if(ev->button()==Qt::LeftButton){
QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());
qDebug()<<"按下"<<str;
}
QString str2 = QString("鼠标按下了 Gx = %1 Gy = %2").arg(ev->globalX()).arg(ev->globalY());
qDebug()<<"按下"<<str2;
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
qDebug()<<"释放";
}
可以从QMouseEvent获取鼠标的信息
QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y()); qDebug()<<"按下"<<str;
可以使用格式化字符串, 使用x(), y()获取相对于控件的坐标, 使用globelX(), globelY()获取相对于屏幕的坐标
Qt::MouseButton button() const获取按下的按键
使用buttons()获取多个按键的状况, 使用&进行判断, 进行状态的判断, 在移动的时候使用这个进行判断
setMouseTracking(true);
设置鼠标的追踪状态
定时器
事件
//启动定时器, 返回值是定时器的id, 可以定义多个定时器
startTimer(1000);//单位毫秒
void Widget::timerEvent(QTimerEvent *ev)
{
int id = ev->timerid();//获得id可以进行判断
int num = 1;
ui->label_2->setText(QString::number(num++));
}
定时器类
//另一种
QTimer *timer = new QTimer(this);
timer->start(500);
//会产生一个信号
connect(timer, &QTimer::timeout, [=](){
qDebug() << "jiji";
});
事件分发器
应用在调用处理函数之前会先调用事件分发器, 返回值是一个bool, 是true的时候就代表是用户要处理这个事件, 可以对事件进行一个拦截, 使用函数bool event(QEvent *);
bool myLabel::event(QEvent *e)
{
if(e->type()==QEvent::MouseButtonPress)
{
//鼠标按下进行拦截
QString str = QString("EVENT鼠标按下了");
qDebug()<<"按下"<<str;
//不进行调用
return true;
}
//父类处理函数
return QLabel::event(e);
}
可以使用强制类型装换装换为鼠标的事件, 然后进行坐标的提取
QMouseEvent *ev = static_cast<QMouseEvent *>(e); QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());
事件过滤器
在事件到事件分发器之前可以使用事件过滤器进行过滤
有两个步骤, 首先给事件安装事件过滤器, 然后重写eventfilter事件
//给label安装事件过滤器
ui->label->installEventFilter(this);
//重写函数
bool Widget::eventFilter(QObject *obj, QEvent *e)
{
//重写事件过滤器
if(obj==ui->label)
{
if(e->type()==QEvent::MouseButtonPress)
{
//鼠标按下进行拦截
QMouseEvent *ev = static_cast<QMouseEvent *>(e);
QString str = QString("事件过滤器鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());
qDebug()<<"按下"<<str;
return true;
}
}
return QWidget::eventFilter(obj, e);
}