【Qt编程】设计ColorBar颜色栏

画过图的都知道,我们常常用颜色的深浅来表示值的大小,在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

时间: 2024-09-18 04:47:28

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

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

前言 QT Desinger这个工具让我们可以想C#一样通过拖动组件来开发GUI应用程序.对于新手或敏捷开发而言都是一大利器,但是如果希望深入的学习QT底层代码实现的话,这当然不是一个好的选择. 系统软件 系统  Win 10 软件  PyCharm 5 Python 3.4.3 PyQt 4 QT Designer 官方手册,点这里 摘要:  Qt Designer is the Qt tool for designing and building graphical user interfa

qt-Linux下QT编程思想,工作流程

问题描述 Linux下QT编程思想,工作流程 大家好!刚入门linux,想问一下大家QT在linux中编程的大概思想是什么啊?或者说是工作流程?比如说是如何判断屏幕动作发生的或者动作发生是如何处理的?希望大家赐教 解决方案 学过qt吗,用一个星期学下,你就发现qt其实很简单,我这里有全套qt教程,可以给你,QQ1119331234需要加我 解决方案二: http://www.pudn.com/downloads562/ebook/detail2314408.html 解决方案三: QT在嵌入式L

串口通讯-qt界面设计的串口通信

问题描述 qt界面设计的串口通信 初学者求大神指教!!!如何实现通过qt界面设计,按不同的按钮,向串口发送不同的数据,例如,点击1按钮后pc会向串口发送信号1 解决方案 参考:http://blog.chinaunix.net/uid-22670933-id-1771588.htmlhttp://jingyan.baidu.com/article/72ee561a5a644ce16138df37.html 解决方案二: QT串口通信QT串口通信QT 串口通信2

qt-关于QT编程的自定义QListwidgetitem的问题,求大神

问题描述 关于QT编程的自定义QListwidgetitem的问题,求大神 !添加前是这样的图片说明 !添加后每个item都改变了 图片说明

Qt编程,Sybase数据库,编码问题!!!

问题描述 Qt编程,Sybase数据库,编码问题!!! Qt中...读取数据库数据到应用程序出现乱码,是Sybase数据库,用ODBC连接,Sybase用的字符编码是iso_1,ODBC字符编码格式不知道,求对编码格式精通的大神大牛解答,万分感谢,图片已经上传! 解决方案 Qt数据库编程Qt之数据库编程 解决方案二: http://blog.csdn.net/andkylee/article/details/5393122

纹理-d3d编程中关于颜色的问题

问题描述 d3d编程中关于颜色的问题 D3DXLoadMeshFromX(L"WYJ.X".......),我用这个函数加载了一个.x文件,然后渲染的时候用g_pd3dDevice->SetTexture(0, g_pTextures[i]);设置了纹理,但我并未用DrawSubset(i)函数将他画出,然后渲染出用D3DXCreateBox,D3DXCreateCylinder创造的正方形和柱子时,显示出合理的图像但我把WYJ.X换成lighting.x文件时,出现了而且我发现

.NET Winform登录窗体编程设计及数据库表

.NET Winform登录窗体编程设计及数据库表 : 源代码: 窗体主界面 查找学生(由于重装系统 DB丢失 所以没有数据)

vb编程设计界面,编码实现附合导线方位角闭合差的计算与分配

问题描述 vb编程设计界面,编码实现附合导线方位角闭合差的计算与分配 用VB设计界面,编码实现附合导线方位角闭合差的计算与分配.各导线边方位角的计算与显示

ADP 0.72发布 用于Web数据库编程设计

ADP是一种编程语言,用于Web数据库编程设计.它是一种脚本语言和轻量级的编程语言,它可以混合使用SQL轻松.这是很容易安装. ADP 0.72主要是修正了一些已知的错误. 作业系统: http://www.aliyun.com/zixun/aggregation/11691.html">MacOSX, Linux, Windows 下载地址: http://sourceforge.jp/projects/adp/downloads/52397/adp_src_072.tar.gz/htt