qt中的鼠标事件
信号和槽,信号有重载版本时,需要事先声明函数指针,传参时传指针。
三个地方:头文件include<Qlabel> 继承public Qlabel 初始化Qlabel(parent);在ui界面提升为时,两边的类型必须匹配才可以提升成功。
Label的QFrame中默认为noframe,可以更改从而看到框的范围。
void myLabel::mousePressEvent(QMouseEvent *ev){
//当鼠标左键按下 打印信息
if(ev->button()==Qt::LeftButton){
QString str = QString("鼠标按下了 x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
从参数ev中捕获到点击的位置信息
按下和释放是瞬间的过程。
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev){
if(ev->buttons()&Qt::LeftButton){
//字符串格式化
QString str = QString("鼠标移动了 x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<"鼠标移动了";
}
}
&全真为真。&位与运算是针对二进制的运算,需要将枚举值转换成二进制进行计算。因此,ev->buttons()值的最低位是0还是1决定了位运算的结果。
setMouseTracking();设置鼠标追踪,参数传入bool,默认情况为false。只要鼠标移动就会被捕获到。
定时器
//定时器第二种方式 利用QTimer类 使用时需要先通过类实例化一个对象
QTimer * timer = new QTimer(this);
//启动定时器
timer->start(500);//参数为毫秒 每隔该参数的毫秒会发出一个信号
connect(timer,&QTimer::timeout,[=](){
static int num = 1;
//label4每隔0.5秒加1
ui->label_4->setText(QString::number(num++));
});
//点击暂停按钮 实现停止定时器
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});
事件分发器
event事件,用于事件的分发,也可用于拦截(不建议)
bool myLabel::event(QEvent *e)
{
//如果是鼠标按下,在event事件分发中做拦截操作
if(e->type()==QEvent::MouseButtonPress){
QMouseEvent * ev = static_cast<QMouseEvent * >(e);//静态类型转换 将一个事件对象 e
转换为 QMouseEvent
类型的指针 ev
。
QString str = QString("event函数中:鼠标按下了 x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;//true代表用户自己处理这个事件,不向下分发
}
//其他事件交给父类处理(默认处理)
return QLabel::event(e);
事件过滤器
//给label安装事件过滤器
//步骤1 安装事件过滤器
//使用 this 关键字表示当前对象的指针,它可以在成员函数内部使用,指代当前对象的指针。
//因此,将 this 作为参数传递给 installEventFilter 函数将当前对象设置为事件过滤器。
ui->label->installEventFilter(this);//谁要安装事件过滤器 要将父类填入
//步骤2 重写eventfilter事件
bool Widget::eventFilter(QObject *obj, QEvent *e)
{
if(obj==ui->label)
{
if(e->type()==QEvent::MouseButtonPress){
QMouseEvent * ev = static_cast<QMouseEvent * >(e);//静态类型转换 将一个事件对象e转换为QMouseEvent类型的指针ev
QString str = QString("事件过滤器中:鼠标按下了 x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;//true代表用户自己处理这个事件,不向下分发
}
}
//其他默认处理
return QWidget::eventFilter(obj,e);
}
QPainter
//重写绘图事件 要包含QPainter画家类头文件 系统会自动调用
void Widget::paintEvent(QPaintEvent *)
{
//实例化画家对象 this指定的是绘图的设备
QPainter painter(this);
//设置画笔
QPen pen(QColor(255,0,0));
//设置画笔宽度setWidth
pen.setWidth(3);
//设置画笔风格
pen.setStyle(Qt::DotLine);
//让画家使用这个笔 使用先设置笔才能生效
painter.setPen(pen);
//画刷 对封闭图形填充颜色
QBrush brush(Qt::cyan);//或者参数写为QColor(0,255,255)
//设置画刷风格
brush.setStyle(Qt::Dense7Pattern);
//让画家使用画刷
painter.setBrush(brush);
//画线
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画圆 椭圆
painter.drawEllipse(QPoint(100,100),50,50);
//画矩形
painter.drawRect(QRect(20,20,50,50));//x在20 y在20 画宽为50 高为50 的矩形
//画文字 提供矩形框为了在框的内部画文字
painter.drawText(QRect(50,100,100,50),"haohaoxuexi");
}
QPainter painter(this);
// painter.drawEllipse(QPoint(100,50),50,50);
// //设置 抗锯齿能力 效率较低
// painter.setRenderHint(QPainter::Antialiasing);
// painter.drawEllipse(QPoint(200,50),50,50);
//画矩形
painter.drawRect(QRect(20,20,50,50));//20,20的位置画一个50*50的正方形
painter.translate(100,0);//想当于让画家移动100,0位置
painter.drawRect(QRect(20,20,50,50));
手动调用绘图事件
点击移动按钮 移动图片要写在构造函数中
绘图设备
//使用Pixmap绘图设备 包含头文件
QPixmap pix(300,300);//300的宽度 300的高度
//声明画家 包含头文件
QPainter painter(&pix);//参数列表为QPaintDevice* 所以给参数传递地址