Day03总结,蝴蝶飞Demo

2025-05-04  本文已影响0人  xqiiitan

Day04 文件操作

打开文件,读写文件,关闭文件
文本流:QTextStream
数据流:QDataStream

1.自定义控件步骤:

2.绘图和绘图设备

1.画家类 QPainter 绘图设备。
1.构造函数的参数--> QPainter p(绘图设备)
2.在当前窗口中画图: QWidget派生的类,
重写paintEvent()函数,在里面使用画家类画图。

2.绘图设备:
A: QPixmap p;
p.load(路径) 加载图片。
p.drawPixmap(b);

a.专门为图像在屏幕上显示做了优化,依赖于平台。
b.主要应用于平台商的图形显示,在不同平台拥有相同的显示效果。

B: QBitmap b,是一个子类,只显示黑白色。
p.drawBitmap(b);
C: QImage 像素点阵列。
a.使用独立于硬件的绘制系统,专门为图像的像素访问做了优化。
b.可以在多线程中使用。
c.可以修改图片中的任何一个像素值。 **
D: QPicture 并不是图片,只是二进制文件,存储一些指令。
a.记录和重现QPainter的各条命令。
b.与平台无关。

3.QPixmap 和QImage 之间的相互装换。 QPixmap类提供。

a. QPixmap --> QImage: QPixmap::toImage()
b. QImage --> QPixmap:QPixmap::fromImage() //static

4. 手动更新窗口函数。

update() 自动触发paintEvent() 函数。

蝴蝶飞效果。

// widget.h

private:
    QPixmap up; // 两张图片:翅膀向上,向下。
    QPixmap down;
    bool flag; // 区分图片的
    int x; 
    int y;

// widget.cpp

// define FANGAN_1
#ifndef FANGAN_1
#include <QDesktopWidget>
#endif
//构造函数
Widget::Widget(QWidget *parent) :QWidget,
    ui(new Ui::Widget) 
{
    ui->wetupUi(this);
    this->setWIndowFlags(Qt::FramelessWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground);
    
    flag = true;
    up.load("D:\\up.png");
    down.load("D:\\down.png");
    QTimer *timer = new QTimer(this);
    timer->start(250); //定时器开启
    
#ifdef FANGAN_1
    //当前窗口最大化,计算坐标让蝴蝶在当前窗口中移动,窗口保持不动    
    connect(timer, QTimer::timeout, [=](){
        flag = !flag;
        qsrand(time(NULL)); // 事件种子
        //计算飞行路径
        x = qrand()%20 + x;
        y = qrand()%20 + y;
        if(x > width()) x=0;  //右边界出界,从左边再出来
        if(x<0) x =  width(); //左边界
        if(y > height()) y=0; //下边界 
        if(y<0) y =  height();//上边界
        update();             //刷新窗口
    });
    this->showMaximized(); // 窗口最大化,设置时间种子。
    qsrand(time(NULL));
    x = qrand() %width(); // 获取随机值
    y = qrand() %height();
#else 
    // 获取屏幕坐标,让窗口在屏幕上移动,蝴蝶在窗口中的位置不动
    connect(timer, &QTimer::timeout, [=]() {
        flag = !flag;
        // 桌面窗口指针。
        QDesktopWidget *wg = QApplication::desktop(); //静态方法
        qsrand(time(NULL));
        // 计算飞行路径,xy坐标
        x = qrand()%20 + frameGeometry().topLeft().x(); 
        y = qrand()%20 + frameGeometry().topLeft().y();
        if(x > wg->screenGeometry().right()) x=0; //右边界
        if(x < wg->screenGeometry().left()) // 左边界   
            x = wg->screenGeometry().right();
        
        if(y < wg->screenGeometry().top()) {
            y = wg->screenGeometry().bottom(); //上边界
        }
        if(y > wg->screenGeometry().bottom()) {
            y = 0; //下边界
        }
        move(x,y); // 移动窗口
        update();  //刷新窗口
    });
#endif  
}   
void Widget::paintEvent(QPaintEvent *) {
    QPainter p(this);
#ifdef FANGAN_1
    if(flag){
        p.drawPixmap(x,y, up);
    } else {
        p.drawPixmap(x,y, down);
    }       
#else 
    if(flag) { //切换图片
        p.drawPixmap(0,0, up);
    }else {
        p.drawPixmap(0,0, down);
    }
#endif
}
上一篇 下一篇

猜你喜欢

热点阅读