Qt 中没有专门显示图片的控件,通常我们会使用QLabel来显示图片。但是QLabel 显示图片的能力还是有点弱。比如不支持图像的缩放一类的功能,使用起来不是很方便。因此我就自己写了个简单的类。

我这个类支持三种图像显示模式,我分别称之为:FIXED_SIZE, CENTRED,AUTO_ZOOM, AUTO_SIZE。

  • FIXED_SIZE 模式下,显示的图像大小等于图像尺寸乘以缩放因子,如果控件的尺寸小于这个大小则多出的部分被裁切掉。
  • FIX_SIZE_CENTRED模式与FIXED_SIZE 模式类似,但是,显示的图像居于窗口正中。
  • AUTO_ZOOM 模式下,显示的图像大小自动适应控件窗口大小。
  • AUTO_SIZE 模式下,这个控件的尺寸等于图像尺寸乘以缩放因子。

下面是代码:

  1. #ifndef PICTUREBOX_H
  2. #define PICTUREBOX_H
  3. #include <QWidget>
  4. #include <QImage>
  5. #include <QPixmap>
  6. class PictureBox : public QWidget
  7. {
  8. Q_OBJECT
  9. public:
  10. enum PB_MODE {FIXED_SIZE, FIX_SIZE_CENTRED, AUTO_ZOOM, AUTO_SIZE};
  11. explicit PictureBox(QWidget *parent = 0);
  12. void setMode(PB_MODE mode);
  13. ~PictureBox();
  14. private:
  15. QPixmap m_pixmap;
  16. double m_scale;
  17. PB_MODE m_mode;
  18. QBrush m_brush;
  19. protected:
  20. void paintEvent(QPaintEvent * event);
  21. signals:
  22. public slots:
  23. bool setImage(QImage &image, double scale = 1.0);
  24. void setBackground(QBrush brush);
  25. };
  26. #endif // PICTUREBOX_H
  1. #include "picturebox.h"
  2. #include <QPainter>
  3. #include <QDebug>
  4. static const int IMAGE_WIDTH = 160;
  5. static const int IMAGE_HEIGHT = 120;
  6. static const QSize IMAGE_SIZE = QSize(IMAGE_WIDTH, IMAGE_HEIGHT);
  7. PictureBox::PictureBox(QWidget *parent) : QWidget(parent)
  8. {
  9. m_pixmap = QPixmap(IMAGE_SIZE);
  10. m_pixmap.fill();
  11. m_scale = 1.0;
  12. m_mode = FIXED_SIZE;
  13. m_brush = QBrush(Qt::white);
  14. }
  15. void PictureBox::setBackground(QBrush brush)
  16. {
  17. m_brush = brush;
  18. update();
  19. }
  20. void PictureBox::setMode(PB_MODE mode)
  21. {
  22. m_mode = mode;
  23. if(m_mode == AUTO_SIZE)
  24. {
  25. setFixedSize(m_pixmap.size() * m_scale);
  26. }
  27. else
  28. {
  29. setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
  30. setMinimumSize(0, 0);
  31. }
  32. update();
  33. }
  34. bool PictureBox::setImage(QImage &image, double scale)
  35. {
  36. if(image.isNull())
  37. {
  38. return false;
  39. }
  40. m_pixmap = QPixmap::fromImage(image);
  41. m_scale = qBound(0.01, scale, 100.0);
  42. if(m_mode == AUTO_SIZE)
  43. {
  44. setFixedSize(m_pixmap.size() * m_scale);
  45. }
  46. update();
  47. return true;
  48. }
  49. void PictureBox::paintEvent(QPaintEvent * event)
  50. {
  51. Q_UNUSED(event);
  52. QPainter painter(this);
  53. painter.setBackground(m_brush);
  54. painter.eraseRect(rect());
  55. double window_width, window_height;
  56. double image_width, image_height;
  57. double r1, r2, r;
  58. int offset_x, offset_y;
  59. switch (m_mode)
  60. {
  61. case FIXED_SIZE:
  62. case AUTO_SIZE:
  63. painter.scale(m_scale, m_scale);
  64. painter.drawPixmap(0, 0, m_pixmap);
  65. break;
  66. case FIX_SIZE_CENTRED:
  67. window_width = width();
  68. window_height = height();
  69. image_width = m_pixmap.width();
  70. image_height = m_pixmap.height();
  71. offset_x = (window_width - m_scale * image_width) / 2;
  72. offset_y = (window_height - m_scale * image_height) / 2;
  73. painter.translate(offset_x, offset_y);
  74. painter.scale(m_scale, m_scale);
  75. painter.drawPixmap(0, 0, m_pixmap);
  76. break;
  77. case AUTO_ZOOM:
  78. window_width = width();
  79. window_height = height();
  80. image_width = m_pixmap.width();
  81. image_height = m_pixmap.height();
  82. r1 = window_width / image_width;
  83. r2 = window_height / image_height;
  84. r = qMin(r1, r2);
  85. offset_x = (window_width - r * image_width) / 2;
  86. offset_y = (window_height - r * image_height) / 2;
  87. painter.translate(offset_x, offset_y);
  88. painter.scale(r, r);
  89. painter.drawPixmap(0, 0, m_pixmap);
  90. break;
  91. }
  92. }
  93. PictureBox::~PictureBox()
  94. {
  95. }

AUTO_ZOOM 模式下显示例子如下:

FIXED_SIZE 模式下的例子如下:

FIX_SIZE_CENTRED 模式下的例子如下:

http://blog.csdn.net/liyuanbhu/article/details/46687495

一个 Qt 显示图片的控件(继承QWidget,使用QPixmap记录图像,最后在paintEvent进行绘制,可缩放)的更多相关文章

  1. 我写的一个 Qt 显示图片的控件

    Qt 中没有专门显示图片的控件.通常我们会使用QLabel来显示图片.可是QLabel 显示图片的能力还是有点弱.比方不支持图像的缩放一类的功能.使用起来不是非常方便. 因此我就自己写了个简单的类. ...

  2. Qt 显示网页的控件

    Qt5.6以下的版本,基于QtWebkit控件Qt5.6以上的MSVC版本,基于 Chromium 的浏览器引擎 Qt WebEngineQt5.6以上的mingw 版本,只能采用QAxWidget ...

  3. Android控件之ImageView(显示图片的控件)

    一.ImageView属性: android:src = "@drawable/ic_launcher"——ImageView的内容图像(可以和android:background ...

  4. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  5. ArcGIS“一个或多个ActiveX控件无法显示...”问题的解决方案

    ArcMap启动时的一个警告信息“一个或多个ActiveX控件无法显示...”,如图 出现这种情况,有可能的原因是IE浏览器的安全选项设置被修改了.比如被手动修改过,或者被第三方系统杀毒优化软件修改了 ...

  6. Qtp中一个或多个ActiveX控件无法显示问题

    今天在使用qtp进行登陆测试的时候,发现了一个问题,现总结归纳如下: [问题] 在测试过程中,一直提醒:一个或多个ActiveX控件无法显示,原因可能是下列其中之一: 如下图所示: [解决办法] 在Q ...

  7. 关于IOS某图片添加控件,图片从相册或拍照保存后,再次进入时点击放大图无法显示的问题

    某图片添加控件: https://github.com/XZTLLQ/LQPhotoPickerDemo 问题: 标题已说明 代码块: NSArray *alAssetUrl =(NSMutableA ...

  8. Android高级图片滚动控件,编写3D版的图片轮播器

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...

  9. 一个完善的ActiveX Web控件教程

    免费打工仔:一个完善的ActiveX Web控件教程 出自Ogre3D开放资源地带   跳转到: 导航, 搜索 原作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一 ...

随机推荐

  1. UIPasteboard粘贴板:UIMenuController自定义(三)

    这篇咱总结总结自定义剪贴板的使用 其实自定义剪贴板也非常简单,无非是放开响应时间,通过UIMenuController自定义剪贴板,然后就是最关键的实现你所用的copy方法拉. 为了方便实用,我给ce ...

  2. sql server中查询结果集顺序问题

    因为优化器可能会选择并行处理,或者在多文件情况下不按“期待”顺序扫描数据,所以无法保证数据的顺序.唯一能确保顺序的只有order by. 并行处理的过程导致顺序不一致,单核上不存在并行,而双核,可能使 ...

  3. Vue中this的绑定

    之前写过一篇文章 ES6与React中this完全解惑 其实Vue也是相同的道理.在Vue的官方文档中提到: 不要在选项属性或回调上使用箭头函数,比如 created: () => consol ...

  4. 经典卷积神经网络的学习(一)—— AlexNet

    AlexNet 为卷积神经网络和深度学习正名,以绝对优势拿下 ILSVRC 2012 年冠军,引起了学术界的极大关注,掀起了深度学习研究的热潮. AlexNet 在 ILSVRC 数据集上达到 16. ...

  5. 理解React生命周期的好例子

    class App extends React.Component { static propTypes = { }; static defaultProps = { }; constructor(p ...

  6. 相关ubuntu有几个细节有用的工具系列

    前言 于Linux制,FTPserver有许多软件,我们已经成熟,像vsftpd, wu-ftp, Pure-FTPd等一下.不过该软件的安装一切,配置比较麻烦,建立个人FTPserver,仍是Pro ...

  7. idea 搭建 SpringBoot 集成 mybatis

    编译器:IDEA2018.2.3 环境:win10,jdk1.8,maven3.4 数据库:mysql 5.7 备注:截图较大,如果看不清,可以在图片上右键=>在新标签页中打开   查看高清大图 ...

  8. Parallel file system processing

    A treewalk for splitting a file directory is disclosed for parallel execution of work items over a f ...

  9. PHP正则表达式入门教程[转]

      思维导图 点击下图,可以看具体内容!     介绍          正则表达式,大家在开发中应该是经常用到,现在很多开发语言都有正则表达式的应用,比如javascript,java,.net,p ...

  10. 使用Qt installer framework制作安装包(不知道是否适合Mac和Linux?)

    一.介绍 使用Qt库开发的应用程序,一般有两种发布方式:(1)静态编译发布.这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中.其优势是简单单一,所有的依赖库都集中在一起,其缺点也很 ...