• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            使用QML實現浮動桌面搜索框

            Posted on 2011-08-05 07:33 RTY 閱讀(2697) 評論(0)  編輯 收藏 引用 所屬分類: QML

            使用QML實現浮動桌面搜索框

            前段時間接觸了一下QML,深深地被這門強大易用的語言所吸引。

            QML的語法類似CSS,可以引入javascript作為邏輯,還能夠和C++對象交互。

            QML帶來的好處至少有以下幾點:

             

            1. 分工更明確:設計師可以專攻QML制作UI,C++工程師也能專注于自己的本職工作。
            2. 開發更高效:重新編寫的QML不需要編譯(因為它是一門腳本語言),所以只需要刷新一下你的QML Viewer就可以了。
            3. 界面更精美:QML開發和網頁開發很相似,所以我們可以比較容易地把一個精美的網頁效果移植到本地程序。
            4. 風格更一致:Qt本身是一個跨平臺的開發框架,所以我們在Window XP上看到的是一個樣子,Win7上看到的是另一個樣子,到了Ubuntu或者Mac更是變了模樣,使用QML可以屏蔽這些不一致。
            下面帶來一個簡單的示例,希望對讀者們有幫助。
            谷歌桌面相信很多人都用過,雙擊ctrl可以呼出一個浮動的搜索框,非常方便。我們將使用QML仿制這一效果。先看效果圖:

             
            怎么樣?很炫吧~
            好的,首先打開你的Qt Creator(QML是Qt4.7以后才有的特性,請升級你的SDK到最新版本 )。然后新建一個項目。接著新建一個C++ Class,命名為FloatBox。現在你的工程的目錄結構應該像這樣:

            接著,再新建一個QML文件:


             

            我們將這個QML文件命名為TextBox。這個QML文件主要是實現搜索框中的文本框。

            輸入以下代碼:

             

            Qml代碼  收藏代碼
            1. import Qt 4.7  
            2.   
            3. FocusScope {  
            4.     id: focusScope  
            5.     width: 600; height: 40  
            6.     focus:true  
            7.   
            8.     BorderImage {  
            9.         source: "../images/lineedit-bg.png"  
            10.         width: parent.width; height: parent.height  
            11.         border { left: 4; top: 4; right: 4; bottom: 4 }  
            12.     }  
            13.   
            14.     Text {  
            15.         id: typeSomething  
            16.         anchors.fill: parent; anchors.leftMargin: 8  
            17.         verticalAlignment: Text.AlignVCenter  
            18.         text: "\u8BF7\u8F93\u5165\u7F51\u5740"  
            19.         color: "gray"  
            20.     }  
            21.   
            22.     MouseArea {  
            23.         anchors.fill: parent  
            24.         onClicked: { focusScope.focus = true; textInput.openSoftwareInputPanel(); }  
            25.     }  
            26.   
            27.     TextInput {  
            28.         id: textInput  
            29.         anchors { left: parent.left; leftMargin: 8; right: clear.left; rightMargin: 8; verticalCenter: parent.verticalCenter }  
            30.         focus: true  
            31.         font.pixelSize:20  
            32.     }  
            33.   
            34.     Image {  
            35.         id: clear  
            36.         anchors { right: parent.right; rightMargin: 8; verticalCenter: parent.verticalCenter }  
            37.         source: "../images/clear.png"  
            38.         opacity: 0  
            39.   
            40.         MouseArea {  
            41.             anchors.fill: parent  
            42.             onClicked: { textInput.text = ''; focusScope.focus = true; textInput.openSoftwareInputPanel(); }  
            43.         }  
            44.     }  
            45.   
            46.     states: State {  
            47.         name: "hasText"; when: textInput.text != ''  
            48.         PropertyChanges { target: typeSomething; opacity: 0 }  
            49.         PropertyChanges { target: clear; opacity: 1 }  
            50.     }  
            51.   
            52.     transitions: [  
            53.         Transition {  
            54.             from: ""; to: "hasText"  
            55.             NumberAnimation { exclude: typeSomething; properties: "opacity" }  
            56.         },  
            57.         Transition {  
            58.             from: "hasText"; to: ""  
            59.             NumberAnimation { properties: "opacity" }  
            60.         }  
            61.     ]  
            62. }  

             

             你也許會注意到,在Text的text屬性中,我輸入的是utf編碼的漢字。事實上,想要在QML文件里顯示中文還是有一點小麻煩的,要么就是用utf編碼過的漢字,要么使用Qt翻譯家來轉換。直接在QML中輸入中文將無法顯示。
             接著,新建ShadowRectangle文件。該文件實現的是陰影效果。代碼如下:

             

            Qml代碼  收藏代碼
            1. import Qt 4.7  
            2.   
            3. Item {  
            4.     property alias color : rectangle.color  
            5.   
            6.     BorderImage {  
            7.         anchors.fill: rectangle  
            8.         anchors { leftMargin: 0; topMargin: 0; rightMargin: -8; bottomMargin: -8 }  
            9.         border { left: 10; top: 10; right: 10; bottom: 10 }  
            10.         source: "../images/shadow.png"; smooth: true  
            11.     }  
            12.   
            13.     Rectangle { id: rectangle; anchors.fill: parent; radius:5}  
            14. }  

             

             最后新建main.qml文件,該文件實現的是整個搜索欄的效果。其代碼如下:

             

            Qml代碼  收藏代碼
            1. import Qt 4.7  
            2.   
            3. Rectangle {  
            4.     id: page  
            5.     width: 614; height: 54  
            6.     color: "#7bffffff"  
            7.     radius:5  
            8.   
            9.     MouseArea {  
            10.         anchors.fill: parent  
            11.         onClicked: page.focus = false;  
            12.     }  
            13.     ShadowRectangle {  
            14.         color: "#434343"  
            15.         transformOrigin: "Center"  
            16.         opacity: 0.97  
            17.         visible: true  
            18.         anchors.centerIn: parent; width: 610; height: 50  
            19.     }  
            20.     TextBox {  
            21.         id: search;  
            22.         visible: true  
            23.         opacity: 1  
            24.         anchors.centerIn: parent  
            25.     }  
            26. }  

             

             QML的代碼通俗易懂,這里就不去解釋每一行代碼的意思了。

             

            好的,下面讓我們把QML制作的搜索欄放置到桌面程序的窗體上。

            在你的floatbox.h中添加一個私有變量:

             

            Cpp代碼  收藏代碼
            1. private:  
            2.     QDeclarativeView *ui;  

             

             然后在你的floatbox.cpp的構造函數中輸入以下代碼:

             

            Cpp代碼  收藏代碼
            1. // 使窗體透明而控件不透明  
            2. setWindowFlags(Qt::FramelessWindowHint);  
            3. setAttribute(Qt::WA_TranslucentBackground, true);  
            4. setStyleSheet("background:transparent;");  
            5.   
            6. ui = new QDeclarativeView;  
            7. ui->setSource(QUrl("qrc:/resources/qml/main.qml"));  
            8. setCentralWidget(ui);  
            9. resize(QSize(630, 60));  

             

             細心的你可以發現,我將qml文件加入了Qt的資源系統。這里要說明一點,非常重要:

            在QML文件中如果引入了其他文件(包括js文件、圖片文件等),要么都加入Qt的資源系統,要么都不加入,因為Qt的資源文件無法和本地文件相互訪問。

            所以,如果你也和我一樣新建了qrc文件,請將qml文件和圖片文件一并加入到資源系統中去。如下圖:



             到了這一步,我們的搜索工具欄差不多要完工了,想要運行,千萬不要忘記在pro文件添加declarative模塊。

             

            Cpp代碼  收藏代碼
            1. QT       += core gui declarative  

             

             好的,現在你就可以按下ctrl+R欣賞一下成果了。

            最后,老規矩,附上源代碼。

            久久久久久免费一区二区三区| 一本一本久久A久久综合精品| 久久99精品久久久久久动态图| 欧美丰满熟妇BBB久久久| 91精品国产高清久久久久久io| 久久96国产精品久久久| 久久精品国产一区二区三区不卡| 国产毛片久久久久久国产毛片 | 精品久久久噜噜噜久久久 | 亚洲国产精品无码久久一区二区| 国产精品久久毛片完整版| 日韩欧美亚洲综合久久| 一本一道久久精品综合| 综合久久国产九一剧情麻豆| 欧美激情精品久久久久| 亚洲精品乱码久久久久久按摩 | 久久久午夜精品| 国内精品伊人久久久久AV影院| 久久综合精品国产一区二区三区| 精品久久8x国产免费观看| 亚洲国产精品综合久久一线| 99久久精品免费| 国产精品一区二区久久 | 伊人久久大香线蕉精品| 91精品国产91久久综合| 亚洲AV无码久久精品色欲| 色青青草原桃花久久综合| 久久久久女教师免费一区| 精品久久久久久无码人妻蜜桃| 97久久超碰国产精品旧版| 久久综合给合久久狠狠狠97色| 久久这里只有精品18| 久久久久久久人妻无码中文字幕爆| 精品国产乱码久久久久久人妻| 中文精品久久久久人妻| 少妇被又大又粗又爽毛片久久黑人 | 久久国产精品久久| 久久综合狠狠综合久久激情 | 久久九九青青国产精品| 99国内精品久久久久久久| 精品久久久久久久久久久久久久久|