1. 鼠标事件
1.1 鼠标按下
QObject
中的mousePressEvent()
方法
在子类中重写该方法,就可以处理鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{if (ev->button() == Qt::LeftButton) {QString str = QString("mouse press x = %1, y = %2").arg(ev->x()).arg( ev->y());qDebug() << "mouse press event!!!";qDebug() << str;QString glbStr = QString("mouse pos global: x = %1, y = %2").arg(ev->globalX()).arg(ev->globalY());qDebug() << glbStr;}
}
可以通过QMouseEvent
中的button()
来判断按键是不是鼠标。
1.2 鼠标松开
类似鼠标按下,都是重写方法
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{qDebug() << "mouse release event!!!";}
1.3 鼠标移动
类似鼠标按下
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{qDebug() << "mouse move event!!!";
}
1.4 进入事件
重写enterEvent(QEnterEvent *)
方法即可
1.5 离开事件
重写leaveEvetn(QEvent *event)
方法即可
void myLabel::leaveEvent(QEvent *event)
{qDebug() << "mouse leave the label!!!";}
2. 定时器事件
2.1 QObject内置定时器
QObject
有定时器方法startTimer
timer1_id = startTimer( 1000 );
timer2_id = startTimer( 2000 );
但是需要重写timerEvent
, 比较死板
void Widget::timerEvent(QTimerEvent *ev)
{static int n = 1;static int n2 = 1;if (ev->timerId() == timer1_id) {ui->timerLabel->setText(QString::number(n++));}if (ev->timerId() == timer2_id) {ui->timer2Label->setText(QString::number(n2++));}
}
2.2 自定义定时器
通过QTimer
类来使用定时器,比较灵活;我们一般使用这种。
QTimer *timer = new QTimer( this );timer->start( 500 );connect( ui->pauseBtn, &QPushButton::clicked, this, [=](){if ( timer->isActive() ) {timer->stop();ui->pauseBtn->setText( "开始" );}else {timer->start();ui->pauseBtn->setText( "暂停" );}});
3. 事件过滤
3.1 通过event
方法
重写QObject::event(QEvent *ev)
方法,在分发事件前处理。
bool myLabel::event(QEvent *ev)
{if ( ev->type() == QEvent::MouseButtonPress) {qDebug() << "QEvent::event";return true;}return QLabel::event( ev );
}
3.2 通过事件过滤器
- 通过
QObject::installEventFilter()
安装事件过滤器
ui->label->installEventFilter(this);
- 通过
eventFilter(QObject *obj, QEvent *ev)
处理事件
if ( obj == ui->label) {if ( e->type() == QEvent::MouseButtonPress) {qDebug() << "event Fileter process mouse clicked!!!";QMouseEvent *ev = static_cast<QMouseEvent *>( e );QString str = QString("mouse press x = %1, y = %2").arg(ev->x()).arg( ev->y());qDebug() << "mouse press event!!!";qDebug() << str;QString glbStr = QString("mouse pos global: x = %1, y = %2").arg(ev->globalX()).arg(ev->globalY());return true;}}return QWidget::eventFilter( obj, e);
4. 绘图事件
跟上面的事件处理差不多,重写绘图函数paintEvent(QPaintEvent *)
4.1 画家类
需要创造出一个画家类来画东西, 这里的this
指的是画画的范围。
QPainter painter( this );
4.2 画笔类
可以用QPen
类和setPen()
方法来指定画图的笔的颜色宽度等相关信息
QPen pen(QColor( 255, 0, 0));pen.setWidth( 1 );pen.setStyle(Qt::DotLine);
4.3 画刷类
画刷类是来填充封闭图形的
QBrush brush(QColor( 0, 255, 255));brush.setStyle(Qt::Dense5Pattern);painter.setBrush( brush );
4.4 画图形状
准备好画家类和画笔这些东西后就可以绘制图形了
- 画线
drawLine()
- 画圆和椭圆
drawEllipse()
- 画矩形
drawRect()
- 画文本
drawText()
painter.drawLine(QPoint(0, 0), QPoint(100, 100));painter.drawEllipse(QPoint( 100, 100), 50, 50);painter.drawRect(QRect(200, 200, 100, 100));painter.drawText( QRect(10,200, 150, 50), "study hard, day day up");