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. javascript数据结构与算法 零(前记+前言)

    前记 这本书Data Structure and Algorithm with Javascript 我将其翻译成<< javascript 数据结构和算法>> 为什么这么翻译 ...

  2. 在深入分析:Fragment与Activity一些互动的方式(一,使用Handler)

    在这里,我不再具体介绍了编写更传统的方式,比如静态变量,静态方法.持久性,application全局变量.发送和接收广播等等.. 首先让我们介绍使用Handler实现Fragment与Activity ...

  3. Java中如何拼接sql或者其他含有变量语句

    本原则是个人感悟(不保证完全正确) 第一条原则,首先将一条完整的字符串写好.(例如是"select * from users where id=(id+1)") 凡是变量都需要在其 ...

  4. Unity UGUI——Rect Transform包裹(Anchor Presets)

    Anchor Presets使用演示样品物业 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5a6L5L2T/fonts ...

  5. 给定正整数n,计算出n个元素的集合{1,2,....,n}能够划分为多少个不同的非空集合

    给定正整数n,计算出n个元素的集合{1,2,....,n}能够划分为多少个不同的非空集合 附源码: #include<iostream> using namespace std; int ...

  6. Bit error testing and training in double data rate (ddr) memory system

    DDR PHY interface bit error testing and training is provided for Double Data Rate memory systems. An ...

  7. Qt实用技巧:界面切换使用Dialog全屏切换

    需求 在做应用程序的过程中,需要使用界面切换,界面切换到下一个界面使用new一个界面并显示,如系统设置,相关信息展示等等. (注意:本技巧适用的条件是,主界面不需要相关的信号与槽做消息循环,因为主界面 ...

  8. matlab gabor 滤波器

    0. gabor 基本原理 1. matlab 内置对 gabor 的支持 gabor:Create Gabor filter or Gabor filter bank g = gabor(wavel ...

  9. C#中的String.Format介绍

    关键字:C# string.format作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/15/csharp-string_for ...

  10. C#中的DataGridView

    关键字:C# DataGridView作者:peterzb来源:http://www.cnblogs.com/peterzb 1.DataGridView实现课程表 testcontrol.rar 2 ...