zoukankan      html  css  js  c++  java
  • QT

    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");
  • 相关阅读:
    如果你想开发一个应用(1-17)
    如果你想开发一个应用(1-16)
    如果你想开发一个应用(1-15)
    0079 Ehcache 3.x应用入门及通过JCache与Spring整合
    0078 Java与MySQL时间戳传递/存储/协调问题--userLegacyDatetimeCode--userTimezone--serverTimezone
    0077 web.xml中配置Spring MVC时,Servlet-name上报Servlet should have a mapping的错误
    0076 判断回文串
    0075 字符串的反转
    0074 几道面试题
    0073 javacTask: 源发行版 1.8 需要目标发行版 1.8
  • 原文地址:https://www.cnblogs.com/strive-sun/p/14579800.html
Copyright © 2011-2022 走看看