当前位置: 首页 > article >正文

QT四 资源文件;绘图;绘图设备;qpixmap 和 qimage 转换;QPixmap、QBitmap、QImage和 QPicture的区别

我们现在想在QT的UI控件上显示一些图片,动画文件gif等,如何加载呢?

很容易想到的一种方法是从自己的电脑上load,例如我们将文件放在 D://picture/1.png 下,但是如果换了电脑,最终生成的.exe文件能正确的加载这些图片,也需要保证运行.exe的电脑上有 D://picture/1.png这个路径。

因此 QT 提供了将资源文件保存到可执行文件内部的方法

一 资源文件保存到程序内部

1.在QT项目内部添加resource 文件夹

2.将真实资源 文件(D:\resource\qt\xxx.png)加入我QT项目内的resource

改动完成后

最后add files

我们将res.qrc使用 普通文本编辑器打开,可以看到内容如下。

 可以通过“删除”按钮来删除文件或者前缀。还可以通过“Remove Missing Files”按钮来删除找不到实际文件的资源文件。

3. QT项目中使用资源

使用:前缀加载嵌入的资源

说明:实际上,使用绝对路径,相对路径,QT qrc 这几种方式都是可以的,但是考虑到移植,还是 上面我们学习的QT qrc的方式最好,从开始的时候就避免移植的时候有问题。

4. 显示动画

可以使用QLabel 的成员函数setMovie加载动画,可以播放gif格式的文件

void setMovie(QMovie * movie)

首先定义QMovied对象,并初始化:

QMovie *movie = new QMovie(":/Mario.gif");

播放加载的动画:

movie->start();

将动画设置到QLabel中:

QLabel *label = new QLabel;

label->setMovie(movie);

二 绘图

整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。

QPainter用来执行绘制的操作

QPaintEngine类应用于QPainter和QPaintDevice之间,通常对开发人员是透明的。

QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间

Qt 的绘图系统实际上是,使用QPainter在QPaintDevice上进行绘制,它们之间使用QPaintEngine进行通讯(也就是翻译QPainter的指令)。

例如:如果我们想要在当前的widget上画画,就可以在paintevent这个事件中写带阿米

    //paintEvent在很多时机都会调用,UI resize,拖动,等
void  MainWidget::paintEvent(QPaintEvent *event){
    qDebug()<<"paintevent";
    QPainter painter(this);
    painter.drawLine(0,0,100,100);
    painter.setPen(Qt::DashLine);
    painter.drawRect(10, 10, 100, 400);
}

由于我们想要在当前的QWidget上显示,因此 painter的构造函数中的填写this就行

因为qwidget也继承于QPaintDevice

QPainter(QPaintDevice *device)  // QPainter的构造方法说明:Constructs a painter that begins painting the paint device immediately.

QWidget Class

The QWidget class is the base class of all user interface objects.

Header:

#include <QWidget>

qmake:

QT += widgets

Inherits:

QObject and QPaintDevice  //QWidget的父类有 QPaintDevice

Inherited By:

QAbstractButton, QAbstractSlider, QAbstractSpinBox, QCalendarWidget, QComboBox, QDesignerActionEditorInterface, QDesignerFormWindowInterface, QDesignerObjectInspectorInterface, QDesignerPropertyEditorInterface, QDesignerWidgetBoxInterface, QDesktopWidget, QDialog, QDialogButtonBox, QDockWidget, QFocusFrame, QFrame, QGroupBox, QKeySequenceEdit, QLineEdit, QMacCocoaViewContainer, QMacNativeWidget, QMainWindow, QMdiSubWindow, QMenu, QMenuBar, QOpenGLWidget, QProgressBar, QQuickWidget, QRubberBand, QSizeGrip, QSplashScreen, QSplitterHandle, QStatusBar, QSvgWidget, QTabBar, QTabWidget, QToolBar, and QWizardPage

三 绘图设备

我们在前面 使用painter的构造方法,我们要画在this上面,由于this是qwidget,也就是我们画在了qwidget上面。绘图设备是qwidget.

画的是什么呢? painter.drawLine(0,0,100,100); --画一条线

painter.drawRect(10, 10, 100, 400); -- 画一个矩形

那么qwidget是绘图设备,继承qwidget的UI都可以是绘图设备。那么理论上几乎所有的控件都能像QWidget一样,作为 绘图设备。虽然理论上这样,但是实际开发中,只有如下的4个控件用的比较多。

Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。其中,

  1. QPixmap专门为图像在屏幕上的显示做了优化
  2. QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。
  3. QImage专门为图像的像素级访问做了优化。(可能用于导航)
  4. QPicture则可以记录和重现QPainter的各条命令。

那么问题是画在 QPixmap、QBitmap、QImage和 QPicture 上面能干啥?

实际上 如果是画在 QPixmap、QBitmap、QImage和 QPicture上面,我怀疑主要的作用是保存这个QPixmap、QBitmap、QImage和 QPicture,因为不显示。例子

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
    QPixmap *qpixmap = new QPixmap(300,300);
    qpixmap->fill(Qt::red);

    QPainter painter(qpixmap);
    painter.drawLine(0,0,100,100);
    painter.setPen(Qt::red);
    qpixmap->save("aaa.png");

}

保存后现象。我们还可以从这个保存代码中看到,qt的exe程序运行的路径是:

D:\code_qt\build-008paint-Desktop_Qt_5_14_2_MinGW_32_bit-Debug

那么如果我们的目标是显示 一张图片呢? 那么绘图设备还需要是 qwidget等可以show出来的UI。

实际上,这里学习 QPixmap、QBitmap、QImage和 QPicture的主要用法,还是通过painter的api show出来 这些图片

void  MainWidget::paintEvent(QPaintEvent *event){



    QPixmap qpixmap;
    qpixmap.load(":/sanzhisongshu.png");

    QPainter painter(this);//还是指定绘图设备为 qwidget
    painter.drawPixmap(0,0, qpixmap);

}

有时候我们需要将 qpixmap 和 qimage 进行转换

    //将 qpixmap 转换成 QImage,使用QPixmap的api
    QPixmap qpixmap1;
    qpixmap1.load(":/sanzhisongshu.png");
    QImage qimage = qpixmap1.toImage();

    //将qimage转成qpixmap,使用QPixmap的静态 api
//    QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags = Qt::AutoColor)
//    QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
    QPixmap qpixmap2 = QPixmap::fromImage(qimage);


http://www.kler.cn/a/613642.html

相关文章:

  • Golang中间件的原理与实现
  • 使用 Selenium 构建简单高效的网页爬虫
  • Docker Compose 基础知识
  • rnn的ho的维度 (num_layers * num_directions, batchsize, hidden_size)
  • 付账问题 | 第9届蓝桥杯省赛C++A组
  • Kafka 偏移量
  • 安卓车载app面经
  • 嵌入式单片机程序的映像文件解读
  • idea中如何使用git
  • git在实践使用中的操作流程
  • Java----用正则表达式爬取数据
  • SpringCloud Hystrix的用法详解
  • 【C#.NET】Web API项目Swagger配置扩展
  • vscode无法打开Terminal终端
  • 电脑连不上手机热点会出现的小bug
  • 博卡软件管理中心8:为美容美发行业量身打造的轻量级管理方案
  • swagger上传图片请求报错
  • 3.27学习总结
  • 介绍几种创意登录页(含完整源码)
  • Uniapp使用大疆SDK打包离线原生插件二