QT&C++随记

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*  所以给参数传递地址
    

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值