2010-07-22 32 views
2

que j'ai un gradient de doublure comme indiqué:intermédiaire d'un gradient

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

Comment obtenir la couleur du point QPointF (0, 28,5) dans ce gradient?

En effet, je veux avoir ce genre de distribution des couleurs pour être en mesure de choisir les couleurs intermédiaires. Je m'en fous si cela est fait en utilisant QLinearGradient ou autre chose.

Répondre

3

Il est seul moyen de le faire:

Il est membre statique dans la classe QPixmap
QPixmap QPixmap::grabWindow(WId window, int x = 0, int y = 0, int width = -1, int height = -1)

1) attirer votre dégradé sur votre widget;

2) saisir la surface de votre widget dans pixmap en utilisant cette fonction; WId peut être reçu de QWidget::effectiveWinId();

3) convertir pixmap jeton dans QImage (il y a un constructeur disponible); 4) int QImage::pixelIndex(int x, int y) renvoie l'indice des pixels à (x, y) dans la table des couleurs de QImage. Dans votre cas, vous devez calculer la valeur en pourcentage de la hauteur du widget (pWidget->height()/100 * 28.5).

5) QRgb QImage::color(int i) renvoie la couleur dans la table de couleurs à l'index i.

La couleur retournée est la couleur recherchée.

1

QVariantAnimation a la fonctionnalité similaire, et QVariantAnimation :: keyValueAt peut retourner la valeur dont vous avez besoin. Vous pouvez entrer dans le code de QVariantAnimation et voir comment keyValueAt fonctionne.

+1

Je ne sais pas comment utiliser la classe abstraite QVariantAnimation. S'il vous plaît, si vous avez un exemple, démontrez-le. – Narek

+1

utilisez simplement les fonctions ci-dessous comme ce que vous avez fait par QLinearGradient: - QVariantAnimation :: setStartValue (const QVariant et valeur) - QVariantAnimation :: setKeyValueAt (qreal step, const QVariant & value); - QVariantAnimation :: setEndValue (const QVariant & value); Puis obtenez la valeur à un point par - QVariantAnimation :: keyValueAt (qreal step); Le problème ici est que QVariantAnimation ne prend pas en charge QColor. Je ne suis pas sûr si convertir QColor en Int fonctionne ou pas. –

+1

QVariantAnimation est une classe abstraite. Il devrait être hérité et mis en œuvre. – Narek

3

Mason Zhang réponse fonctionne, et très bien! Laisser controlPoints() retourner un QMap<qreal,QColor>, avec une clé entre 0.0 et 1.0. Voici comment je l'ai fait (grâce à 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>() ; 
} 
2

je stocke les couleurs de gradient dans un QList puis avec interpolation de calculer la couleur.

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

Puisqu'il s'agit d'une vieille question répondue. Pourquoi est-ce la meilleure question et qui peut aider la question du PO? S'il vous plaît, évitez de poster une question qui a accepté la réponse. – bcesars

+0

Je pense que c'est une bonne réponse.Pour les autres qui cherchent comme moi, je trouve cela beaucoup plus utile que la réponse acceptée. –