【五天时间】Qt从入门到实战:第三天

第一天

https://blog.csdn.net/qq_40507857/article/details/125730739

第二天

https://blog.csdn.net/qq_40507857/article/details/125863093

第三天

3.1 自定义控件封装

  • 添加新文件 - Qt - 设计师界面类 - (.h, .cpp, .ui)
  • .ui中设计QSpinBox和QSlider
  • Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升
  • 实现功能,改变数字,滑动条跟着移动,信号和槽监听
  • 提供getNum和setNum对外接口
  • 测试接口
    在这里插入图片描述

3.2 Qt中的鼠标事件

  • 鼠标进入事件 enterEvent
  • 鼠标离开事件 leaveEvent
  • 鼠标按下
  • 鼠标释放
  • 鼠标移动
  • ev->x() x坐标 ev->y() y坐标
  • ev->button() 可以判断所有的按键 Qt::LeftButton Qt::RightButton
  • ev-buttons() 判断组合按键
  • 格式化字符串 QString(“%1 %2”).arg(111).arg(222);
//鼠标进入事件
void myLabel::enterEvent(QEvent *event){
    
    
//    qDebug()<<"鼠标进入事件";
}

//鼠标离开事件
void myLabel::leaveEvent(QEvent *event){
    
    
//    qDebug()<<"鼠标离开事件";
}

//鼠标按下
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;
    }
}

//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev){
    
    
    qDebug()<<"鼠标释放";
}

//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev){
    
    
    qDebug()<<"鼠标移动";
}

3.3 定时器

定时器1

  • 利用事件 void timerEvent(QTimerEvent *event)
  • 启动定时器 startTimer(1000) 毫秒单位
  • timerEvent的返回值是定时器的唯一标识,可以和event->timerId做比较

定时器2

  • 利用定时器类 QTimer
  • 创建定时器对象 QTimer *timer = new QTimer(this)
  • 启动定时器 timer->start(毫秒)
  • 每隔一定的毫秒,发送信号 timeout,进行监听
  • 暂停 timer->stop

3.4 Event事件分发器

在这里插入图片描述

  • 用途:用于事件的分发,也可以做拦截(不建议)
  • bool event(QEvent * e)
  • 返回值 如果是true,代表用户处理这个事件,不需要向下分发
  • e->type()==鼠标按下事件类型
//通过Event事件分发器 拦截 鼠标按下事件
bool myLabel::event(QEvent *e){
    
    
    //如果是鼠标按下事件,在Event事件分发中做拦截操作
    if(e->type()==QEvent::MouseButtonPress){
    
    
        QMouseEvent *ev=static_cast<QMouseEvent *>(e);
        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);
}

3.5 事件过滤器

在这里插入图片描述

  • 在程序将事件分发到事件分发器前,可以利用过滤器做拦截
  • 步骤:
    • 给控件安装事件过滤器
    • 重写eventFilter函数

3.6 QPainter

  • 绘图事件 void paintEvent()
  • 声明一个画家对象 QPainter painter(this) this 指定绘图设备
  • 画线、画圆、画矩形、画文字
  • 设置画笔QPen、设置画笔宽度、风格
  • 设置画刷QBrush 设置画刷风格
void Widget::paintEvent(QPaintEvent *event){
    
    
    //实例化画家对象 this指定的是绘图设备
    QPainter painter(this);

    //设置画笔
    QPen pen(QColor(255,0,0));

    //设置画笔宽度
    pen.setWidth(3);

    //设置画笔的风格
    pen.setStyle(Qt::DotLine);

    //让画家使用这个笔
    painter.setPen(pen);

    //设置画刷
    QBrush brush(Qt::cyan);
    //让画家使用画刷
    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));

    //画文字
    painter.drawText(QRect(10,200,150,50),"好好学习,天天向上!");
}

在这里插入图片描述

  • 抗锯齿导致效率低
  • 对画家进行移动、保存状态、还原状态

3.7 绘图设备

  • QPainterDevice绘图设备:QPixmap,QImage,QBitmap(黑白),QPicture,QWidget
  • QPixmap对不同平台做了显示的优化
  • QImage可以对像素进行访问
  • QPicture记录和重现绘图指令

3.8 QFile对文件的读写操作

  • QFile file(path)
  • 读文件file.open(打开方式)
  • 全部读取 file.readAll()
  • 按行读取 file.readLine()
  • 判断是否读到文件尾 file.atEnd()
  • 利用编码格式类指定读取格式 QTextCodeC
  • 写文件 file.open(QIODevice::writeOnly/Append)
  • file.write(内容)
//点击选取文件按钮,弹出文件对话框
    connect(ui->pushButton,&QPushButton::clicked,[=](){
    
    
        QString path = QFileDialog::getOpenFileName(this,"打开文件");

        //将路径放入到lineEdit中
        ui->lineEdit->setText(path);

        //读取内容 放入到textEdit中
        QFile file(path);

        //设置打开方式
        file.open(QIODevice::ReadOnly);

//        QByteArray array=file.readAll();

        QByteArray array;
        while (!file.atEnd()) {
    
    
            array+=file.readLine();//按行读取
        }

        //文件对象关闭
        file.close();

        //进行写文件
        file.open(QIODevice::Append);//用追加方式进行写
        file.write("这是追加的内容!");
        file.close();

在这里插入图片描述

//QFileInfo 文件信息类
        QFileInfo info(path);

        qDebug()<<"大小:"<<info.size()<<"后缀:"<<info.suffix()<<"名称:"<<info.fileName()<<"路径:"<<info.filePath();
        qDebug()<<"创建日期:"<<info.created().toString("yyyy-MM-dd hh:mm:ss");
        qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/125961644
今日推荐