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. DotNetty编写跨平台网络通信

    DotNetty编写跨平台网络通信 长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但 ...

  2. ANR触发原理

    ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造 ...

  3. 【32.89%】【codeforces 574D】Bear and Blocks

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. Android SDK location should not contain whitespace, as this cause problems with NDK tools

    解决方案一: The easiest solution is to move the SDK somewhere else, where there is no space or other whit ...

  5. Servlet接口的实现类,路径配置映射,ServletConfig对象,ServletContext对象及web工程中文件的读取

    一,Servlet接口实现类:sun公司为Servlet接口定义了两个默认的实现类,分别为:GenericServlet和HttpServlet. HttpServlet:指能够处理HTTP请求的se ...

  6. 探究Promise的实现

    最终答案在一个类库里,地址 https://github.com/yahoo/ypromise 这个类库也有问题,就是下面这道面试题在IE9里实现不一致,类库里还是用了setTimeout.去年尝试用 ...

  7. Less小总结

      = 导航   顶部 变量 混合 继承 函数   顶部 变量 混合 继承 函数 Less 是一个Css 预编译器,意思指的是它可以扩展Css语言,添加功能如允许变量(variables),混合(mi ...

  8. DDD实战4 实现产品仓储

    a.要实现仓储,首先要定义仓储接口.在领域层定义仓储接口,IProductRepository.cs. public interface IProductRepository { void Creat ...

  9. WPF下字体模糊的问题

    原文:WPF下字体模糊的问题 一直以来,发现WPF中的小字体下的文字变得比较模糊,比如: WPF与Winform字体显示比较: 为了看到更清楚,我们放大点显示:  放得更大些: 中文.日文等亚洲文字的 ...

  10. Leetcode dfs Combination Sum

    Combination Sum Total Accepted: 17319 Total Submissions: 65259My Submissions Given a set of candidat ...