![]() | Carga y manipulación de un mapa de pixels |
Prev | Next |
En primer lugar, añadiremos una variable miembro de QPixmap llamada m_pixmap a CentralView, además de un método setPixmap que únicamente hará:
void CentralView::setPixmap(const QPixmap &pixmap) { m_pixmap=pixmap; updatePixmap(); }
Ahora vamos a implementar el método que KDevelop creó como futura ubicación de un método de carga de un documento en TheTinterView.
void TheTinterView::openURL(const KURL& url) { QString tmpFile; if (KIO::NetAccess::download(url, tmpFile)) { // cargar el archivo (el destino es siempre local) m_view->setPixmap( tmpFile ); // y eliminar el archivo temporal KIO::NetAccess::removeTempFile(tmpFile); } }KIO::NetAccess::download se utiliza para descargar la URL url y guardarla en un archivo temporal local cuya ruta completa se almacena en tmpFile. Si tiene éxito, devolverá true y el documento será cargado.
Habrá notado que CentralView::setPixmap admite un parámetro QPixmap, mientras que nosotros hemos utilizado como parámetro aquí un QString, ¿por qué? Si tiene experiencia en C++ y ha leido un poco la documentación de QPixmap, sabrá que QPixmap tiene un constructor que admite un único parámetro QString, y, por lo tanto, esa línea es equivalente a:
QPixmap pixmap( tmpFile ); m_view->setPixmap( pixmap );He olvidado mencionar que el constructor de QPixmap que obtiene un parámetro QString, carga el mapa de pixels indicado en dicho parámetro.
Por último, KIO::NetAccess::removeTempFile(tmpFile); hace algo muy interesante. Elimina el archivo tmpFile únicamente si se trata realmente de un archivo temporal. Conviene reseñar que en caso de que esté tratando de acceder a un archivo local, KIO::NetAccess::download devuelve el archivo real en vez de copiarlo a una ubicación temporal (lo que sería absurdo) y KIO::NetAccess::removeTempFile no hace nada,por lo que es seguro llamarlo aunque el archivo no sea temporal, porque KIO::NetAccess guarda una lista de los archivos que se han descargado (y son realmente temporales) y los archivos reales que no deben ser eliminados.
Ahora vamos a hacer que CentralView realice operaciones sobre el mapa de pixels. Cambiaremos la implementación de updatePixmap a:
void CentralView::updatePixmap() { QImage image= m_pixmap.convertToImage(); KImageEffect::blend(m_color, image, 0.5); QPixmap pixmap; pixmap.convertFromImage(image); m_label->setPixmap(pixmap); }
La primera línea convierte el mapa de pixels a una imagen, que es otra clase que puede albergar imágenes. La diferencia es que QImage almacena las imágenes localmente, mientras que QPixmap lo hace en el servidor X, de forma que habrá que utilizar uno un otro dependiendo del objetivo que se quiera lograr. En este caso resultará más sencillo teñir una imagen.
KImageEffect::blend(m_color, image, 0.5); utiliza KImageEffect (de kdelibs/kdefx) para mezclar un color con una imagen. KImageEffect es una clase que contiene métodos muy útiles para aplicar efectos a imágenes. El primer parámetro es el color, el segundo la imagen (que será modificada por este método) y el tercero es la intensidad de opacidad.
Continuamos volviendo a convertir la imagen a un mapa de pixels y colocándola, al igual que antes, en el elemento gráfico.
Prev | Home | Next |
Eliminación del parpadeo utilizando un temporizador | Up | Modificación del interfaz de usuario existente |