1. 程式人生 > >Qt:讓QML中的控制元件自動縮放

Qt:讓QML中的控制元件自動縮放

為了讓QML開發的程式適應更多的裝置,我們可能需要去縮放Item,但是手動縮放開發太耗時還容易出錯,所以我封裝了一下

效果是根據開發時的x、y、width、height自動縮放的擴充套件

效果(3個效果是引數不同組合的結果):

正常情況下


拉寬


拉長


拉大


AutoResize.qml程式碼:

import QtQuick 2.4

Item {
    property var targetItem: parent
    property bool fixedAspectRatio: true // Else zoom from width and height
    property bool accordingToX: true // Else according to center

    property var targetItemGeometry
    property var childrenItemGeometry

    property bool isBegin: false

    function begin() {
        targetItemGeometry = new Object;
        targetItemGeometry["width"] = targetItem.width;
        targetItemGeometry["height"] = targetItem.height;

        var children = targetItem.children;
        var data = new Array;
        for(var index = 1; index < children.length; index++)
        {
            var currentItem = children[index];
            var buf = new Object;

            buf["item"] = currentItem;
            buf["x"] = currentItem.x;
            buf["y"] = currentItem.y;
            buf["centerX"] = currentItem.x + (currentItem.width / 2);
            buf["centerY"] = currentItem.y + (currentItem.height / 2);
            buf["width"] = currentItem.width;
            buf["height"] = currentItem.height;

            data.push(buf);
        }

        childrenItemGeometry = data;
        isBegin = true;
    }

    function resize() {
        if(isBegin)
        {
            var horizontalRatio, verticalRatio;

            horizontalRatio = targetItem.width / targetItemGeometry["width"];
            verticalRatio = targetItem.height / targetItemGeometry["height"];

            for(var index = 0; index < childrenItemGeometry.length; index++)
            {
                if(fixedAspectRatio)
                {
                    if(horizontalRatio > verticalRatio)
                    {
                        childrenItemGeometry[index]["item"].width  = childrenItemGeometry[index]["width"] * verticalRatio;
                        childrenItemGeometry[index]["item"].height = childrenItemGeometry[index]["height"] * verticalRatio;
                    }
                    else
                    {
                        childrenItemGeometry[index]["item"].width  = childrenItemGeometry[index]["width"] * horizontalRatio;
                        childrenItemGeometry[index]["item"].height = childrenItemGeometry[index]["height"] * horizontalRatio;
                    }
                }
                else
                {
                    childrenItemGeometry[index]["item"].width  = childrenItemGeometry[index]["width"] * horizontalRatio;
                    childrenItemGeometry[index]["item"].height = childrenItemGeometry[index]["height"] * verticalRatio;
                }

                if(accordingToX)
                {
                    childrenItemGeometry[index]["item"].x = childrenItemGeometry[index]["x"] * horizontalRatio;
                    childrenItemGeometry[index]["item"].y = childrenItemGeometry[index]["y"] * verticalRatio;
                }
                else
                {
                    childrenItemGeometry[index]["item"].x = childrenItemGeometry[index]["centerX"] * horizontalRatio - (childrenItemGeometry[index]["item"].width / 2);
                    childrenItemGeometry[index]["item"].y = childrenItemGeometry[index]["centerY"] * verticalRatio - (childrenItemGeometry[index]["item"].height / 2);
                }
            }
        }
    }

    Component.onCompleted: {
        begin();
    }

    Component {
        id: connections

        Connections {
            target: targetItem

            onWidthChanged: {
                resize();
            }
            onHeightChanged:
            {
                resize();
            }
        }
    }

    Loader {
        Component.onCompleted: {
            sourceComponent = connections;
        }
    }
}


使用:

 Rectangle {
        width: parent.width / 2
        height: parent.height / 2
        color: "#00000000"

        AutoResize {
            fixedAspectRatio: true
            accordingToX: true
        }

        Rectangle {
            x: 15
            y: 10
            width: 80
            height: 200
            color: "#ff0000"
        }

        Rectangle {
            x: 15
            y: 210
            width: 200
            height: 80
            color: "#00ff00"
        }

        Rectangle {
            x: 124
            y: 43
            width: 247
            height: 20
            color: "#0000ff"
        }

        Rectangle {
            x: 242
            y: 140
            width: 150
            height: 150
            color: "#000000"
        }
    }


只要把AutoResize直接以例項化出來就可以了

注意:AutoResize建議放在第一個子控制元件的位置,不然可能會報錯而且需要手動初始化

引數說明:

fixedAspectRatio:固定長寬比,否則根據父物件長寬比縮放,預設true

accordingToX:根據X軸調整位置,否則根據中心點調整位置,預設true

示例下載地址:

相關推薦

QtQML控制元件自動

為了讓QML開發的程式適應更多的裝置,我們可能需要去縮放Item,但是手動縮放開發太耗時還容易出錯,所以我封裝了一下 效果是根據開發時的x、y、width、height自動縮放的擴充套件 效果(3個效果是引數不同組合的結果): 正常情況下 拉寬 拉長 拉大 A

MFCpicture控制元件,將bitmap根據控制元件大小

直接在OnInitDialog()函式中新增即可; CRect rc; m_ctrlPic.GetClientRect(&rc); CDC* pdcpic = m_ctrlPic.GetDC(); //m_ctrlPic是Picture控制元件的變數

Android仿微信朋友圈高清圖檢視控制元件、雙擊、移動

該庫支援和包含的功能: 1.圖片支援手勢操作, 可縮放、雙擊、移動 2.圖片載入時的進度條, 支援自定義 該庫的效果圖如下: 本地相簿圖片效果圖: 點選預覽大圖的效果 本想直接新增gradle依賴庫,不巧的是,之前版本已作廢,待現在版本穩定後,

iOS控制元件,平移,旋轉和回到原點

<span style="font-family:Verdana;"><span style="font-family:Microsoft YaHei;"><span style="font-family:Microsoft YaHei;"&g

Qt學習筆記把QtQuick作為控制元件嵌入到QtWidgets

環境 系統:Windows10 64位 家庭中文版 Qt版本:5.6.0 msvc2013 64位 編譯器:Visual Studio 2013 專業版 目的 把用QML實現的介面嵌入到QtWidget,同時實現對QML屬性的設定。 步驟 1.把要實現的QML視窗設計

BCGControlBar教程如何將MFC控制元件的BCGControlBarBCGSuite新增到對話方塊

BCGControlBar Pro for MFC最新試用版下載請猛戳>>> 如果您正在使用我們的Windows窗體產品,那麼將我們的控制元件新增到窗體是沒有問題的:只需從Visual Studio工具箱中拖動所需的專案並將其放入窗體即可。在對話方塊中新增非標準控制元件需要一些

Qt QListWidget QTreeWidget QComboBox等控制元件,禁用滾動條的右鍵選單

有時候在開發新控制元件的時候,會偶然點到滾動條的右鍵選單,出現之後很難看 那麼怎麼去掉呢? 其實很簡單,如果是QListWidget ,QTreeWidget控制元件, //記得包含標頭檔案 #i

ApolloStudio高手之路(6)用Python以極簡方式讀寫OPC DA、OPC UA資料並實現UI控制元件自動繫結重新整理顯示

OPC(OLE for Process Control, 用於過程控制的OLE)是一個工業標準,OPC是為了連線資料來源(OPC伺服器)和資料的使用者(OPC應用程式)之間的軟體介面標準。資料來源可以是PLC,DCS,條形碼讀取器等控制裝置。隨控制系統構成的不同,作為資料來源的OPC伺服器既可以

QTQT的學習QML使用AJAX向某伺服器傳送請求獲取資料

(1)準備Ajax.js // GET function get(url, success, failure) { var xhr = new XMLHttpRequest; xhr.open("GET", url); xhr.onreadyst

QT程式碼與設計器控制元件訊號與SLOT連線

  雙擊testqt.ui 託一個push button到窗體中,雙擊,可以輸入字元 按F4或 menu->edit->edit signals/slots 定義SLOT 選擇已定義好的SLOT,點確定就可以進行關聯了。 定義自定義SLO

[WPF] 第一個資料驗證出錯(Validation.HasError)的控制元件自動獲得焦點

## 1. 需求 在上一篇文章 《[在 ViewModel 中讓資料驗證出錯(Validation.HasError)的控制元件獲得焦點](https://www.cnblogs.com/dino623/p/focus_controls_in_ViewModel.html)》中介紹瞭如何讓 Validati

高階控制元件 自動提示文字框與下拉列表

一、 高階控制元件使用步驟 1 、獲取資料 2 、建立介面卡 3 、繫結介面卡 二、自動提示文字框 1 、AutoCompleteTextView(單一提示) android:completionThreshold=”1” 2 、MultiAutoCompleteTextV

vs-code,react元件自動補全外掛的配置

react元件自動補全外掛:  輸入rcc,按tab鍵    ②    外掛截圖: ③   外掛的配置: 點選檔案-首選項-設定:點選後會是以下介面 然後點選那三個點---"開啟sett

WPF 獲取 ListView DataTemplate 控制元件

原文: WPF 獲取 ListView DataTemplate 中控制元件值 RT 雖然DataTemplate 是用來繫結的,一般用ONE TWOWAY 來繫結傳遞或獲取資料. 但是今天這個需求真是沒辦法,在繫結的模板內添加了一個非繫結的資料,需要手動取值. 解決方案原理:

MFC OnPaint控制元件繪圖,覆蓋重疊的控制元件

對話方塊上又兩個控制元件,一個static控制元件SS_BITMAP屬性,用來繪圖(canvas),一個static控制元件SS_BITMAP屬性,用來顯示圖片(tool),tool和canvas有重疊部分,為了使canvas在重新整理後不至於消失,我在OnPaint中採用雙緩衝繪圖方式重新整理內容

RxSwiftDriver與UI控制元件初體驗

輸入電話號碼的區號和八位數主體號碼,下面的Label實時更新最新的輸入,如果區號為3位數,點選按鈕,按鈕名字變成“變!” Ps:目前還不會,同時滿足上面兩位,下面三位的的約束,以後會更新的 檔名:ViewController.swift // // ViewController.swi

android開發自定義組合控制元件

內容介紹 本文記錄,自定義組合控制元件,為了可以程式碼複用,減少程式碼量 配置控制元件屬性檔案 開啟res/values/目錄下的arss.xml檔案,新增下面屬性程式碼,如果沒有建立arrs.xml檔案。 <?xml version="1.0" enc

iOS開發常用的UIView控制元件——UILabel、UITextField、UIButton

前面幾篇文章已經對iOS開發中比較基本的幾個檔案進行了瞭解,今天主要學習StoryBoard檔案和幾個常見的UI控制元件。 Storyboard功能是在iOS5開始新增的功能,一種新技術的出現大多是為了彌補舊技術的不足,而在storyboard之前iOS 開發設計介面是使用nib檔案(xib

手機顯示資料的原理手機通過WebView控制元件顯示網頁資料

WebView控制元件是用於顯示網頁的,手機根據網頁建立一個WebView,之後顯示出來,所以顯示WebView網頁是通過WebView控制元件顯示的。     <script type="text/javascript" charset="utf-8

BootStrap兩個控制元件在一行顯示(label和input同行)

1 、新增class=“form-inline” <div class="row"> <div> <label class="form-inline" />參加單位: