2010-07-22 65 views
2

说我有一个线性梯度获取中间色,如图所示:一个渐变

QLinearGradient linearGrad(QPointF(0, 0), QPointF(0, 100)); 
linearGrad.setColorAt(1, Qt::red); 
linearGrad.setColorAt(0.5, Qt::yellow); 
linearGrad.setColorAt(0, Qt::green); 

如何获得点QPointF在这个渐变的颜色(0,28.5)?

确实我想要这种颜色分布能够选择中间色。我不关心它是通过使用QLinearGradient还是其他的。

回答

3

只有让位吧:

有在的QPixmap类的静态成员
QPixmap QPixmap::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1)

1)请你对你的widget梯度; 2)使用该功能将小部件的表面抓取到像素图中;可以从QWidget::effectiveWinId()收到WId;

3)将标记像素图转换为QImage(有一个构造函数可用);

4)int QImage::pixelIndex(int x, int y)返回QImage颜色表中(x,y)处的像素索引。在你的情况下,你必须从小部件的高度计算百分比值(pWidget->height()/100 * 28.5)。

5)QRgb QImage::color(int i)返回索引i处颜色表中的颜色。

所以返回颜色是你正在寻找的颜色。

1

QVariantAnimation具有类似的功能,并且QVariantAnimation :: keyValueAt可以返回您需要的值。您可以进入QVariantAnimation的代码并查看keyValueAt的工作方式。

+1

我不知道如何使用QVariantAnimation抽象类。请,如果你有例子,证明它。 – Narek 2010-07-22 11:01:47

+1

只是使用下面的函数作为你已经完成的QLinearGradient: - QVariantAnimation :: setStartValue(const QVariant&value) - QVariantAnimation :: setKeyValueAt(qreal step,const QVariant&value); QVariantAnimation :: setEndValue(const QVariant&value); 然后得到一个点的值 - QVariantAnimation :: keyValueAt(qreal step); 这里的问题是,QVariantAnimation不支持QColor。我不确定将QColor转换为Int是否有效。 – 2010-07-23 01:58:43

+1

QVariantAnimation是一个抽象类。它应该被继承和实施。 – Narek 2010-07-23 16:08:55

3

梅森张回答确实有用,而且很好! 让controlPoints()返回一个QMap<qreal,QColor>,其中一个键为0.0到1.0。 这里是我做了(感谢梅森张)

QColor getColor(qreal key) const 
{ 
    // key must belong to [0,1] 
    key = Clip(key, 0.0, 1.0) ; 

    // directly get color if known 
    if(controlPoints().contains(key)) 
    { 
     return controlPoints().value(key) ; 
    } 

    // else, emulate a linear gradient 
    QPropertyAnimation interpolator ; 
    const qreal granularite = 100.0 ; 
    interpolator.setEasingCurve(QEasingCurve::Linear) ; 
    interpolator.setDuration(granularite) ; 
    foreach(qreal key, controlPoints().keys()) 
    { 
     interpolator.setKeyValueAt(key, controlPoints().value(key)) ; 
    } 
    interpolator.setCurrentTime(key*granularite) ; 
    return interpolator.currentValue().value<QColor>() ; 
} 
2

我存储梯度于一体的QList的颜色,然后用色彩插值计算。

QColor ColorGradient::getColor(double value) 
{ 
    qDebug()<< "ColorGradient::getColor:"; 
    //Asume mGradientColors.count()>1 and value=[0,1] 
    double stepbase = 1.0/(mGradientColors.count()-1); 
    int interval=mGradientColors.count()-1; //to fix 1<=0.99999999; 

     for (int i=1; i<mGradientColors.count();i++)//remove begin and end 
     { 
      if(value<=i*stepbase){interval=i;break;} 
     } 
     double percentage = (value-stepbase*(interval-1))/stepbase; 
     QColor color(interpolate(mGradientColors[interval],mGradientColors[interval-1],percentage));   
     return color; 
} 
QColor ColorGradient::interpolate(QColor start,QColor end,double ratio) 
{ 
    int r = (int)(ratio*start.red() + (1-ratio)*end.red()); 
    int g = (int)(ratio*start.green() + (1-ratio)*end.green()); 
    int b = (int)(ratio*start.blue() + (1-ratio)*end.blue()); 
    return QColor::fromRgb(r,g,b); 
} 
+0

由于这是一个古老的回答问题。为什么这是最好的问题,可以帮助OP的问题?请避免发布已接受答案的问题。 – bcesars 2015-03-26 14:23:37

+0

我认为这是一个很好的答案。对于像我一样搜索的其他人,我发现它比接受的答案更有帮助。 – 2017-09-08 16:44:54