Qt学习—Day4

鼠标常用事件

  1. 鼠标进入 enterEvent

  1. 鼠标离开 leaveEvent

  1. 鼠标按下 mousePressEvent

  1. 鼠标释放 mouseReleaseEvent

  1. 鼠标移动 mouseMoveEvent

现创建一个Mylabel的c++类,然后在ui中弄一个Widget提升为MyLabel,在mylabel.h中继承QLabel:

mylabel.cpp文件检测状态

#include "mylabel.h"
#include<QDebug>
#include<QMouseEvent>

MyLabel::MyLabel(QWidget *parent)
    : QLabel{parent}
{
    //设置鼠标追踪状态,设置为true就可以不点击直接移动也可以追踪位置了
    //this->setMouseTracking(true);
}

//鼠标进入
void MyLabel::enterEvent(QEnterEvent *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").arg(ev->x()).arg(ev->y());
        qDebug()<< str;
    }
}

//鼠标释放事件
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    QString str = QString(" 鼠标离开了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
    qDebug()<< str;
}

//鼠标移动事件
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
    //鼠标移动是一段距离
    if(ev->buttons() & Qt::LeftButton)
    {
        QString str = QString(" 鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
        qDebug()<< str;
    }
}

事件分发器

event事件分发器,用于分发事件,在这里也可以做拦截,返回值bool如果返回的是true代表拦截处理,不在向下分发。

//事件分发器
bool MyLabel::event(QEvent *e)
{
    if(e->type() == QEvent::MouseButtonPress)
    {
        //转换
        QMouseEvent * ev = static_cast<QMouseEvent*>(e);
        QString str = QString("在event中 鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
        qDebug()<< str;
        return true; //拦截事件,不向下分发事件
    }
    //其他事件交给父类
    return QLabel::event(e);
}

事件过滤器

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

    //利用事件过滤器 拦截label的鼠标按下事件
    //1、先给控件安装过滤器
    ui->label->installEventFilter(this);
    //2、重写过滤器事件
}

//过滤器事件
//参数一 判断控件  参数二 判断事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->label)
    {
        if(event->type() == QEvent::MouseButtonPress)
        {
            //转换
            QMouseEvent * ev = static_cast<QMouseEvent*>(event);
            QString str = QString("在事件过滤器中 鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
            qDebug()<< str;
            return true; //拦截事件,不向下分发事件
        }
        //其他事件交给父类
        return QWidget::eventFilter(watched,event);
    }
}

定时器事件QTimerEvent

事件名称:void timerEvent(QTimerEvent *event);

由于每个计时器有单独的标号,所以使用两个计时器的话就可以用标号来区分。

效果:

代码:

#include "widget.h"
#include "ui_widget.h"
#include<QTimerEvent>

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

    //启动定时器
    this->m_Id1 = startTimer(1000); //单位是毫秒

    this->m_Id2 = startTimer(2000);
}

//定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId()==m_Id1)
    {
        static int num=1;
        ui->label->setText(QString::number(num++));
    }

    if(event->timerId()==m_Id2)
    {
        static int num2=1;
        ui->label_2->setText(QString::number(num2++));
    }
}
Widget::~Widget()
{
    delete ui;
}

定时器类QTimer

这个比定时器对象更常用

效果:

代码:

   //定时器类
    QTimer * timer = new QTimer(this);
    timer->start(500);
    //监听定时器对象的信号
    connect(timer,&QTimer::timeout,[=](){
        static int num=1;
        ui->label_3->setText(QString::number(num++));
    });

补充:还可以在旁边放置一个暂停按钮,实现定时器的暂停

   //点击暂停按钮,停止定时器
    connect(ui->btn_stop,&QPushButton::clicked,[=](){
        timer->stop();
    });

基本绘图操作paintEvent

  • 重写绘图事件:void paintEvent(QPaintEvent *event);

  • 画家对象QPainter

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>

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

//重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    //要有画家
    QPainter painter(this); //this代表绘图的设备,画家向当前窗口画画

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

    //画刷 可以填充封闭的图案
    QBrush brush(Qt::cyan);
    //设置画刷风格
    brush.setStyle(Qt::Dense4Pattern);
    //画家使用画刷
    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.setFont(QFont("华文彩云",20));
    painter.drawText(QRect(0,200,300,100),"今天不能在偷懒了");
}

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

高级绘图操作

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QTimer>

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

    posX=0;
    //点击移动按钮 移动图片
    connect(ui->btn_move,&QPushButton::clicked,[=](){
        posX+=10;
        //重新画图 手动调用绘图事件
        update();
    });

    //实现自动图片向右移动 定时器
    QTimer * timer = new QTimer(this);
    timer->start(1); //时间
    connect(timer,&QTimer::timeout,[=](){
        posX++;
        update();
    });
}

//重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    //要有画家
    QPainter painter(this); //this代表绘图的设备,画家向当前窗口画画

    //高级绘图///
//    painter.drawEllipse(QPoint(200,150),100,100);

//    设置抗锯齿效果
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse(QPoint(500,150),100,100);

//    painter.drawRect(QRect(100,300,50,50));

//    painter.translate(100,0);//移动画家
//    painter.save(); //保存状态
//    painter.drawRect(QRect(100,300,50,50));

//    painter.translate(100,0);//移动画家
//    painter.restore(); //恢复状态
//    painter.drawRect(QRect(100,300,50,50));

    //画成品图案
    QPixmap pix;
    pix.load(":/Image/picture.ico");

    if(posX > this->width())
    {
        //重置
        posX = -pix.width();
    }
    painter.drawPixmap(posX,50,pix);


    //基本绘图///
//    //画笔
//    QPen pen(QColor(255,0,0));
//    //设置画笔的宽度
//    pen.setWidth(2);
//    //设置画笔的风格
//    pen.setStyle(Qt::DotLine);
//    //画家使用画笔
//    painter.setPen(pen);

//    //画刷 可以填充封闭的图案
//    QBrush brush(Qt::cyan);
//    //设置画刷风格
//    brush.setStyle(Qt::Dense4Pattern);
//    //画家使用画刷
//    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.setFont(QFont("华文彩云",20));
//    painter.drawText(QRect(0,200,300,100),"今天不能在偷懒了");
}

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

绘图设备

QImage与QPixmap的区别:

  • QPixmap主要用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的

  • QPixmap依赖于所在平台的绘图引擎,所以会有不同的显示效果,而QImage则相反

  • QImage是独立于硬件的

QPicture是一个可以记录和重现QPainter的命令的绘图设备,与平台无关,后缀名可以自定义。

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QPicture>

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

    //QPixmap做绘图设备
    QPixmap pix(300,300);
    pix.fill(Qt::white);  //填充色
    QPainter painter(&pix);
    painter.setPen(QPen(Qt::gray));
    painter.drawEllipse(QPoint(150,150),100,100);
    pix.save("D:\\pix.png");  //保存在磁盘上

    //QImage做绘图设备  专门为像素级的访问做优化
    QImage img(300,300,QImage::Format_ARGB32);
    img.fill(Qt::white);
    QPainter painter(&pix);
    painter.setPen(QPen(Qt::gray));
    painter.drawEllipse(QPoint(150,150),100,100);
    img.save("D:\\img.png");  //保存在磁盘上

    //QPicture做绘图设备 记录和重现画家的绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);

    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150,150),100,100);

    painter.end();

    pic.save("D:\\pic.zt");
}

void Widget::paintEvent(QPaintEvent *event)
{
    //重现QPicture的绘图指令
    QPainter painter(this);
    QPicture pic;
    pic.load("D:\\pic.zt");
    painter.drawPicture(0,0,pic);
}

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

文件读写QFile

#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog>  //文件对话框
#include<QMessageBox>
#include<QFile>

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

    //点击选择文件按钮,弹出文件对话框,读取桌面文件,文件路径放入到lineEdit中,内容放在TextEdit中
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        QString filePath = QFileDialog::getOpenFileName(this,"打开文件","D:\\Desktop","(*.txt)");
        //如果路径为空,即按了取消按钮
        if(filePath.isEmpty())
        {
            QMessageBox::warning(this,"警告","路径不能为空");
        }else{
            ui->lineEdit->setText(filePath);
            
            //读取文件信息
            QFile file(filePath);
            //指定打开的方式
            file.open(QIODeviceBase::ReadOnly);

            QByteArray arr;
            //arr = file.readAll(); //读取全部信息
            
            arr=file.readLine();  //读取单行数据
             while(!file.atEnd())
            {
                arr+=file.readLine();
            }

            ui->textEdit->setText(arr);
            
            //关闭文件
            file.close();
            
            //写文件
            file.open(QIODevice::WriteOnly);
            file.write("结束");
            file.close();
        }
    });
}

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

效果:

文件信息读取QFileInfo

//文件信息类
QFileInfo info(filePath);
qDebug()<<"后缀名:"<<info.suffix().toUtf8().data()<<"大小:"<<info.size()      
        <<"文件名:"<<info.fileName()<<"文件路径:"<<info.filePath();

qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy/MM/dd hh:mm:ss");

可以显示文件的信息

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值