6

次のような線形グラデーションがあるとします。

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 などを使用して行われるかどうかは気にしません。

4

4 に答える 4

9

グラデーションの色を 1 つの 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);
}
于 2015-03-26T14:01:39.467 に答える
5

メイソン・チャンの答えは機能し、非常にうまくいきます! controlPoints() がQMap<qreal,QColor>、0.0 から 1.0 までのキーを持つ を返すようにします。これが私がやった方法です(Mason Zhangに感謝)

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>() ;
}
于 2011-09-26T08:00:43.923 に答える
3

それを作る唯一の方法があります:

QPixmap クラスに static メンバーがあります
QPixmap QPixmap::grabWindow( WId window, int x = 0, int y = 0, int width = -1, int height = -1 )

1) ウィジェットにグラデーションを描画します。

2)その関数を使用して、ウィジェットの表面をピックスマップに取り込みます。WIdから受け取ることができますQWidget::effectiveWinId ()

3) トークン pixmap をQImage(利用可能なコンストラクターがあります) に変換します。

4)のカラー テーブルのint QImage::pixelIndex( int x, int y )(x, y) のピクセル インデックスを返します。QImageあなたの場合、ウィジェットの高さからパーセンテージ値を計算する必要があります(pWidget->height() / 100 * 28.5)。

5)QRgb QImage::color( int i )インデックス i のカラー テーブルの色を返します。

返された色は、あなたが求めていた色です。

于 2011-03-18T17:21:15.703 に答える
1

QVariantAnimation にも同様の機能があり、QVariantAnimation::keyValueAt は必要な値を返すことができます。QVariantAnimation のコードに足を踏み入れて、keyValueAt がどのように機能するかを確認できます。

于 2010-07-22T09:35:46.427 に答える