Day03总结,蝴蝶飞Demo
2025-05-04 本文已影响0人
xqiiitan
Day04 文件操作
打开文件,读写文件,关闭文件
文本流:QTextStream
数据流:QDataStream
1.自定义控件步骤:
- a.创建一个自定义控件类
- b.在要提升的控件身上,右键-> 提升为...
- c.对话框中,添加类(自定义类名称)--> 提升。
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
}