目录
前言:

一,绘图设备
QPixmap:针对屏幕进行优化了,和平台相关,不能对图片进行修改
QImage:和平台无关,可以对图片进行修改,在线程中绘图
QPicture:保存绘图的状态(二进制文件)
三者用法一样
QPixmap
ui->setupUi(this);
//绘图设备 400*300
QPixmap pixmap(400,300);
QPainter p(&pixmap);
//填充白色背景色
p.fillRect(0,0,400,300,QBrush(Qt::white));
p.drawPixmap(0,0,QPixmap("../Image/meme_kuku.jpg"));
//保存图片
pixmap.save("../pixmap.png");
QImage
ui->setupUi(this);
//创建一个绘图设备,QImage::Format_ARGB32背景是透明
QImage image(500,500,QImage::Format_ARGB32);
QPainter p;
p.begin(&image);
//绘图
p.drawImage(0,0,QImage("../Image/meme_think3.png"));
//绘图设备前50个像素点进行操作
for(int i = 0;i<50;i++)
{
for(int j = 0;j<50;j++)
{
image.setPixel(QPoint (i,j),qRgb(0,255,0));
image.pixel(QPoint(i,j));
}
}
p.end();
image.save("../image.png");
QPicture
//widget.h
protected:
void paintEvent(QPaintEvent *);
/widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPicture picture;
QPainter p;
p.begin(&picture);
p.drawPixmap(0,0,80,80,QPixmap("../Image/meme_kuku.jpg"));
p.drawLine(50,50,150,150);
p.end();
//保存的是二进制文件
picture.save("../picture.png");
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
QPicture pic;
pic.load("../picture.png");//加载文件
QPainter p(this);
p.drawPicture(0,0,pic);
}
QPixmap->QIamge转换
QPainter p(this);
QPixmap pixmap;
pixmap.load("../Image/meme_kuku");
//QPixmap->QIamge
QImage tempImage= pixmap.toImage();
p.drawImage(0,0,tempImage);
QImage image;
image.load("../Image/meme_kuku");
QPixmap tempPixmap = QPixmap::fromImage(image);
p.drawPixmap(100,0,tempPixmap);
不规则窗口
///widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void paintEvent(QPaintEvent *);
void mouseMoveEvent(QMouseEvent *e)override;
void mousePressEvent(QMouseEvent *e)override;
private:
Ui::Widget *ui;
QPoint p ;
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//去窗口边框
//获取当前窗口的窗口标志
QFlags<Qt::WindowType> flags = Qt::FramelessWindowHint;
//添加 windowFlags 标志
flags |= windowFlags();
//设置新的窗口标志
setWindowFlags(flags);
// setWindowFlag ( Qt::FramelessWindowHint | windowFlags() );
//setWindowFlag() 函数期望一个单个的 Qt::WindowType 值,而不是一个 QFlags
//Qt::FramelessWindowHint 是一个独立的 Qt::WindowType 值
//把窗口背景设置为透明
setAttribute(Qt::WA_TranslucentBackground);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.drawPixmap(0,0,QPixmap("../Image/meme_think3.png"));
}
void Widget::mousePressEvent(QMouseEvent *e )
{
if( e -> button() ==Qt::RightButton)
{
//如果是右键
close();
}
else if (e -> button()==Qt::LeftButton)
{
//求坐标差值
//当前点击坐标-窗口左上角坐标
p = e -> globalPos() - this -> frameGeometry().topLeft();
}
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
move(e->globalPos() - p);
}
二,QFile
QFile读文件
//读文件
void Widget::on_pushButton_clicked()
{
QString path = QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");
if (path.isEmpty() == false)
{
//文件对象
QFile file(path);
//打开文件,只读方式
bool isOK = file.open(QIODevice::ReadOnly);
if(isOK == true)
{
# if 0
//读文件,默认只识别UTF-8编码,
QByteArray array = file.readAll();
//显示到编辑区
//ui->textEdit->setText(QString(array));
ui->textEdit->setText(array);//等同
#endif
QByteArray array;
while(file.atEnd()==false)
{
//读一行
array += file.readLine();
}
ui->textEdit->setText(array);
}
//关闭文件
file.close();
}
}
QFile写文件
//保存文件
void Widget::on_pushButton_2_clicked()
{
QString path = QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
if(path.isEmpty() == false)
{
QFile file;//创建文件对象
//关联文件名字
file.setFileName(path);
//打开文件,只写方式
bool isOK = file.open(QIODevice::WriteOnly);
if(isOK == true)
{
//获取编辑区内容
QString str = ui->textEdit->toPlainText();
//写文件
//QString -> QByteArray
//file.write(str.toUtf8());
//QString -> string -> char*
file.write(str.toStdString().data());
//转换本地平台编码
file.write(str.toLocal8Bit());
//QString -> QByteArray
QString buf = "123";
QByteArray a = buf.toUtf8(); //中文
a = buf.toLocal8Bit(); //本地编码
//QByteA -> char *
char *b = a.data();
//char * -> QString
char *p = "abc";
QString c = QString(p);
}
file.close();
}
}
QFile获取文件信息
//获取文件信息
QFileInfo info(path);
qDebug() << "文件名字:" << info.fileName().toUtf8().data();
qDebug() << "文件后缀:" << info.suffix();
qDebug() << "文件大小:" << info.size();
qDebug() << "文件创建时间:" << info.created().toString("yyyy-MM-dd hh:mm:ss");//2024-01-04 15:47:00
QDataStream读写文件
通过二进制的方式操作文件
写文件
///widget.h/
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void writeData();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
///widget.cpp/
#include "widget.h"
#include "ui_widget.h"
#include <QDataStream>
#include <QFile>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
writeData();
}
Widget::~Widget()
{
delete ui;
}
void Widget::writeData()
{
//创建文件对象
QFile file("../test.txt");
//打开文件,只写方式打开
bool isOK = file.open(QIODevice::WriteOnly);
if(true == isOK)
{
//创建数据流,和file文件关联
//往数据流中输入数据,相当于往文件里写数据
QDataStream stream(&file);
stream << QString ("打开文件,只写方式打开") <<250;
file.close();
}
}
此时还是乱码,无法读取
读文件
记得在.h声明函数
//.cpp//
//
#define cout qDebug() << "[" << __FILE__ << ";" << __LINE__ << "]"
//
void Widget::readData()
{
//创建文件对象
QFile file("../test.txt");
//打开文件,只读方式打开
bool isOK = file.open(QIODevice::ReadOnly);
if(true == isOK)
{
//创建数据流,和file文件关联
//往数据流中输入数据,相当于往文件里写数据
QDataStream stream(&file);
//读的时候,按写的顺序取数据
QString str;
int a;
stream >>str >> a;
//qDebug() << str.toUtf8().data() << a;
cout << str.toUtf8().data() << a;
file.close();
}
}
#define cout qDebug() << "[" << __FILE__ << ";" << __LINE__ << "]"
QTextStream操作文件
写文件
void Widget::writeData()
{
QFile file;
file.setFileName("../demo.txt");
bool isOK = file.open(QIODevice::WriteOnly);
if(true == isOK)
{
QTextStream stream(&file);
stream << QString ("创建数据流,和file文件关联") << 250;
file.close();
}
}
//指定编码
stream.setCodec("UTF-8");
读文件
错误读文件方式
.h声明 .cpp调用
void Widget::readData()
{
QFile file;
file.setFileName("../demo.txt");
bool isOK = file.open(QIODevice::ReadOnly);
if(true == isOK)
{
QTextStream stream(&file);
//指定编码,什么编码写就什么编码读
stream.setCodec("UTF-8");
QString str;
int a ;
stream >> str >> a;
cout << str.toUtf8().data() <<a;
file.close();
}
}
不推荐
推荐方法
void Widget::on_pushButton_clicked()
{
QString path = QFileDialog::getOpenFileName(this,"open","../");
if(false == path.isEmpty())
{
QFile file;
file.setFileName(path);
bool isOK = file.open(QIODevice::ReadOnly);
if(true == isOK)
{
QTextStream stream(&file);
//指定编码,什么编码写就什么编码读
stream.setCodec("UTF-8");
QString str = stream.readAll();
ui-> textEdit ->setText(str);
}
}
}
QBuffer操作文件
#include "widget.h"
#include "ui_widget.h"
#include <QBuffer>//内存文件
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QBuffer memFile;//创建内存文件
memFile.open(QIODevice::WriteOnly);
memFile.write("111111111111");
memFile.write("22222222222222222222");
memFile.close();
qDebug() << memFile.buffer();
}
Widget::~Widget()
{
delete ui;
}
QByteArray array;
QBuffer memFile(&array);//创建内存文件
memFile.open(QIODevice::WriteOnly);
memFile.write("111111111111");
memFile.write("222222222222");
memFile.close();
qDebug() << memFile.buffer();
qDebug() << "array" << array;
QByteArray array;
QBuffer memFile(&array);//创建内存文件
memFile.open(QIODevice::WriteOnly);
memFile.write("111111111111");
memFile.write("222222222222");
memFile.close();
qDebug() << memFile.buffer();
qDebug() << "array" << array;
QBuffer memFile1;
memFile1.open(QIODevice::WriteOnly);
QDataStream stream(&memFile1);
stream << QString("测试") <<250;
memFile1.close();
qDebug() <<memFile1.buffer();
memFile1.open(QIODevice::ReadOnly);
QDataStream in;
in.setDevice(&memFile1);
QString str;
int a;
in >> str >> a;
memFile1.close();
qDebug() << str.toUtf8().data() << a;