• 【五天时间】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()<<"鼠标移动";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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),"好好学习,天天向上!");
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

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

    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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    //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");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

  • 相关阅读:
    基于centos7安装nginx
    logrotate日志轮转
    Word或者WPS批量调整文中图片大小的快捷方法
    博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)
    ES6函数的拓展形参和拓展运算符
    TSINGSEE青犀智慧机房AI+视频智能监管方案,保障机房设备稳定运转
    vue:write-excel-file页面文字转为xlsx文件
    多链路自检与灵活组网:新能源充电桩物联网5G工业路由器
    C++类和对象【中】
    C/C++编程-理论学习-通信协议理论
  • 原文地址:https://blog.csdn.net/qq_40507857/article/details/125961644