2010-07-22 66 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