1. 程式人生 > >QT Demo 之 window(5) window.qml

QT Demo 之 window(5) window.qml

window.qml的主體結構

window.qml主體是一個QtObject,其中包含了4個子元素:palette、controlWindow、testWindow和splashWindow:

QtObject {
    property real defaultSpacing: 10
    property SystemPalette palette: SystemPalette { }

    property var controlWindow: Window {}

    property var testWindow: Window {}

    property var splashWindow: Splash {}
}

QtObject簡述

The QtObject type is a non-visual element which contains only the objectName property.
It can be useful to create a QtObject if you need an extremely lightweight type to enclose a set of custom properties.

從文件中我們知道QtObject型別是一個超級簡單基本的型別,只包含一個objectName的屬性,但是可以通過風中一系列的自定義properties來擴充套件並完成需要的功能。這裡的程式碼也是,在基本的QtObject下添加了4種擴充套件型別的properties和一個基本型別的property。

這裡面也提到了另外一個詞:lightweight,也就是在使用QtObject的時候主要不要做太複雜的操作和邏輯。這裡面有一個很典型的例子,可以參考Qt5.3.2/Examples/Qt-5.3/quick/demos/samegame/content/Settings.qml的程式碼。

SystemPalette型別

The SystemPalette type provides access to the Qt application palettes. This provides information about the standard colors used for application windows, buttons and other features. These colors are grouped into three color groups: Active, Inactive, and Disabled. See the QPalette documentation for details about color groups and the properties provided by SystemPalette.


這裡建立了一個基於SystemPalette的物件palette,主要的作用是在下面的controlWindow中使用palette.window來賦值給color屬性:

        color: palette.window
這樣使用的目的(個人猜測)是:獲取背景視窗的顏色,來設定給當前視窗,以保持風格的一致性。

下面三組分別是palette.highlight、palette.dark和palette.text的執行效果對比:

看到這裡,我們大致瞭解到SystemPalette的一些屬性值是根據當前環境配置下的一些預定義的color數值。

controlWindow

controlWindow作為該應用的預設視窗,在Splash Screen之後就會顯示controlWindow,具體介面見上面的執行效果中的任意一個。

先看一下controlWindow的程式程式碼結構:

    property var controlWindow: Window {
        width: visibilityLabel.implicitWidth * 1.2
        height: col.implicitHeight + defaultSpacing * 2
        color: palette.window
        title: "Control Window"
        Column {}
    }

配合程式碼以及執行效果,我們知道controlWindow就是一個Column的結構。其中寬度是按照中間的visibilityLabel的寬度乘以1.2;高度是按照整體的col的高度再加上一個間距值;顏色是上面提到的palette.window,在這裡具體的值是#f0f0f0;因為我們這裡是一個window,所以需要設定標題,此處設定標題為"Control Window"。

Column

之前的學習中有用到Column控制元件,此處不在展開,看一下Column中的具體元素:

        Column {
            id: col
            anchors.fill: parent
            anchors.margins: defaultSpacing
            spacing: defaultSpacing
            property real cellWidth: col.width / 3 - spacing
            Text { text: "Control the second window:" }
            Grid {}
            function visibilityToString(v) {}
            Text {}
            Rectangle {}
            ScreenInfo { }
        }
從程式碼和執行效果圖對照來看,Column中包含以下幾行元素:
  • Text,顯示"Control the second window:"
  • Grid排列的兩個Button和四個CheckBox
  • 定義visibilityToString(v)函式
  • 又是Text,顯示第二個視窗的是否顯示的狀態
  • 通過Rectangle來模擬的一個黑色的分隔行
  • 呼叫ScreenInfo來顯示Screen的資訊

注:在Column中還有一個成員函式:visibilityToString(),會在第二個Text中呼叫到。

Column中子元素只有Shared.Button和Shared.CheckBox是新出現的兩個空間,但是從命名上來看也不是屬於系統的基本控制元件,如Text、Rectangle等等。

Shared.Button控制元件

                Shared.Button {
                    id: showButton
                    width: col.cellWidth
                    text: testWindow.visible ? "Hide" : "Show"
                    onClicked: testWindow.visible = !testWindow.visible
                }
Shared.Button的使用程式碼很簡單,主要包括常見的id、width,以及Button上顯示的文字和onClicked事件響應函式。

Shared.CheckBox控制元件

                Shared.CheckBox {
                    text: "Windowed"
                    height: showButton.height
                    width: col.cellWidth
                    Binding on checked { value: testWindow.visibility === Window.Windowed }
                    onClicked: testWindow.visibility = Window.Windowed
                }
相對於Shared.Button控制元件的使用方法上,多了一個Binding操作。其實在這裡是非常好理解的,使用C程式碼可以表示如下:
if (testWindow.visibility == Window.Windowed)
	checked = true;
else
	checked = false;
這樣,就即滿足了單擊的時候,修改testWindow.visibility屬性,而且也完成,當testWindow.visibility屬性改變(單擊另外一個CheckBox)時,更新Shared.CheckBox的狀態。

注:具體關於Binding的使用,後面在專門的章節中學習。

通過Rectangle來模擬的一個黑色的分隔線

如何繪製一條分割線,下面是一種實現方法:

            Rectangle {
                id: horizontalRule
                color: "black"
                width: parent.width
                height: 1
            }

如何在QML中定義和使用函式

            function visibilityToString(v) {
                switch (v) {
                case Window.Windowed:
                    return "windowed";
                case Window.Minimized:
                    return "minimized";
                case Window.Maximized:
                    return "maximized";
                case Window.FullScreen:
                    return "fullscreen";
                case Window.AutomaticVisibility:
                    return "automatic";
                case Window.Hidden:
                    return "hidden";
                }
                return "unknown";
            }
官方文件中沒有給出具體的定義,但是從上面的示例中可以看出,Qml中函式的定義和JS中基本相同,都包含以下幾點:
  • 弱資料型別,即引數和返回值都無需明確宣告型別
  • 通過function關鍵字進行函式宣告
  • 支援if/else、switch等分支處理方式

Window的visibility和visible屬性

在controlWindow中除了上面使用的控制元件,其主要功能就是通過點選Button和CheckBox來改變testWindow的visibility和visible屬性。下面我們就看一下這兩個屬性的具體說明。

visibility : QWindow::Visibility
    The screen-occupation state of the window.
Visibility is whether the window should appear in the windowing system as normal, minimized, maximized, fullscreen or hidden.
When a window is not visible its visibility is Hidden, and setting visibility to Hidden is the same as setting visible to false.

visible : bool
Whether the window is visible on the screen.
Setting visible to false is the same as setting visibility to Hidden.

結合程式的實際執行效果,我們知道:

  • 設定visibility屬性為Windowed/Minimized/Maximized/FullScreen/AutomaticVisibility中任意一個都會使得visible屬性為true,即顯示Window
  • 直接修改visible屬性為false,會使得visibility屬性變為Hidden;但是當再次設定visible屬性為true時,visibility屬性會自動設為為原來的值。即從Windowed隱藏後,再次顯示仍是Windowed。
  • 設定visibility屬性為AutomaticVisibility時,會根據執行的平臺不同實際上設定為Windowed/Minimized/Maximized/FullScreen四種中的具體一種,在PC平臺上,會設定為Windowed。

testWindow 

testWindow的結構就比較簡單,執行介面中元素也很少,先看一下程式碼的主結構:

    property var testWindow: Window {
        width: 320
        height: 240
        color: "#215400"
        title: "Test Window with color " + color
        flags: Qt.Window | Qt.WindowFullscreenButtonHint
        Rectangle {}
    }
testWindow中給出了具體的width和height;為了顯示Rectangle,將整個Window的顏色設定為"#215400";設定了視窗的標題為"Test Window with color " + color;最後通過flags設定了視窗的Qt.Window和Qt.WindowFullscreenButtonHint屬性。

Window.flags

The window flags control the window's appearance in the windowing system, whether it's a dialog, popup, or a regular window, and whether it should have a title bar, etc.

通過給Window設定不同的flags,使得其表現出不同的顯示效果來。通過列印,我們得到controlWindow和testWindow的flags分別是:

  • 800F001:Qt::Window|Qt::WindowTitleHint|Qt::WindowSystemMenuHint|Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint
  • 80000001:Qt.Window | Qt.WindowFullscreenButtonHint

其中的Qt.Window不用多講,表示這是一個Window,其它的還有Qt::Widget、Qt::Dialog等等。而對於controlWindow還有Title欄、SystemMenu欄、最小/最大/關閉按鈕,而對於testWindow則是設定了Qt.WindowFullscreenButtonHint標記。而文件中Qt.WindowFullscreenButtonHint標記的說明是“On Mac OS X adds a fullscreen button.”,那麼在Window系統上,testWindow則是相當於只設置了Qt.Window標記。

這裡需要注意的一點是,雖然對於testWindow沒有設定Qt::WindowTitleHint標記,也就是說沒有標題欄,但是為什麼又有title屬性呢?其實title欄位的值除了會顯示在標題欄,還會再底部的工作列處顯示Window的標題,如下圖所示:

testWindow中的子元素

testWindow中的Rectangle中的程式碼結構如下:

        Rectangle {
            anchors.fill: parent
            anchors.margins: defaultSpacing
            Text {}
            MouseArea {}
            Shared.Button {}
            Shared.Button {}
        }
其中涉及的Text、MouseArea以及剛才學習到的Shared.Button都是已經掌握的知識,此處不再贅述,具體的參照執行效果。

總結

本章節學到的知識:

  1. Window的visible和visibility屬性及其改變後的效果
  2. SystemPalette系統調色盤的使用
  3. 自定義控制元件Shared.Button和Shared.CheckBox的使用
  4. 如何在Qml中建立和使用函式
  5. Window中flags使用

這一章實際上就是重點演示了Window的visible和visibility屬性以及改變其值後的表現,並沒有講解和演示Window的各種屬性和設定等等。但是其中使用到的Shared.Button和Shared.CheckBox自定義控制元件卻是一個新知識,該章節中並沒有展開,後面有機會應該詳細學習一下。

相關推薦

QT Demo window(5) window.qml

window.qml的主體結構 window.qml主體是一個QtObject,其中包含了4個子元素:palette、controlWindow、testWindow和splashWindow: QtObject { property real defaultS

QT Demo text

學習了MouseArea,我們繼續選擇一個基本的元件進行學習,這次我們學習text的Demo。 text的Demo位於F:\Qt\Qt5.3.2\Examples\Qt-5.3\quick\text目錄。通過text.qmlproject檔案我們瞭解,該Demo的mainF

QML學習淺談Window

        在Qt Quick的世界裡,Window物件用於建立一個與作業系統相關的頂層視窗,包含了如Text, Rectangle, Image等元素。Window還有一個派生類,即大名鼎鼎

Qt Quick QML 與 C++ 混合編程具體解釋

ack world 避免 pub start 模板方法 另一個 一秒 gis Qt Quick 技術的引入。使得你能夠高速構建 UI ,具有動畫、各種絢麗效果的 UI 都不在話下。但它不是萬能的。也有非常多局限性,原來 Qt 的一些技術,比方低階的網絡編程如 Q

phthon資料視覺化matplotlib在window終端的視覺化xmanger passive方式簡單實現(網上沒找到辦法,自己折騰出來的網際網路第一貼)

如圖配置window的ip   然後securecrt遠端 export DISPLAY=10.0.3.2:0.0   xhost + 測試程式碼 python >>> import matplotlib.pyplot as

git知識總結5——window下配置SSH連線GitHub

git能夠連線github,github做為免費的遠端倉庫 自己到github註冊帳號。 第一步 建立SSH KEY 如果使用的linux,檢查使用者宿主目錄是否有.ssh檔案。如果是windows使用命令  cd ~/.ssh  檢視是否有.ssh目錄。如果沒有則使用命令

Qt Quick QML 與 C++ 混合程式設計詳解

    Qt Quick 技術的引入,使得你能夠快速構建 UI ,具有動畫、各種絢麗效果的 UI 都不在話下。但它不是萬能的,也有很多侷限性,原來 Qt 的一些技術,比如低階的網路程式設計如 QTcpSocket ,多執行緒,又如 XML 文件處理類庫 QXmlStreamR

Android GUIActivity、Window、View

public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCr

Qt 學習路 2(86):QML檢視代理

與 Qt model/view 架構類似,在自定義使用者介面中,代理扮演著重要的角色。模型中的每一個數據項都要通過一個代理向用戶展示,事實上,使用者看到的可視部分就是代理。 每一個代理都可以訪問一系列屬性和附加屬性。這些屬性及附加屬性中,有些來自於資料模

【前端知識點】跨域跨域window.postMessage

window.postMessage() 方法可以安全地實現跨源通訊。通常,對於兩個不同頁面的指令碼,只有當執行它們的頁面位於具有相同的協議(通常為https),埠號(443為https的預設值),以及主機  (兩個頁面的模數 Document.domain設定為相同的值

Qt學習路-簡易畫板5(完成)

昨天做出了滑鼠拖動的雛形,以為可以完美的加到原來的程式上結果發現直接用QPainterPath簡單更多,於是今天就重新寫了份,也是遇到很多問題最後慢慢解決了,在以前的功能上新增了滑鼠選定拖動的功能,並且拖動時有痕跡,效果如下: 程式碼提供下載,類設計的不好,但是很適

Qt 5.9 qml 使用自帶虛擬鍵盤

  Qt有自己的虛擬鍵盤的外掛,使用起來也非常方便,這裡介紹在QtQuick中的使用方法。</> ##鍵盤的整合方式 虛擬鍵盤的整合有兩種方式: 鍵盤出現在桌面,即系統的螢幕上,鍵盤的寬度等於螢幕的寬度,不依賴於app的寬度。 鍵盤嵌入到我們的ap

SparkSparkStreaming案例-Window Operations

Window Operations Spark Streaming還提供了視窗計算,允許您在資料的滑動視窗上應用轉換。 下圖說明了這個滑動視窗。 如圖所示,每當視窗滑過源DStream時,落在視窗內的源RDD被組合並進行操作以產生視窗DStream的RD

QT學習小demoLightMD(MarkDown編輯器)

很早之前就有了寫一個類似Windows記事本的想法,加上最近也剛好在學編譯原理,所以就想把兩者結合起來,於是就打算結合MarkDown,開發一款MarkDown編輯器。 不過由於我之前一直使用的是Java語言居多,對c++並不熟悉,所以一些糟糕的程式碼風格和規範還望各位大佬諒解! LightMD 即一款基

Qt入門基礎篇 ( 二 ) :Qt項目建立、編譯、運行和發布過程解析

qt 5 對話 讓我 進度 qmake ctr deploy 設定 設置 轉載請註明出處:CN_Simo。 題解:   本篇內容主講Qt應用從創建到發布的整個過程,旨在幫助讀者能夠快速走進Qt的世界。   本來計劃是講解Qt源碼靜態編譯,如此的話讀者可能並不能清楚地知

Qt入門基礎篇 ( 一 ) :Qt4及Qt5的下載與安裝

mingw ins 第3版 點擊 調試 但我 關系 構建 eas 轉載請註明出處:CN_Simo. 導語: Qt是一個跨平臺的C++圖形界面應用程序框架。它提供給開發者建立圖形用戶界面所需的功能,廣泛用於開發GUI程序,也可用於開發非GUI程序。Qt很容易擴展,並

Qt Widget 利用 Qt4.5 實現酷炫透明窗體

技術分享 wid 並且 qlabel channel ann event fit attribute 本文講述的是Qt Widget 利用 Qt4.5 實現酷炫透明窗體,QWidget類中的每一個窗口部件都是矩形,並且它們按Z軸順序排列的。一個窗口部件可以被它的父窗口部件或

QT學習forward declaration of 'struct Ui::xxx';invalid use of incomplete struct "Ui::Widget"

文件 exceptio 錯誤 執行 類名 nbsp dia dial truct 解決QT:forward declaration of ‘struct Ui::xxx‘;invalid use of incomplete struct "Ui::Widget" 等莫名奇妙

unity demo坦克攻擊

ges 位置 1-1 旋轉 find destroy city obj 接下來 先展示一下成果吧,節後第一天上班簡直困爆了,所以一定要動下腦子搞點事情。 分析: 1.涉及到的遊戲對象有:坦克,攝像機,場景素材(包含燈光),子彈 2.坦克具有的功能:移動,旋轉,發射子彈

每天一個JS 小demo原生數組splice方法書寫。主要知識點:鍛煉思維邏輯能力,對於數組方法的理解和各種情況的考量

scrip charset 是否 isn 如果 情況 del 當前 cti <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <titl