Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Spanish
  4. Rotar QIcon

Rotar QIcon

Scheduled Pinned Locked Moved Spanish
5 Posts 2 Posters 2.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    linuxkid
    wrote on last edited by
    #1

    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?

    1 Reply Last reply
    0
    • J Offline
      J Offline
      Julio Espinoza
      wrote on last edited by
      #2

      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.

      1 Reply Last reply
      0
      • L Offline
        L Offline
        linuxkid
        wrote on last edited by linuxkid
        #3

        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..

        1 Reply Last reply
        0
        • J Offline
          J Offline
          Julio Espinoza
          wrote on last edited by
          #4

          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.

          1 Reply Last reply
          0
          • L Offline
            L Offline
            linuxkid
            wrote on last edited by
            #5

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

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved