Qt:定时器+event时间+绘图事件+文件读写

文章目录

Ⅰ.鼠标事件

1.创建一个QWidget窗口
2.创建一个MyLabel的模板

在这里插入图片描述

3.在widget.ui中添加一个label

4.将MyLabel提升

在这里插入图片描述

5.在mylabel.h文件中声明函数
1.鼠标进入函数
void enterEvent(QEvent *event);
2.鼠标离开函数
void leaveEvent(QEvent *);
3.鼠标摁下函数
void mousePressEvent(QMouseEvent *ev);
4.鼠标释放函数
void mouseReleaseEvent(QMouseEvent *ev);
5.鼠标移动函数
 void mouseMoveEvent(QMouseEvent *ev);
6.在mylabel.cpp文件中重写以上函数
1.鼠标进入函数
void MyLabel::enterEvent(QEvent *event){
    qDebug()<<"鼠标进入";
}
2.鼠标离开函数
void MyLabel::leaveEvent(QEvent *){
    qDebug()<<"鼠标离开";
}
3.鼠标摁下函数
void MyLabel::mousePressEvent(QMouseEvent *ev){
    if(ev->button() == Qt::LeftButton)
    {
        QString str = QString("鼠标摁下了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;
    }
4.鼠标释放函数
void MyLabel::mouseReleaseEvent(QMouseEvent *ev){
    QString str = QString("鼠标释放了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
    qDebug()<<str;
}

5.鼠标移动函数
void MyLabel::mouseMoveEvent(QMouseEvent *ev){
    if(ev->buttons() & Qt::LeftButton)
    {
        QString str = QString("鼠标移动了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;
    }
}
7.解释
1.arg添加
 QString str = QString("鼠标摁下了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
  • ev->x()是相对于label的左上角的横坐标
  • ev->x()是相对于label的右上角的纵坐标
  • ev->globalX()是相对于桌面屏幕左上角的横坐标
  • ev->globalY()是相对于桌面屏幕右上角的纵坐标
2.button和buttons、==和&
if(ev->button() == Qt::LeftButton)
if(ev->buttons() & Qt::LeftButton)
  • 使用button 和 ==:鼠左键只要摁下就行
  • 使用butons 和 & :只有鼠标左键摁下才行

Ⅱ.定时器

1.在widget.h文件中声明函数
void timerEvent(QTimerEvent *);
2.在widget.cpp文件中重写函数,并添加定时器
startTimer(1000);
void Widget::timerEvent(QTimerEvent * ){
        static int num = 1;
        ui->label_2->setText( QString::number(num++));
}
  • 效果:1s中刷新一次,在label中从1开始递增
3.用变量标记定时器,使两个label拥有自己的定时器
1.在widget.h文件中声明变量
int ev1;
int ev2;
2.在widget.cpp文件中定位计时器
ev1 = startTimer(1000);
ev2 = startTimer(2000);
3.使对应的定时器标记对应的label
void Widget::timerEvent(QTimerEvent * ev){

    if(ev->timerId() == ev1)
    {
        static int num = 1;
        ui->label_2->setText( QString::number(num++));
    }

    if(ev->timerId() == ev2)
    {
        static int num = 1;
        ui->label_3->setText( QString::number(num++));
    }
}
4.另外一种定时器应用方法
	QTimer * timer = new QTimer(this);

    timer->start(500);
    connect(timer, &QTimer::timeout, [=](){
        static int num = 1;
        ui->label_4->setText( QString::number(num++));
    });

    connect(ui->btn,&QPushButton::clicked,[=](){
        timer->stop();
    });

Ⅲ.event事件

1.event分发和过滤总纲

在这里插入图片描述

2.event分发
1.在mylabel.h文件中声明函数
bool event(QEvent * e);
2.在mylabel.cpp文件中实现函数
bool MyLabel::event(QEvent * e){

if(e->type() == QEvent::MouseButtonPress){
        QMouseEvent *ev = static_cast<QMouseEvent *>(e);
        QString str = QString("EVENT鼠标摁下了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;
        return true;
    }
    return QLabel::event(e);//其他事件交给父类处理
}
3.event过滤
1.在widget.h文件中声明函数
bool eventFilter(QObject * obj,QEvent * e);
2.在widget.cpp文件中实现函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
	ui->label->installEventFilter(this);//注册过滤器
}
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 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug()<<str;
            return true;
        }
    }
    return  QWidget::eventFilter(obj,e);
}

Ⅳ.绘图事件

1.基础
1.在widget.h中声明函数
void paintEvent(QPaintEvent *);
2.在widget.cpp中重写函数,实例化画家对象
void paintEvent(QPaintEvent *){
    QPainter painter(this);
}
3.画线
painter.drawLine(QPoint(0,0), QPoint(100,100));

在这里插入图片描述

4.画椭圆
painter.drawEllipse( QPoint(100,100),50,50);

在这里插入图片描述

5.画矩形
painter.drawRect(QRect(20,20,50,50));

在这里插入图片描述

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

在这里插入图片描述

7.设置画笔
1.设置画笔颜色
QPen pen(QColor(255,0,0));
painter.setPen(pen);//画家使用画笔

在这里插入图片描述

2.画笔宽度
pen.setWidth(3);

在这里插入图片描述

3.画笔风格
pen.setStyle(Qt::DotLine);

在这里插入图片描述

8.设置画刷
1.设置画刷类型
QBrush brush(Qt::cyan);
painter.setBrush(brush);//画家使用画刷

在这里插入图片描述

2.设置画刷风格
brush.setStyle(Qt::Dense6Pattern);
2.高级设置
1.抗锯齿

在这里插入图片描述

2.移动画家
painter.translate(100,0);
3.保存画家状态
painter.save();
4.还原画家状态
painter.restore();
3.手动调用绘图事件
1.画一幅画
QPainter painter(this); painter.drawPixmap(20,100,QPixmap(":/new/prefix2/image/2.jpeg"));

在这里插入图片描述

2.按钮操控画移动
  • widget.cpp文件
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

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

        posX += 2;
    });
}
void Widget::paintEvent(QPaintEvent *){
    QPainter painter(this);
    posX += 2;
    painter.drawPixmap(posX,100,QPixmap(":/new/prefix2/image/2.jpeg"));

}
  • widget.h文件
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

    void paintEvent(QPaintEvent *);

    int posX = 0;//定义一个变量
4.绘图设备
1.QPixmap
  • 设置绘图设备

    QPixmap pix(300,300);
    
  • 声明画家

    QPainter painter(&pix);
    
  • 画一个圆

    painter.setPen(QPen(Qt::green)); painter.drawEllipse(QPoint(150,150),100,100);
    pix.save(("d:\\3.png"));
    

在这里插入图片描述

  • 填充颜色

    pix.fill(Qt::white);
    

在这里插入图片描述

2. 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(("d:\\img.png"));

在这里插入图片描述

3.QPicture(可以记录和重现绘图指令)
	QPicture pic;
    QPainter painter;
    painter.begin(&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);
    QPicture pic;
    pic.load("E:\\pic.zt");
    painter.drawPicture(0,0,pic);
}

Ⅴ.文件读写

1.代码
connect(ui->pushButton, &QPushButton::clicked,[=](){
        QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\lk\\Desktop");
        ui->lineEdit->setText(path);
        QFile file(path);
        file.open(QIODevice::ReadOnly);
        QByteArray array = file.readAll();
        ui->textEdit->setText(array);
    	file.close();
});

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.编码格式
QTextCodec *codec = QTextCodec::codecForName("gbk");
ui->textEdit->setText( codec->toUnicode(array));
3.按行读
QByteArray array;
while(!file.atEnd()){
      array += file.readLine();
}
4.文件之后追加
file.open(QIODevice::Append);
file.write("啊啊啊啊啊");
file.close();
5.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");
  • 显示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKdDG9oT-1682298301847)(D:/typora/图片/image-20230424081959504.png)]

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值