QT - Day 5

1    event事件

  • 用途:用于事件的分发
  • 也可以做拦截操作,不建议
  • bool event( QEvent * e);
  • 返回值 如果是true 代表用户处理这个事件,不向下分发了
  • e->type() == 鼠标按下 …

myLabel.cpp

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
    //设置鼠标追踪状态
    //setMouseTracking(true);
}


//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{
   // qDebug() << "鼠标进入了";

}

//鼠标离开事件
void myLabel::leaveEvent(QEvent *)
{
   // 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)
{

//    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::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() << str;
   }
}


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);
}

myLabel.h

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = 0);

    //鼠标进入事件
    void enterEvent(QEvent *event);

    //鼠标离开事件
    void leaveEvent(QEvent *);


    //鼠标按下
    virtual void mousePressEvent(QMouseEvent *ev);

    //鼠标释放
    virtual void mouseReleaseEvent(QMouseEvent *ev);

    //鼠标移动
    virtual void  mouseMoveEvent(QMouseEvent *ev);

    //通过event事件分发器 拦截 鼠标按下事件
    bool event(QEvent *e);


signals:

public slots:
};

#endif // MYLABEL_H

2    事件过滤器 

  • 在程序将时间分发到事件分发器前,可以利用过滤器做拦截
  • 步骤

          1)  给控件安装事件过滤器

          2)  重写 eventFilter函数 (obj , ev)

在widget.cpp中处理

 Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

//给label1 安装事件过滤器 // 步骤1 安装事件过滤器 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); 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); }

注意:要在widget.h中声明  

 //重写事件过滤器的事件
  bool eventFilter(QObject *, QEvent *);

3    QPainter 绘图

  • 绘图事件  void paintEvent()
  • 声明一个画家对象  QPainter  painter(this)  this指定绘图设备
  • 画线、画圆、画矩形、画文字
  • 设置画笔 QPen  设置画笔宽度 、风格
  • 设置画刷 QBrush 设置画刷 风格

4    QPainter高级设置

  • 抗锯齿 效率低
  • painter.setRenderHint(QPainter::Antialiasing);
  • 对画家进行移动

          1)  painter.translate(100,0);

          2)  保存状态 save

          3)  还原状态 restore

  • 如果想手动调用绘图事件 利用update
  • 利用画家画图片 painter.drawPixmap( x,y,QPixmap(  路飞) )

3和4的代码集合

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter> //画家类
#include <QTimer>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //点击移动按钮,移动图片
    connect(ui->pushButton,&QPushButton::clicked,[=](){

        posX+=20;
        //如果要手动调用绘图事件 用update更新
        update();
    });

    QTimer * timer = new QTimer(this);
    timer->start(10);

    connect(timer,&QTimer::timeout,[=](){
        posX++;
        update();
    });

}

void Widget::paintEvent(QPaintEvent *)
{
//    //实例化画家对象  this指定的是绘图设备
//    QPainter painter(this);

//    //设置画笔
//    QPen pen(QColor(255,0,0));
//    //设置画笔宽度
//    pen.setWidth(3);
//    //设置画笔风格
//    pen.setStyle(Qt::DotLine);
//    //让画家 使用这个笔
//    painter.setPen(pen);


//    //设置画刷
//    QBrush brush(Qt::cyan);
//    //设置画刷风格
//    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));

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






    //////////////////////////////高级设置 ///////////////////////////////

//    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));

//    //移动画家
//    painter.translate(100,0);

//    //保存画家状态
//    painter.save();

//    painter.drawRect(QRect(20,20,50,50));

//    painter.translate(100,0);

//    //还原画家保存状态
//    painter.restore();

//    painter.drawRect(QRect(20,20,50,50));



    /////////////////////////////////利用画家 画资源图片 ///////////////////
     QPainter painter(this);
     QPixmap pix = QPixmap(":/Image/Luffy.png");

    //如果超出屏幕 从0开始
     if(posX >= this->width())
     {
         posX = -pix.width();
     }

     painter.drawPixmap(posX,0,pix);


}

Widget::~Widget()
{
    delete ui;
}
//wdget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();


    //绘图事件
    void paintEvent(QPaintEvent *);

    int posX = 0;

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

5    QPaintDevice绘图设备

  • QPixmap QImage  QBitmap(黑白色) QPicture  QWidget
  • QPixmap 对不同平台做了显示的优化
  • QPixmap pix( 300,300)
  • pix.fill( 填充颜色 )
  • 利用画家 往pix上画画  QPainter painter( & pix)
  • 保存  pix.save( “路径”)
  • Qimage 可以对像素进行访问
  • 使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
  • 其他流程和QPixmap一样
  • 可以对像素进行修改 img.setPixel(i,j,value);
  • QPicture  记录和重现 绘图指令
  • QPicture pic
  • painter.begin(&pic);
  • 保存 pic.save( 任意后缀名 )
  • 重现 利用画家可以重现painter.drawPicture(0,0,pic);
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
#include <QPicture>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

//    //Pixmap绘图设备 专门为平台做了显示的优化
//    QPixmap pix(300,300);

//    //填充颜色
//    pix.fill(Qt::white);

//    //声明画家
//    QPainter painter(&pix);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150) , 100,100);
//    //保存
//    pix.save("E:\\pix.png");



    //QImage 绘图设备  可以对像素进行访问
//    QImage img(300,300,QImage::Format_RGB32);
//    img.fill(Qt::white);

//    QPainter painter(&img);
//    painter.setPen(QPen(Qt::blue));
//    painter.drawEllipse(QPoint(150,150) , 100,100);

//    //保存
//    img.save("E:\\img.png");


    //QPicture 绘图设备  可以记录和重现 绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);  //开始往pic上画
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150,150) , 100,100);
    painter.end(); //结束画画

    //保存到磁盘
    pic.save("E:\\pic.zt");

}

//绘图事件
void Widget::paintEvent(QPaintEvent *)
{

//    QPainter painter(this);

//    //利用QImage 对像素进行修改
//    QImage img;
//    img.load(":/Image/Luffy.png");

//    //修改像素点
//    for(int i = 50 ;i < 100 ; i++)
//    {
//        for(int j = 50 ; j < 100;j++)
//        {
//            QRgb value = qRgb(255,0,0);
//            img.setPixel(i,j,value);
//        }
//    }

//    painter.drawImage(0,0,img);


    QPainter painter(this);
    //重现QPicture的绘图指令
    QPicture pic;
    pic.load("E:\\pic.zt");
    painter.drawPicture(0,0,pic);

}


Widget::~Widget()
{
    delete ui;
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    //绘图事件
    void paintEvent(QPaintEvent *);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

6    QFile 对文件进行读写操作

  • QFile进行读写操作
  • QFile file( path 文件路径)
  • file.open(打开方式) QIODevice::readOnly
  • 全部读取  file.readAll()   按行读  file.readLine()  atend()判断是否读到文件尾
  • 默认支持编码格式 utf-8
  • 利用编码格式类 指定格式 QTextCodeC
  • QTextCodec * codec = QTextCodec::codecForName("gbk");
  • ui->textEdit->setText( codec->toUnicode(array)  );
  • 文件对象关闭 close
  •  写

           1)  file.open( QIODevice::writeOnly  / Append)

           2)  file.write(内容)

           3)  file.close 关闭

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
#include <QTextCodec>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //点击选取文件按钮,弹出文件对话框

    connect(ui->pushButton,&QPushButton::clicked,[=](){

        QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop");
        //将路径放入到lineEdit中
        ui->lineEdit->setText(path);

        //编码格式类
        //QTextCodec * codec = QTextCodec::codecForName("gbk");

        //读取内容 放入到 textEdit中
        // QFile默认支持的格式是 utf-8
        QFile file(path); //参数就是读取文件的路径
        //设置打开方式
        file.open(QIODevice::ReadOnly);

        //QByteArray array = file.readAll();

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

        //将读取到的数据 放入textEdit中
        ui->textEdit->setText(array);
        //ui->textEdit->setText( codec->toUnicode(array)  );

        //对文件对象进行关闭
        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");
    });

}

Widget::~Widget()
{
    delete ui;
}

ui

7   QFileInfo 读取文件信息

  • QFileInfo info(路径)
  • 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");
posted @ 2021-03-25 22:55  strive-sun  阅读(51)  评论(0编辑  收藏  举报