2012-01-17 28 views
5

Quiero lograr un efecto de desenfoque usando QML. Encontré referencias sobre el "efecto: Desenfoque" (Example) pero en Qt 4.8 esto no funciona. Por lo que sé, esto se implementa con el código C++. ¿Pero cómo?Qml y imagen borrosa

Respuesta

13

El atributo effect, que tienen todos los elementos visuales QML, acepta todos los efectos que son subclases de QGraphicsEffect. Qt 4.8 se envía con QGraphicsBlurEffect, QGraphicsColorizeEffect, QGraphicsDropShadowEffect y QGraphicsOpacityEffect. Originalmente, estos estaban disponibles en QML por defecto, pero al mismo tiempo en desarrollo (antes del primer lanzamiento público de QtQuick) fueron excluidos por razones de rendimiento. Para hacer que funcionen de nuevo, uno tiene que incluir las siguientes líneas de código en la parte C++ de su aplicación, por ejemplo en la función main:

qmlRegisterType<QGraphicsBlurEffect>("Effects",1,0,"Blur"); 
qmlRegisterType<QGraphicsColorizeEffect>("Effects",1,0,"Colorize"); 
qmlRegisterType<QGraphicsDropShadowEffect>("Effects",1,0,"DropShadow"); 
qmlRegisterType<QGraphicsOpacityEffect>("Effects",1,0,"OpacityEffect"); 

Esto crea estas clases disponibles para QML lo que uno puede utilizarlos como :

import QtQuick 1.1 
import Effects 1.0 

Item { 
    // [...] 
    effect: Blur { 
     blurRadius: 10.0 
    } 
} 

Esto funciona, pero en muchos casos el rendimiento resultante es realmente inaceptable. Luego, debe intentar implementar el desenfoque con la ayuda de ShaderEffectItem. De esta forma, se pueden realizar efectos gráficos con los programas de sombreado GLSL, lo que resulta en una renderización de GPU mucho más rápida que con el antiguo enfoque basado en QGraphicsEffect.

1

No sé de qué estás hablando, pero: Qt se envía con un ejemplo llamado Shader Effects. Como su nombre lo indica, utiliza sombreadores de GPU declarados dentro del QML para lograr todo tipo de efectos geniales.