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 模式下显演示样例子例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

FIXED_SIZE 模式下的样例例如以下:

FIX_SIZE_CENTRED 模式下的样例例如以下:

我写的一个 Qt 显示图片的控件的更多相关文章

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

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

  2. 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)

    最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...

  3. 【分享】自己写的一个可空的DateTimePicker控件-附源码

    最近这段时间在重构以前的一个项目,其中有一项就是要把DateTimePicker控件值可空.大家都知道的DateTimePicker值为DateTime类型,DateTime类型值不能等于Null.但 ...

  4. Qt 显示网页的控件

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

  5. 自己写的一个DirectUI库,基础控件基本都已实现

    http://download.csdn.net/detail/pcradio/9254881 http://blog.csdn.net/pcradio

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

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

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

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

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

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

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

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

随机推荐

  1. 实现一个在autolayout下有宽度约束后,自动确定高度的view

    我曾经遇到过一个问题:需要实现一个自定义的label(类似于UILabel),同时需要兼顾UILabel的大小自适应的特性.这个label通常宽度是固定的,通过autolayout指定其宽度约束,但不 ...

  2. Objective-c 字典对象

    oc 中的 NSDictionary 的作用同 java 中的字典类相同,提供了 “键-值”对的组合.比如,是用字典类实现对学生姓名和学号的存放,编号是一个键(唯一性),姓名是值.它的方法有: 下面通 ...

  3. ajax 上传图片 并预览

     <img {if !$article[pic]}style="display: none"{/if} width="82" height="6 ...

  4. linux cmd: ps

    每天一个linux命令(41):ps命令 http://www.cnblogs.com/peida/archive/2012/12/19/2824418.html Linux中的ps命令是Proces ...

  5. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

  6. Linux软件间的依赖关系(转)

    Linux中的软件大部分是零碎的,其粒度比windows的小很多,软件之间的依赖关系很强烈,下面是自己的一些理解: 一.Linux中的软件依赖Linux中的软件依赖关系成一颗拓扑树结构,比如A直接或间 ...

  7. 射频识别技术漫谈(23)——ISO15693的载波、调制与编码

    射频识别技术中的通讯大多是主从式,主动方一般是读写器,被动方称为“卡片”或“标签”.到底是叫“卡片”还是“标签”,好像也没有严格的区分.习惯上可以从以下4个方面界定:一是形状,卡片通常体积较大,更像“ ...

  8. 基于Visual C++2013拆解世界五百强面试题--题14-循环删除

    有一个数组a[1000]存放0-1000,要求每隔二个数删除一个数,到末尾时循环到开头继续进行,求最后一个被删掉数的原始下标. 看到题目可以用循环链表保存这些数,然后循环删除,大大减少了一些复杂的边界 ...

  9. 【剑指Offer学习】【面试题36:数组中的逆序对】

    题目:在数组中的两个数字假设前面一个数字大于后面的数字.则这两个数字组成一个逆序对.输入一个数组.求出这个数组中的逆序对的总数. 举例分析 比如在数组{7, 5, 6, 4 中, 一共存在5 个逆序对 ...

  10. vs2010经常使用快捷键

    调试快捷键 F6: 生成解决方式 Ctrl+F6: 生成当前项目 F7: 查看代码 Shift+F7: 查看窗口设计器 F5: 启动调试 Ctrl+F5: 開始运行(不调试) Shift+F5: 停止 ...