一个 Qt 显示图片的控件(继承QWidget,使用QPixmap记录图像,最后在paintEvent进行绘制,可缩放)
Qt 中没有专门显示图片的控件,通常我们会使用QLabel来显示图片。但是QLabel 显示图片的能力还是有点弱。比如不支持图像的缩放一类的功能,使用起来不是很方便。因此我就自己写了个简单的类。
我这个类支持三种图像显示模式,我分别称之为:FIXED_SIZE, CENTRED,AUTO_ZOOM, AUTO_SIZE。
- FIXED_SIZE 模式下,显示的图像大小等于图像尺寸乘以缩放因子,如果控件的尺寸小于这个大小则多出的部分被裁切掉。
- FIX_SIZE_CENTRED模式与FIXED_SIZE 模式类似,但是,显示的图像居于窗口正中。
- AUTO_ZOOM 模式下,显示的图像大小自动适应控件窗口大小。
- AUTO_SIZE 模式下,这个控件的尺寸等于图像尺寸乘以缩放因子。
下面是代码:
- #ifndef PICTUREBOX_H
- #define PICTUREBOX_H
- #include <QWidget>
- #include <QImage>
- #include <QPixmap>
- class PictureBox : public QWidget
- {
- Q_OBJECT
- public:
- enum PB_MODE {FIXED_SIZE, FIX_SIZE_CENTRED, AUTO_ZOOM, AUTO_SIZE};
- explicit PictureBox(QWidget *parent = 0);
- void setMode(PB_MODE mode);
- ~PictureBox();
- private:
- QPixmap m_pixmap;
- double m_scale;
- PB_MODE m_mode;
- QBrush m_brush;
- protected:
- void paintEvent(QPaintEvent * event);
- signals:
- public slots:
- bool setImage(QImage &image, double scale = 1.0);
- void setBackground(QBrush brush);
- };
- #endif // PICTUREBOX_H
- #include "picturebox.h"
- #include <QPainter>
- #include <QDebug>
- static const int IMAGE_WIDTH = 160;
- static const int IMAGE_HEIGHT = 120;
- static const QSize IMAGE_SIZE = QSize(IMAGE_WIDTH, IMAGE_HEIGHT);
- PictureBox::PictureBox(QWidget *parent) : QWidget(parent)
- {
- m_pixmap = QPixmap(IMAGE_SIZE);
- m_pixmap.fill();
- m_scale = 1.0;
- m_mode = FIXED_SIZE;
- m_brush = QBrush(Qt::white);
- }
- void PictureBox::setBackground(QBrush brush)
- {
- m_brush = brush;
- update();
- }
- void PictureBox::setMode(PB_MODE mode)
- {
- m_mode = mode;
- if(m_mode == AUTO_SIZE)
- {
- setFixedSize(m_pixmap.size() * m_scale);
- }
- else
- {
- setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
- setMinimumSize(0, 0);
- }
- update();
- }
- bool PictureBox::setImage(QImage &image, double scale)
- {
- if(image.isNull())
- {
- return false;
- }
- m_pixmap = QPixmap::fromImage(image);
- m_scale = qBound(0.01, scale, 100.0);
- if(m_mode == AUTO_SIZE)
- {
- setFixedSize(m_pixmap.size() * m_scale);
- }
- update();
- return true;
- }
- void PictureBox::paintEvent(QPaintEvent * event)
- {
- Q_UNUSED(event);
- QPainter painter(this);
- painter.setBackground(m_brush);
- painter.eraseRect(rect());
- double window_width, window_height;
- double image_width, image_height;
- double r1, r2, r;
- int offset_x, offset_y;
- switch (m_mode)
- {
- case FIXED_SIZE:
- case AUTO_SIZE:
- painter.scale(m_scale, m_scale);
- painter.drawPixmap(0, 0, m_pixmap);
- break;
- case FIX_SIZE_CENTRED:
- window_width = width();
- window_height = height();
- image_width = m_pixmap.width();
- image_height = m_pixmap.height();
- offset_x = (window_width - m_scale * image_width) / 2;
- offset_y = (window_height - m_scale * image_height) / 2;
- painter.translate(offset_x, offset_y);
- painter.scale(m_scale, m_scale);
- painter.drawPixmap(0, 0, m_pixmap);
- break;
- case AUTO_ZOOM:
- window_width = width();
- window_height = height();
- image_width = m_pixmap.width();
- image_height = m_pixmap.height();
- r1 = window_width / image_width;
- r2 = window_height / image_height;
- r = qMin(r1, r2);
- offset_x = (window_width - r * image_width) / 2;
- offset_y = (window_height - r * image_height) / 2;
- painter.translate(offset_x, offset_y);
- painter.scale(r, r);
- painter.drawPixmap(0, 0, m_pixmap);
- break;
- }
- }
- PictureBox::~PictureBox()
- {
- }
AUTO_ZOOM 模式下显示例子如下:
FIXED_SIZE 模式下的例子如下:
FIX_SIZE_CENTRED 模式下的例子如下:
http://blog.csdn.net/liyuanbhu/article/details/46687495
一个 Qt 显示图片的控件(继承QWidget,使用QPixmap记录图像,最后在paintEvent进行绘制,可缩放)的更多相关文章
- 我写的一个 Qt 显示图片的控件
Qt 中没有专门显示图片的控件.通常我们会使用QLabel来显示图片.可是QLabel 显示图片的能力还是有点弱.比方不支持图像的缩放一类的功能.使用起来不是非常方便. 因此我就自己写了个简单的类. ...
- Qt 显示网页的控件
Qt5.6以下的版本,基于QtWebkit控件Qt5.6以上的MSVC版本,基于 Chromium 的浏览器引擎 Qt WebEngineQt5.6以上的mingw 版本,只能采用QAxWidget ...
- Android控件之ImageView(显示图片的控件)
一.ImageView属性: android:src = "@drawable/ic_launcher"——ImageView的内容图像(可以和android:background ...
- MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)
惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...
- ArcGIS“一个或多个ActiveX控件无法显示...”问题的解决方案
ArcMap启动时的一个警告信息“一个或多个ActiveX控件无法显示...”,如图 出现这种情况,有可能的原因是IE浏览器的安全选项设置被修改了.比如被手动修改过,或者被第三方系统杀毒优化软件修改了 ...
- Qtp中一个或多个ActiveX控件无法显示问题
今天在使用qtp进行登陆测试的时候,发现了一个问题,现总结归纳如下: [问题] 在测试过程中,一直提醒:一个或多个ActiveX控件无法显示,原因可能是下列其中之一: 如下图所示: [解决办法] 在Q ...
- 关于IOS某图片添加控件,图片从相册或拍照保存后,再次进入时点击放大图无法显示的问题
某图片添加控件: https://github.com/XZTLLQ/LQPhotoPickerDemo 问题: 标题已说明 代码块: NSArray *alAssetUrl =(NSMutableA ...
- Android高级图片滚动控件,编写3D版的图片轮播器
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...
- 一个完善的ActiveX Web控件教程
免费打工仔:一个完善的ActiveX Web控件教程 出自Ogre3D开放资源地带 跳转到: 导航, 搜索 原作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一 ...
随机推荐
- 机房重构所遇问题"未能载入文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件"的解决的方法集锦
敲七层登录的时候.忽然间认为敲三层搞清的思路瞬间又凌乱了.花了一天的时间边敲边梳理,最终整完了,执行的时候弹出了这种错误:未能载入文件或程序集"DAL"或它的某一个依赖项. 系统找 ...
- 全文检索(elasticsearch入门)
Elasticsearch篇: Elasticsearch是一个采用java语言开发的,基于Lucene构造的开源,分布式的搜索引擎. 设计用于云计算中,能够达到实时搜索,稳定可靠. Elastics ...
- 关于javascript中的深拷贝问题
一直在尝试为javascript找一个快捷可靠的对象深拷贝的方法,昨天突发奇想,把对象push到一个空数组里,然后对改数组通过concat()或slice()进行拷贝,然后取出数组的第一个元素复制给变 ...
- 弄App Store提示和技巧推荐
众所周知上苹果的主页推荐是对产品最佳(高曝光率+零广告费)推广,然而苹果却对选择的方式和规则讳莫如深. 下面是搜集的一些获得推荐的开发人员的经验. 1. 产品要新颖.且质量上乘.这个质量包括非常多细节 ...
- cordova打包之android应用签名
原文:cordova打包之android应用签名 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mate_ge/article/details/78 ...
- 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图) UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式.不过,总有一些特别的情况下我们需要用到不止一个窗口 ...
- AI2XAML's Bug
原文:AI2XAML's Bug My picture is like this: I use Adobe Illustator CS to draw the outline of that, I s ...
- 跟我学ASP.NET MVC之十一:URL路由
摘要: 在MVC框架之前,ASP.NET假定在请求的URLs和服务器硬盘文件之间有直接的关系.服务器的职责是接收浏览器请求,从相应的文件发送输出. 这种方法只能工作于Web表单,每一个ASPX页面既是 ...
- 零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术
原文:零元学Expression Design 4 - Chapter 7 使用内建功能「Clone」来达成Path的影分身之术 本章所介绍的是便利且快速的内建工具Clone ? 本章所介绍的是便利且 ...
- Qt程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)
在使用Qt开发大型软件时,难免要调试程序,以确保程序内的运算结果符合我们的预期.在不符合预期结果时,就直接将程序断下,以便我们修改. 这就用到了Qt中的调试断言 - Q_ASSERT. 用一个小例子来 ...