Qt Quick裡的圖形效果(Graphical Effects),quickgraphical

來源:互聯網
上載者:User

Qt Quick裡的圖形效果(Graphical Effects),quickgraphical

    Qt Quick 提供了 Graphical Effects ,我在《Qt Quick核心編程》一書中限於篇幅沒有介紹,這裡補上吧。

    Graphical Effects ,姑且叫作圖形效果吧。它提供了 Blend 、 Color 等好幾類效果,有些類別下面又有多種不同的效果,要介紹完整需要較長的篇幅。我們一個一個來看。

    部落格之星評選,點擊投我一票,謝謝。投過了也可以點哦,每天都可以投投一票。

概要介紹

    先看看都有哪幾類圖形效果(Graphical Effects)吧:

  • Blend,混合。只有一種類型——Blend,使用一種混合模式來合并兩個源 items 。
  • Color,顏色,通過改變一個 Item 的顏色來產生各種各樣的效果。有下列幾種類型:
    • BrightnessContrast,調整亮度和對比
    • ColorOverlay,在源 Item 上覆蓋一層顏色
    • Colorize,設定源 Item 的 HSL 色彩空間
    • Desaturate,降低顏色的飽和度
    • GammaAdjust,使用 gamma 曲線來改變源 Item 的照度
    • HueSaturation,在 HSL 色彩空間改變源 Item 的顏色
    • LevelAdjust,在 RGBA 色彩空間調整源 Item 的顏色水平
  • Gradient,漸層。有下列幾種類型:
    • ConicalGradient,錐形漸層
    • LinearGradient,線性漸層
    • RadialGradient,放射狀漸層
  • Distortion,變形。只有一種類型——Displace,根據給定的位移 map 來改變源 Item 的像素
  • Drop Shadow,投影。有兩種類型:
    • DropShadow,根據源 Item 產生一個彩色的、模糊的影子映像,並且把它放到原始映像的後面,會產生源 Item 在背景上凸起的效果
    • InnerShadow,在源 Item 裡面產生一個彩色的、模糊的映像
  • Blur,模糊。有下面幾種類型:
    • FastBlur,快速模糊
    • GaussianBlur,高斯模糊
    • MaskedBlur,差異化模糊,可以根據一個掩碼元素對源 Item 的不同地區產生強度不同的模糊效果
    • RecursiveBlur,遞迴模糊。通過反覆模糊來產生很強的模糊效果。
  • Motion Blur,移動模糊。有下面幾種類型:
    • DirectionalBlur,定向模糊,在指定的方向上產生模糊效果
    • RadialBlur,徑向模糊,在以源 Item 的中心點為圓心的一個圓形內應用定向模糊
    • ZoomBlur,縮放模糊,朝著源 Item 的中心點應用定向模糊
  • Glow,發光。有下面幾種類型:
    • Glow,根據源 Item 產生一個彩色的、模糊的發光像,並且把它放到源 Item 後面,產生一種源 Item 在發光的效果。
    • RectangularGlow,產生一個模糊的、彩色的矩形,給人發光的印象
  • Mask,遮罩。有下面幾種類型:
    • OpacityMask,透明遮罩。用另一個 Item 遮擋源 Item
    • ThresholdMask,閾值遮罩。用另一個 Item 遮擋源 Item,根據一個閾值來應用遮擋效果
樣本項目

    我設計了一個樣本來示範所有的圖形效果,它是一個 Qt Quick App 項目。下面是樣本運行後的首頁:


                        圖 1 樣本首頁

    我們結合圖 1 來介紹一下樣本項目的結構。

    1 所示,首頁中間是一個列表,列出了所有的圖形效果類別。

    介面底部右側有兩個按鈕,“Load Examples”按鈕用於載入選中的圖形效果對應的樣本。“Quit”就是退出了。

源碼

    首頁的源碼在 main.qml 中:

import QtQuick 2.2import QtQuick.Window 2.1import QtQuick.Controls 1.2Window {    id: appWin;    visible: true;    width: 640;    height: 640;    minimumWidth: 640;    minimumHeight: 640;    color: "lightgray";    property var currentExample: null;    Text {        id: clue;        text: "Graphical Effects Examples";        anchors.top: parent.top;        anchors.left: parent.left;        anchors.margins: 4;        font.pointSize: 24;        font.bold: true;    }    Rectangle{        anchors.left: clue.left;        anchors.right: parent.right;        anchors.rightMargin: 4;        anchors.top: clue.bottom;        height: 2;        border.width: 1;        border.color: "darkgray";    }    Component {        id: exampleDelegate;        Rectangle {            id: wrapper;            width: parent.width;            height: 40;            color: "transparent";            Text {                anchors.fill: parent;                text: name;                color: wrapper.ListView.isCurrentItem ? "blue" : "steelblue";                font.pointSize: 20;                verticalAlignment: Text.AlignVCenter;            }            MouseArea {                anchors.fill: parent;                onClicked: {                    wrapper.ListView.view.currentIndex = index;                }            }        }    }    ListView {        id: examples;        anchors.bottom: quit.top;        anchors.top: clue.bottom;        anchors.left: parent.left;        anchors.right: parent.right;        anchors.margins: 8;        clip: true;        delegate: exampleDelegate;        highlight: Rectangle {            color: "lightblue";            width: parent.width;        }        model: ListModel {            ListElement {                name: "Blend";                example: "BlendExample.qml";            }            ListElement {                name: "Color";                example: "ColorExample.qml";            }            ListElement {                name: "Gradient";                example: "GradientExample.qml";            }            ListElement {                name: "Distortion";                example: "DistortionExample.qml";            }            ListElement {                name: "Drop Shadow";                example: "DropShadowExample.qml";            }            ListElement {                name: "Blur";                example: "BlurExample.qml";            }            ListElement {                name: "Motion Blur";                example: "MotionBlurExample.qml";            }            ListElement {                name: "Glow";                example: "GlowExample.qml";            }            ListElement {                name: "Mask";                example: "MaskExample.qml";            }        }    }    Button {        id: load;        text: "Load Examples";        anchors.right: quit.left;        anchors.top: quit.top;        anchors.rightMargin: 8;        onClicked: {            var data = examples.model.get(examples.currentIndex);            console.log("example: " , data.example);            var comp = Qt.createComponent(data.example);            if(comp.status == Component.Ready){                appWin.currentExample = comp.createObject(appWin, {"color" : appWin.color});                appWin.currentExample.back.connect(appWin.closeCurrentExample);            }        }    }    Button {        id: quit;        text: "Quit";        anchors.bottom: parent.bottom;        anchors.right: parent.right;        anchors.margins: 8;        onClicked: Qt.quit();    }    function closeCurrentExample() {        currentExample.destroy();    }}

    源碼比較簡單,從設計上解釋一下。

列表視圖

    ListView列出了所有的圖形效果。

    exampleDelegate 這個組件用於繪製 ListView 裡的一個 Item 。它接受並處理滑鼠事件,改變 ListView 的當前 Item ;也改變當前 Item 的文本顯示效果。

    ListModel 非常簡單,只是使用 ListElement 列出了所有圖形效果的名字(角色名稱為name)和對應的範例文件(角色名稱為example),在 delegate 中我們可以通過角色名稱訪問 Model 中的資料。

    這就是 ListView 了: view + model + delegate ,非常靈活。更詳細的用法,可以參考我的書《Qt Quick核心編程》,裡面對 ListView 有超級詳細的介紹。

動態載入圖形效果

    我給每一類圖形效果提供了一個單獨的示範介面,在 ListModel 內, example 這個角色儲存了對應的樣本 QML 文檔的名字。當使用者點擊“Load Examples”按鈕時,我擷取到 ListView 的當前 Item ,通過 Model 取出資料,訪問 example 角色,得到實際的 QML 文檔名字,然後使用 Qt.createComponent() 和 Component.createObject() 來載入 QML 文檔並產生樣本組件。


    好啦,這次就先介紹到這裡,下一次我們介紹 混合效果

    部落格之星評選,點擊投我一票,謝謝。投過了也可以點哦,每天都可以投投一票。

--------

回顧一下我的Qt Quick系列文章:

  • Qt Quick 簡介
  • QML 語言基礎
  • Qt Quick 之 Hello World 圖文詳解
  • Qt Quick 簡單教程
  • Qt Quick 事件處理之訊號與槽
  • Qt Quick事件處理之滑鼠、鍵盤、定時器
  • Qt Quick 事件處理之捏拉縮放與旋轉
  • Qt Quick 組件與對象動態建立詳解
  • Qt Quick 布局介紹
  • Qt Quick 之 QML 與 C++ 混合編程詳解
  • Qt Quick 影像處理執行個體之美圖秀秀(附源碼下載)
  • Qt Quick 之 PathView 詳解
  • Qt Quick執行個體之挖頭像
  • Qt Quick綜合執行個體之檔案查看器
  • Qt Quick調試之顯示程式碼號
  • Qt Quick實現的塗鴉程式
  • Qt Quick播放GIF動畫
  • Qt Quick 中的 drag and drop(拖放)
  • Qt Quick裡的AnimatedSprite的用法
  • Qt Quick裡的粒子系統
  • Qt Quick實現的瘋狂算數遊戲
  • Qt Quick裡的圖形效果——混合(Blend)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.