QT四 资源文件;绘图;绘图设备;qpixmap 和 qimage 转换;QPixmap、QBitma ...

打印 上一主题 下一主题

主题 1844|帖子 1844|积分 5542

我们如今想在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这个变乱中写带阿米
  1.     //paintEvent在很多时机都会调用,UI resize,拖动,等
复制代码
  1. void  MainWidget::paintEvent(QPaintEvent *event){
  2.     qDebug()<<"paintevent";
  3.     QPainter painter(this);
  4.     painter.drawLine(0,0,100,100);
  5.     painter.setPen(Qt::DashLine);
  6.     painter.drawRect(10, 10, 100, 400);
  7. }
复制代码
由于我们想要在当前的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。此中,

  • QPixmap专门为图像在屏幕上的表现做了优化
  • QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。
  • QImage专门为图像的像素级访问做了优化。(可能用于导航)
  • QPicture则可以记录和重现QPainter的各条下令。
那么问题是画在 QPixmap、QBitmap、QImage和 QPicture 上面能干啥?
现实上 假如是画在 QPixmap、QBitmap、QImage和 QPicture上面,我猜疑主要的作用是保存这个QPixmap、QBitmap、QImage和 QPicture,因为不表现。例子
  1. MainWidget::MainWidget(QWidget *parent)
  2.     : QWidget(parent)
  3.     , ui(new Ui::MainWidget)
  4. {
  5.     ui->setupUi(this);
  6.     QPixmap *qpixmap = new QPixmap(300,300);
  7.     qpixmap->fill(Qt::red);
  8.     QPainter painter(qpixmap);
  9.     painter.drawLine(0,0,100,100);
  10.     painter.setPen(Qt::red);
  11.     qpixmap->save("aaa.png");
  12. }
复制代码
保存后现象。我们还可以从这个保存代码中看到,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出来 这些图片
  1. void  MainWidget::paintEvent(QPaintEvent *event){
  2.     QPixmap qpixmap;
  3.     qpixmap.load(":/sanzhisongshu.png");
  4.     QPainter painter(this);//还是指定绘图设备为 qwidget
  5.     painter.drawPixmap(0,0, qpixmap);
  6. }
复制代码


有时候我们必要将 qpixmap 和 qimage 举行转换


  1.     //将 qpixmap 转换成 QImage,使用QPixmap的api
  2.     QPixmap qpixmap1;
  3.     qpixmap1.load(":/sanzhisongshu.png");
  4.     QImage qimage = qpixmap1.toImage();
  5.     //将qimage转成qpixmap,使用QPixmap的静态 api
  6. //    QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags = Qt::AutoColor)
  7. //    QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
  8.     QPixmap qpixmap2 = QPixmap::fromImage(qimage);
复制代码







免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表