【Qt编程】设计ColorBar颜色栏

简介: 画过图的都知道,我们常常用颜色的深浅来表示值的大小,在Matlab作图中,我们使用的是colorbar这个函数来给出颜色的直观参考。下面给出Matlab的示例:在Matlab命令窗口输入: figure surf(peaks) colorbar 可以得到的图像如下: 通过右击该颜色栏,可以选择不同的颜色,当选择jet后,可以得到如下的图像: 那上面的示例来说,使用颜色栏的好处是可以显示四维信息,例如(x,y,z)表示了一个三维空间的坐标,坐标点温度的大小则可以通过颜色栏的温度来表明。
画过图的都知道,我们常常用颜色的深浅来表示值的大小,在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


目录
相关文章
|
2月前
|
存储 网络协议 C语言
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
89 0
|
2月前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
81 0
|
2月前
|
Linux API C语言
Qt串口编程探究:理论与实践
Qt串口编程探究:理论与实践
67 1
|
2月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
35 1
|
2月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
37 1
|
2月前
|
存储 并行计算 安全
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(二)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
64 0
|
6月前
关于Qt的pri模块化编程详解
今天在移植一份代码的时候遇到了了Qt的`pri`文件,在CSDN上看了一下怎么用,都告诉我新建文件夹,直接Ctrl+S的,试了半天不行,看了一下需要移植的代码,茅塞顿开,分享给大家详细过程。
|
1月前
|
Ubuntu 编译器 Linux
Ubuntu下Qt编程,从QT的安装到编写notepad
Ubuntu下Qt编程,从QT的安装到编写notepad
|
2月前
|
负载均衡 并行计算 安全
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(三)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
46 0
|
2月前
|
安全 数据处理 API
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(一)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
83 0