画过图的都知道,我们常常用颜色的深浅来表示值的大小,在Matlab作图中,我们使用的是colorbar这个函数来给出颜色的直观参考。下面给出Matlab的示例:在Matlab命令窗口输入:

figure
surf(peaks)
colorbar

可以得到的图像如下:

通过右击该颜色栏,可以选择不同的颜色,当选择jet后,可以得到如下的图像:

那上面的示例来说,使用颜色栏的好处是可以显示四维信息,例如(x,y,z)表示了一个三维空间的坐标,坐标点温度的大小则可以通过颜色栏的温度来表明。当然,要说明的是这里的温度值的大小和高度z的值是相同的,这个例子没举好,若要画四维图可以自行百度。

上面讲了Matlab如何运用颜色栏以及其好处,下面我们看看如何在Qt中绘制颜色条。本以为Qt中也有类似的函数,可以我没有找到(如果谁知道,可以告知我),只好自己写函数实现了。关于Qt中最基本的使用QPaint画图我就不介绍了,网上也有很多教程。程序中我只是将Matlab中Colorbar常用的四种颜色栏(Gray,Jet,Hsv,Hot)进行了绘制。绘制过程只使用到了简单的fillRect函数来画填充四边形。下面主要讲讲颜色的设置:
我们首先在上面Matlab的Colorbar上右击选择一个你希望绘制的颜色栏(假设选择了jet),然后选择“打开颜色图编辑器”,得到如下界面:

将鼠标放在颜色上,就可以得到对应的RGB、HSV的值。然后在Qt中就可以通过程序描绘这种值的变化,就可以得到与之相同的颜色栏了。注意:在程序中,你可以任意选择RGB或HSV来描述,我在程序中,两种方式都用到了。

为了方便,我将工程放着一个.cpp文件中,因此只需要建立一个空的Qt项目然后添加下面的.cpp文件就可以了,具体的程序实现如下:
#include <QApplication>
#include <QWidget>
#include <QPainter>

class PainterWidget : public QWidget
{
    protected:
    void paintEvent(QPaintEvent*);
};

void PainterWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QColor color;
    QRect section;
    float colorBarLength=343.0;//设置颜色条的长度

    //------设置为gray颜色条---------//
    for(int i=0;i<=colorBarLength;i++)// gray
    {
       //color.setRgbF(i/colorBarLength,i/colorBarLength,i/colorBarLength);//也可以使用这种方法
       color.setHsv(0,0,(colorBarLength-i)/colorBarLength*255);
        section.setRect(150,50+i*1,20,1);
        painter.fillRect(section,color);
    }

    //------设置为jet颜色条---------//
    float tempLength=colorBarLength/4;
    for(int i=0;i<tempLength/2;i++)// jet
    {
        color.setRgbF(0,0,(tempLength/2+i)/tempLength);
        section.setRect(200,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    for(int i=tempLength/2+1;i<tempLength/2+tempLength;i++)// jet
    {
        color.setRgbF(0,(i-tempLength/2)/tempLength,1);
        section.setRect(200,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    for(int i=tempLength/2+tempLength+1;i<tempLength/2+2*tempLength;i++)// jet
    {
        color.setRgbF((i-tempLength-tempLength/2)/tempLength,1,(tempLength*2+tempLength/2-i)/tempLength);
        section.setRect(200,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    for(int i=tempLength/2+2*tempLength+1;i<tempLength/2+3*tempLength;i++)// jet
    {
        color.setRgbF(1,(tempLength*3+tempLength/2-i)/tempLength,0);
        section.setRect(200,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    for(int i=tempLength/2+3*tempLength+1;i<colorBarLength;i++)// jet
    {
        color.setRgbF((colorBarLength-i+tempLength/2)/(tempLength),0,0);
        section.setRect(200,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    //------设置为hsv颜色条---------//
    for(int i=0;i<=colorBarLength;i++)// hsv
    {
        color.setHsvF(i/colorBarLength,1,1);
        section.setRect(250,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    //------设置为hot颜色条---------//
    tempLength=colorBarLength/2.5;
    for(int i=0;i<tempLength/2;i++)// hot
    {
        color.setRgbF((tempLength/2+i)/tempLength,0,0);
        section.setRect(300,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    for(int i=tempLength/2+1;i<tempLength/2+tempLength;i++)// hot
    {
        color.setRgbF(1,(i-tempLength/2)/tempLength,0);
        section.setRect(300,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }

    for(int i=tempLength/2+tempLength+1;i<colorBarLength;i++)// hot
    {
        color.setRgbF(1,1,(i-tempLength/2-tempLength)/(colorBarLength-tempLength/2-tempLength+20));
        section.setRect(300,colorBarLength+50-i*1,20,1);
        painter.fillRect(section,color);
    }
    //---------设置边框--------------//
    //刻度值的绘制可以自己设计,使用drawText函数即可,刻度的绘制可以使用drawLine函数
    painter.setPen(Qt::black);
    painter.drawRect(150,50,20,colorBarLength);
    painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
    painter.drawText(150,40,QStringLiteral("Gray"));

    painter.drawRect(200,50,20,colorBarLength);
    painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
    painter.drawText(200,40,QStringLiteral("Jet"));

    painter.drawRect(250,50,20,colorBarLength);
    painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
    painter.drawText(250,40,QStringLiteral("Hsv"));

    painter.drawRect(300,50,20,colorBarLength);
    painter.setFont(QFont(QString::fromLocal8Bit("宋体"),10,-1,false));
    painter.drawText(300,40,QStringLiteral("Hot"));
   // painter.drawText(150,320,QStringLiteral(" 0"));
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    PainterWidget pWidget;
    pWidget.setWindowTitle("ColorTest");
    pWidget.resize(500, 500);
    pWidget.show();
    return app.exec();
}


运行结果如下图:




原文:http://blog.csdn.net/tengweitw/article/details/44957601

作者:nineheadedbird

【Qt编程】设计ColorBar颜色栏的更多相关文章

  1. 零基础学QT编程

    吴迪.2010.1 北京航空航天大学出版社   Qt资源 CSDN QT http://bbs.csdn.net/forums/Qt/ QT编程网 http://www.qtbcw.com/ 编程论坛 ...

  2. QT Desinger设计窗体应用程序框架

    目录 目录 前言 系统软件 QT Designer Using QT Designer Open QTDesigner Tool Widget Box QT Designer的布局 属性栏 示例 i ...

  3. qt编程入门

    面对qt编程,必须先知道qt中常用的类: QPushButton按钮类.QLabel标签类.QMessageBox对话框类.QCheckBox.QAction.QMenu.QStatusBar.QTo ...

  4. Visual Studio下Qt编程中对中文的处理

    Visual Studio下Qt编程中对中文的处理 本文为原创文章,原文地址http://www.cnblogs.com/c4isr/p/qt_develop_in_vs.html Visual St ...

  5. QT笔记(1)--QT编程环境搭建

    一.QT简介 Qt  是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框架,使用特殊 ...

  6. Qt编程学习网站

    http://blog.csdn.net/k122769836/article/details/8637677 QT - little_su - 博客频道 - CSDN.NET Qt - 1+1=2 ...

  7. 调色板类QPalette——包含了Qt窗口不见的颜色组(collor group),和Windows右键属性外观非常类似

    QPalette类包含了Qt窗口不见的颜色组(collor group); 1.Active组,该组的颜色用户当前活动的(active)窗口,即具有键盘或鼠标焦点的窗口; 2.Inactive组,该组 ...

  8. 在windows下的QT编程中的_TCHAR与QString之间的转换

    由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef ...

  9. IT第十天 - String和StringBuffer的比较、编程设计技巧整理、本周总结 ★★★

    IT第十天 上午 String 1.String在进行多次的+扩展时,会严重的降低处理效率,因为String长度是不可变的,在进行+运算改变字符串时,会自动创建很多临时字符串,并不是在原字符串上追加, ...

随机推荐

  1. JDK、JRE和JVM的关系

    JDK中包含了JRE,JRE中包含了JVM. 详解: JDK是JAVA的核心,包括JRE(JAVA 虚拟环境).编译器等,JDK的主流产品是由SUN公司开发的,JDK本身是用JAVA编写的,安装包的S ...

  2. JBOSS EAP实战(1)

    JBOSS的诞生 1998年,在硅谷SUN公司的SAP实验室,一个年轻人正坐在电脑前面思考,然后写着什么东西.不,他没有在写程序,他在写辞呈.他正在做出人生的一个重大决定:他要辞掉在SUN的这份工作, ...

  3. Eclipse简介和使用技巧快捷方式

    1Eclipse简介和使用 IDE(Integrated Development Environment ): 集成开发环境,集合开发.运行.调试于一体的一个软件 Eclipse 是一个开放源代码的. ...

  4. PHP学习(1)——我为什么要学PHP

    PHP简介 PHP是一种服务器端的脚本语言,特别适合做web开发.高效.灵活.实用是PHP的特点.PHP最开始是Personal Home Page的缩写,后来正式更名为了"PHP:Hype ...

  5. Dynamics CRM2016 Web API之更新记录

    本篇继续探索web api,介绍如何通过web api更新记录. 下面是一段简单的更新代码,更新了几个不同类型的字段,entity的赋值和前篇创建时候的一样的. var entity = {}; en ...

  6. x264源代码简单分析:编码器主干部分-2

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. openfire环境搭建

    1.下载源代码:http://www.igniterealtime.org/downloads/source.jsp 2.把源代码解压出的openfire_src文件夹放至eclipse workpl ...

  8. Unity插件 - MeshEditor(七)变形动画骨骼及蒙皮

    MeshAnimation在物体的顶点比较多的情况下,悲剧是显而可见的,我一个一个的点选顶点肯定得累死,而且对于形态的调控不是很方便,应该说是很麻烦,要知道,骨骼动画因为有了骨骼以及蒙皮信息而有了灵魂 ...

  9. Erlang 集群互连测试

    Erlang 集群互连测试Erlang节点相同cookie全互联成为一个集群(cluster).如果2个集群不同cookie, 然后其中有节点连接到对方集群的节点,这2个集群会合并成一个集群吗?连接到 ...

  10. 自定义圆角透明的Dialog

    自定义圆角透明的Dialog 说明 系统默认的Dialog默认是背景不透明的,有时候项目需要Dialog为圆角透明,这个时候的解决方案就是---重写Dialog - 系统样式 - 自定义以后的样式 自 ...