Rotar QIcon



  • Muchachos, tengo un listview con un delegado para mostrar un icono y texto dentro del mismo.
    Como deberia hacer para rotar el QIcon dentro del delegado?
    He intentado de diferentes formas pero se me deforma completamente..
    Tambien me gustaria enlazar un timer con la funcion paint() pero no encuentro como, alguno que me pueda dar una mano?



  • Como diría mi viejo amigo Sherlock Holmes: "...Constituye un craso error el teorizar sin poseer datos. Uno empieza de manera insensible a retorcer los hechos para acomodarlos a sus hipótesis, en vez de acomodar las hipótesis a los hechos..."

    ¿Cómo lo estas haciendo? ¿Qué comandos estas usando? Sería bastante provechoso que publicaras algo del código que estas usando, aunque sea el delegate para así poder ver en que te podemos ayudar.

    La rotación de imágenes es algo bastante sencillo.

    Supongo (estoy teorizando sin tener datos) que ya usaste algo como esto:

    import QtQuick 1.1

    Rectangle {
    width: 360
    height: 360

    Image {
        id: image;
        anchors.fill: parent;
        source: "images/XXXXXX.png"
    
        NumberAnimation on rotation {
                         running: true
                         loops: Animation.Infinite
                         from: 0
                         to: 360
                         duration: 3000
                     }
    }
    

    }

    Donde dentro de NumberAnimation, la propiedad duration indica el tiempo en milisegundos que dura la rotación. La rotación en este caso es el sentido de las manecillas del reloj, si queremos que gire en sentido contrario, en la propiedad to: 360 colocamos to: -360, es decir, el ángulo hasta el cual va a rotar con signo negativo.



  • Como dicho, lo estoy renderizando desde un Delegado, no puedo usar QML ahi o si? (de cualquier manera no tengo realmente mucha experiencia con QML/Qt Quick)
    <code>

    void DelegadoListView1::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
    if (option.state & QStyle::State_Selected)
    {
    painter->fillRect(option.rect, option.palette.color(QPalette::Highlight));
    }
    QString texto = index.data(Qt::DisplayRole).toString();
    QRect r = option.rect.adjusted(2,2,-2,-2);
    icono1.paint(painter,r,Qt::AlignVCenter|Qt::AlignLeft);
    r = r.adjusted(r.height()+20,0,0,0);
    painter->drawText(r.left(),r.top(),r.width(),r.height(),Qt::AlignVCenter|Qt::AlignLeft|Qt::TextWordWrap,texto,&r);
    }
    

    </code>

    Con eso lo estoy renderizando, y despues tengo una funcion actualizar() que se dispara en timeout() de un QTimer que intenta hacerlo de la siguiente manera:
    <code>

    void DelegadoListView1::actualizar()
    {
    QPixmap pixmap = icono2.pixmap(32,32);
    matriz = matriz.translate(pixmap.width()/2,pixmap.height()/2);
    matriz.rotate(180);
    pixmap = pixmap.transformed(matriz);
    pixmap = pixmap.scaled(64,64);
    icono2 = QIcon(pixmap);
    emit actualizarWidget();
    }
    

    </code>

    actualizarWidget() es una señal conectada al widget padre para que se redibuje, de esta manera actualmente "funciona" pero la imagen se deforma..

    Espero haber contribuido a poder ser ayudado..



  • Saludos.

    Quizás ya has resuelto este dilema pero por si acaso te doy una propuesta.

    Sobre si puedes usar QML? Hemos mandado gente a la Luna y estamos a punto de mandar gente a Marte, así que no hay imposibles. Cuando se realizas una aplicación de QML, sí lo haces con Qt Creator, este crea un QtQuick1ApplicationViewer que es una subclase de QDeclarativeView el cual puedes embeber dentro de tu aplicación. Entonces, de poder si se puede peeeeroooo NO SE DEBE. No aconsejo esa mezcla de Frameworks cuando ambos son difíciles de mantener y comunicarse entre ellos. Para quien ya sabe QML, que según comentas no es tu caso, los costos de mantenimiento se van a disparar hasta Marte. En conclusión OPCION DESCARTADA.
    Hay que descartar también la opción de usar OpenGL por la mismas razones, el
    código queda asqueroso, difícil de mantener sobre todo la comunicación SIGNAL/SLOT y lo más probable es que la aplicación quede muy lenta usando muchos recursos.

    Por otra parte, has avanzado mucho y no vamos a tirar todo a la papelera cuando
    lo que falta quizás sea un pequeño ajuste.

    Yo hago algo parecido pero en vez de trabajar las transformaciones (escalado, rotación, traslación) con QPixmap lo hago con QImage ya que en teoría las imágenes no deberían deformarse, por lo que te sugiero

    <code>
    ...
    QPixmap pixmap = icono2.pixmap(32,32);
    QImage imageA = pixmap.toImage();
    ...
    </code>

    Hago las transformaciones(rotar, escalar, trasladar) a imageA obteniendo imageATransformada y luego

    <code>
    ...
    icono2 = QIcon(QPixmap::fromImage(imageATransformada));
    ...
    </code>

    ¡¡Suerte!!!

    Como diría Columbo, One more thing:
    Recuerda que la idea de los foros es compartir con toda la comunidad. Otras personas pueden tener el mismo problema o algo similar.
    Por favor, dinos si te funciona esta propuesta o si lo resolviste de otra manera.



  • Gracias por la info!
    Voy a intentar con QImage como reemplazo y te aviso como me fue.. Saludos!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.