1,如果在窗口绘图,必须放在绘图时间里实现。窗口需要重新绘图的时候,绘图事件内部自动调用。
创建画家对象语法:QPainter p(Device *);
使用对象p来调用各种画图的方法。
QT画图代码如下:
void Widget::paintEvent(QPaintEvent *){
QPainter p(this);
//绘图操作 p.drawxxx();
//画背景图
p.drawPixmap(0, 0, this->width(), this->height(), QPixmap("../123.jpg"));
//定义画笔
QPen pen;
pen.setWidth(5);//设置线宽
pen.setColor(Qt::red);//也可以使用RGB进行设置,QColor(14, 15, 16)
pen.setStyle(Qt::DashLine);//设置风格
//把画笔交给画家
p.setPen(pen);
//创建画刷对象,用于填充封闭区域
QBrush brush;
brush.setColor(Qt::blue);
brush.setStyle(Qt::Dense1Pattern);//设计样式
p.setBrush(brush);
//画直线 drawRect()画矩形
p.drawLine(50, 50, 150, 50);//前面两个是起点坐标,后面两参数是终点坐标
p.drawLine(50, 50, 50, 150);
p.drawRect(150, 150, 100, 50);
}
2,1 中的代码是自动刷新的,如果需要手动更新窗口,需要调用update(),一调用update()函数就会调用画图事件函数。
3,QPixmap和QBitmap
QBitmap是继承于QPixmap。QBitmap这有两种颜色,黑白;QPixmap可以有彩色图片。
4,绘图设备
常用的有三种QPixmap,QImage,QPicture,它们都是要在窗口上绘图的,三种绘图的语法一模一样,区别如下。
QPixmap:针对屏幕进行优化了,但是和平台相关,最常用。
QImage:和平台无关,可以对图片进行修改,即对图片中的像素点进行操作setPixel(),在线程中绘图。
QPicture:保存绘图的状态(保存为二进制文件)
使用语法如下:
QPixmap pixmap(400, 300);
QPainter p(&pixmap);//定义画家,并设置绘图设备
p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.jpg"));
pixmap.save("../pixmap.png");//把画好的图保存,不在窗口上绘图
QPixmap可以和QImage相互转化,QImage tempImage = pixmap.toImage();pimap是QPixmap的对象;
QPixmap tempPixmap = QPixmap::fromImage(image);//QImage转成QPixmap
5,不规则窗口
使用setWindowFlags(Qt::FramelessWindowHint | windowFlags())去掉边框。以及设计不规则窗口的移动与关闭。
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//去窗口边框,经过这两步会把关闭的地方取消,也不能移动,需要重写鼠标事件
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
//把窗口背景设置为透明
setAttribute(Qt::WA_TranslucentBackground);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *e)
{
QPainter p(this);
p.drawPixmap(0, 0, QPixmap("../123.jpg"));
}
void Widget::mousePressEvent(QMouseEvent *e)
{
if(e -> button() == Qt::RightButton){
close();
}else if(e -> button() == Qt::LeftButton){
//求坐标差值
//当前点击坐标-窗口左上角坐标
//e -> globalPos()是当前点的坐标
p = e -> globalPos() - this->frameGeometry().topLeft();
}
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
if(e -> buttons() & Qt::LeftButton){
move(e ->globalPos() - p);
}
}
6,Qt中的IO结构
箭头表示的是继承关系,有箭头的一方是父类,没有箭头的一方是子类。
读文件伪代码如下:
QString path = QFileDialog::getOpenFileName(父对象指针, 操作, 路径, 文件格式)
QFile file(path);//文件对象
bool isOk = file.open(打开方式);//打开文件,返回值来判断打开是否成功
if(isOk == true){
QByteArray array = file.readAll();//读文件,默认识别的是utf8的编码
ui -> textEdit -> setText(QString(array));//显示到编辑区
}
file.close(); //关闭文件
写文件伪码如下:
QString path = QFileDialog path = QFileDialog::getSaveFileName(父对象指针, 操作类型,文件路径, 文件格式)
if(path.isEmpty() == false){
QFile file; //创建文件对象
file.setFileName(path);//关联文件名字
//打开文件,只写方式
bool isOk = file.open(QIODevice::WriteOnly);
if(isOk == true){
QString str = ui -> textEdit -> toPlainText();//获取编辑区内容
file.write(str.toUtf8());//写文件,QString -> QByteArray()
}
file.close();
}
注意toUtf8是转成中文编码,toLocal8Bit是转成本地编码
使用类QFileInfo就可以获取文件信息,包括文件名字,文件后缀,文件大小,文件创建时间等。
使用类QDataStream就可以使用二进制流的方式来操作,保存的方式也是二进制文件,看不懂没关系,只要计算机可以看懂就可 以,可以取出来让自己算看懂就可以。QDataStream stream(&file);//创建数据流,和file文件关联;往数据流中写数据,相当于往文件里写数据。
使用类QTextStream就可以使用文本的方式操作,QTextStream stream(&file);//创建文本流,和file文件关联;往文本流中写数据,相当于往文件里写数据。最好让读写所设置的编码一样。
使用类QBuffer就可以内存的方式操作,QBuffer memFile;//创建内存文件,这是写到缓冲区里面。