qml demo分析(customgeometry-貝塞爾曲線)

一、效果展示

  本篇文章還是帶來一個簡單的qt示例分析,且看圖1效果。

圖1 貝塞爾曲線

二、源碼分析

  該示例代碼所在目錄quick\scenegraph\customgeometry,感興趣的同學可以自己去找,這篇文章我還是主要講解源碼,不涉及其他方面。

  廢話不多述,下面開始源碼剖析。本篇講解的示例看似簡單,卻是在C++和qml之間的一座橋梁,他告訴我們C++和qml是怎么混合編程的,在這篇文章中有幾個重要的函數或者宏,例如:qmlRegisterType、Q_PROPERTY。

  1、main文件

 1 int main(int argc, char **argv)
 2 {
 3     QGuiApplication app(argc, argv);
 4 
 5     qmlRegisterType<BezierCurve>("CustomGeometry", 1, 0, "BezierCurve");//注冊自定義Quick控件到qml系統環境中
 6 
 7     QQuickView view;
 8     QSurfaceFormat format = view.format();
 9     format.setSamples(16);
10     view.setFormat(format);
11     view.setSource(QUrl("qrc:///scenegraph/customgeometry/main.qml"));
12     view.show();
13 
14     app.exec();
15 }

  上述代碼第5行使用了qmlRegisterType函數將C++中自定義的QQuickItem類型注冊到qml環境中,4個參數分別是:包名、主版本號、子版本號和控件名稱

  qml文件可以通過QQuickView對象來加載,并展示。參考Qml文件的兩種加載方式|啟動Qt quick app的兩種方法

  2、自定義QQuickItem類型

 1 class BezierCurve : public QQuickItem
 2 {
 3     Q_OBJECT
 4 
 5     Q_PROPERTY(QPointF p1 READ p1 WRITE setP1 NOTIFY p1Changed)//使用Q_PROPERTY進行聲明的宏可以通過屬性系統進行操作,例如qss中qproperty-p1:1,1  qml中p1: Qt.point(0, 1)
 6     Q_PROPERTY(QPointF p2 READ p2 WRITE setP2 NOTIFY p2Changed)
 7     Q_PROPERTY(QPointF p3 READ p3 WRITE setP3 NOTIFY p3Changed)
 8     Q_PROPERTY(QPointF p4 READ p4 WRITE setP4 NOTIFY p4Changed)
 9 
10     Q_PROPERTY(int segmentCount READ segmentCount WRITE setSegmentCount NOTIFY segmentCountChanged)//WRITE操作之后,發生NOTIFY指定的信號
11 
12 public:
13     BezierCurve(QQuickItem *parent = 0);
14     ~BezierCurve();
15 
16 //! [2]
17     QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);//qml文件中通過SequentialAnimation動畫修改p2和p3的值,并觸發update函數
18 //! [2]
19 
20     QPointF p1() const { return m_p1; }
21     QPointF p2() const { return m_p2; }
22     QPointF p3() const { return m_p3; }
23     QPointF p4() const { return m_p4; }
24 
25     int segmentCount() const { return m_segmentCount; }
26 
27     void setP1(const QPointF &p);
28     void setP2(const QPointF &p);
29     void setP3(const QPointF &p);
30     void setP4(const QPointF &p);
31 
32     void setSegmentCount(int count);
33 
34 signals:
35     void p1Changed(const QPointF &p);
36     void p2Changed(const QPointF &p);
37     void p3Changed(const QPointF &p);
38     void p4Changed(const QPointF &p);
39 
40     void segmentCountChanged(int count);
41 
42 private:
43     QPointF m_p1;
44     QPointF m_p2;
45     QPointF m_p3;
46     QPointF m_p4;
47 
48     int m_segmentCount;
49 };

  自定義QQuickItem類型頭文件函數中第5-8行都使用了Q_PROPERTY宏,該宏的作用是成員p可以用個p接口訪問、通過setP接口設置,當成員p發生變化的時候會有pChanged信號發出。訪問接口在頭文件中已經實現,下邊我們看一個設置接口的實現

1 void BezierCurve::setP1(const QPointF &p)
2 {
3     if (p == m_p1)
4         return;
5 
6     m_p1 = p;
7     emit p1Changed(p);
8     update();
9 }

  設置接口也相對簡單,當調用該接口的時候,發出指定信號。

  3、qml文件中使用自定義類型

 1 import QtQuick 2.0
 2 import CustomGeometry 1.0 //導入自定義包
 3 //! [1] //! [2]
 4 Item {
 5     width: 300
 6     height: 200
 7 
 8     BezierCurve {//直接使用控件名稱   導入方式也可以改為import CustomGeometry 1.0 as MyCustom,那么控件使用方式改為MyCustom.BezierCurve
 9         id: line
10         anchors.fill: parent
11         anchors.margins: 20
12 //! [2] //! [3]
13         property real t//自定義屬性
14         SequentialAnimation on t {//執行順序動畫
15             NumberAnimation { to: 1; duration: 2000; easing.type: Easing.InOutQuad }
16             NumberAnimation { to: 0; duration: 2000; easing.type: Easing.InOutQuad }
17             loops: Animation.Infinite//無限循環
18         }
19 
20         p2: Qt.point(t, 1 - t)//只有通過Q_PROPERTY宏聲明過的屬性才可以這樣訪問
21         p3: Qt.point(1 - t, t)
22     }
23 //! [3] //! [4]
24     Text {
25         anchors.bottom: line.bottom
26 
27         x: 20
28         width: parent.width - 40
29         wrapMode: Text.WordWrap
30 
31         text: "This curve is a custom scene graph item, implemented using GL_LINE_STRIP"
32     }
33 }

總結:理解qmlRegisterType、Q_PROPERTY的功能非常重要, 他們是你學習qml很重要的一個環節。個人覺著C++和qml混編是一個趨勢,雖然QWidget目前開發比較流行,但視圖模型分離會讓開發效率更高效。

?

注:該文章是個人學習之用,僅供參考。錯誤之處還請大家諒解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457167.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457167.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457167.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php 打包上傳的文件,PHP單文件上傳原理及上傳函數的打包

PHP單文件上傳原理及上傳函數的封裝服務器(臨時文件)——>指定目錄,當文件進入服務器時它就是臨時文件了,這時操作中要用臨時文件的名稱tmp_name。//在客戶端設置上傳文件的限制(文件類型和大小)是不安全的&#xff0c;因為客戶能通過源代碼修改限制&#xff0c;所以在服務端…

celery AttributeError: 'str' object has no attribute 'items'

AttributeError: str object has no attribute items python manage.py celery worker --loglevelinfo 查了好久發現原來是因為以前下的redis版本過高&#xff08; 3.0.1 &#xff09;&#xff0c;重裝redis pip install redis2.10.6

equals和==的區別(轉)

基本數據類型&#xff0c;也稱原始數據類型。byte,short,char,int,long,float,double,boolean&#xff0c;他們之間的比較&#xff0c;應用雙等號&#xff08;&#xff09;,比較的是他們的值。 復合數據類型(類) 當他們用&#xff08;&#xff09;進行比較的時候&#xff0c;…

Python 中的range,以及numpy包中的arange函數

range函數函數說明&#xff1a; range(start, stop[, step]) -> range object&#xff0c;根據start與stop指定的范圍以及step設定的步長&#xff0c;生成一個序列。  參數含義&#xff1a;start:計數從start開始。默認是從0開始。例如range&#xff08;5&#xff09;等價…

php角色權限安全,php – 安全的chmod權限?

新創建的文件和目錄的默認權限由umask環境變量設置.文件的所有者和root可以更改權限.如果您不需要在應用程序中使用chmod,請將其保留在禁用列表中.你應該看看安全性的方式是&#xff1a;現在比我更聰明的人讓chmod成為我應用程序中更安全的部分之一.因此,我將花費我的時間使其他…

namespace! 報錯

在工程文件中url 定義namespace需要 from django.contrib import admin from django.urls import path,include from django.conf.urls import url urlpatterns [path(admin/, admin.site.urls),url(r^liu/,include(myApp.urls,namespaceapp)), ] 在myApp 的urls中 加這句 a…

test.php.bak,MongoDB熱備份工具:解決官方版備份缺陷

賀春旸&#xff0c;凡普金科DBA團隊負責人&#xff0c;《MySQL管理之道&#xff1a;性能調優、高可用與監控》第一、二版作者&#xff0c;曾任職于中國移動飛信、安卓機鋒網。致力于MariaDB、MongoDB等開源技術的研究&#xff0c;主要負責數據庫性能調優、監控和架構設計。工具…

zookeeper工作原理、安裝配置、工具命令簡介

1 Zookeeper簡介Zookeeper 是分布式服務框架&#xff0c;主要是用來解決分布式應用中經常遇到的一些數據管理問題&#xff0c;如&#xff1a;統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等等。 ZooKeeper是一個分布式的&#xff0c;開放源碼的分布式應用程序…

流式大數據處理的三種框架:Storm,Spark和Samza

許多分布式計算系統都可以實時或接近實時地處理大數據流。本文將對三種Apache框架分別進行簡單介紹&#xff0c;然后嘗試快速、高度概述其異同。 Apache Storm 在Storm中&#xff0c;先要設計一個用于實時計算的圖狀結構&#xff0c;我們稱之為拓撲&#xff08;topology&#x…

models.ForeignKey( ,on_delete=models.CASCADE)? ? # 關聯外鍵

# 關聯外鍵 sgrade models.ForeignKey("Grades",on_deletemodels.CASCADE) 版本跟新后忘記加on_deletemodels.CASCADE 報錯困擾了很久 多讀報錯信息 from django.db import models# Create your models here. class Grades(models.Model):gname models.Cha…

java 產生無重復的隨機數,Java創建無重復的隨機數

小編典典最簡單的方法是創建一個可能數字的列表(1..20或任何數字)&#xff0c;然后用對其進行混洗Collections.shuffle。然后&#xff0c;只需考慮你想要的許多元素。如果你的范圍最終等于你需要的元素數量(例如&#xff0c;用于洗牌的卡片)&#xff0c;則這非常好。如果你想要…

linux_bash_shell_cheat_sheet(自譯)

【說明】 發現錯誤或不足請務必聯系我&#xff01;&#xff01;&#xff01; linux_bash_shell_cheat_sheet.pdf &#xff08;英文原本以及譯本下載&#xff0c;鏈接失效請私信或郵箱聯系&#xff09; 轉載于:https://www.cnblogs.com/15ho/p/5947534.html

Day04-循環和列表

循環和列表 一、循環(***) 1.1 概念 廣義&#xff1a;一個周期現象或者重復出現的情況&#xff0c;這種狀態被稱為循環 狹義&#xff1a;在滿足條件的情況下&#xff0c;反復執行某一段代碼&#xff0c;在編程語言中出現的這種現象被稱為循環。被反復執行的這段代碼被稱為循環…

熱血街頭Java,下載_我愛法語 V3.01 多國語言版_6z6z下載站

我愛法語是一款功能強大的法語電子詞典工具。融合了法漢&#xff0c;漢法&#xff0c;法法&#xff0c;英法&#xff0c;法英&#xff0c;英漢&#xff0c;法意等各類詞庫。該工具使用靈活&#xff0c;操作簡單&#xff0c;充分吸收了法漢、漢法、法法、英法、法英、英漢、法意…

【demo練習二】:WPF依賴屬性的練習

2016-10-11 依賴屬性demo小樣&#xff1a; 要求&#xff1a;在窗口中點擊按鈕&#xff0c;利用設置“依賴屬性”把Label和TextBox控件里的屬性值進行改變。 MainWindow.xaml代碼&#xff1a; <Window x:Class"依賴屬性1.MainWindow" xmlns"http://schemas.m…

BZOJ 1087 [SCOI2005]互不侵犯King ——狀壓DP

【題目分析】 沉迷水題&#xff0c;吃棗藥丸。 【代碼】 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int ij;i<k;i) #define ll long long int cot[512],c1[512]…

Django中object.all

前言 先拋出一個問題。銀行就相當于一個數據庫&#xff0c;你去銀行取錢存錢辦卡銷卡&#xff0c;是你告訴銀行柜員方便還是你自己去操作電腦辦卡取卡方便&#xff1f;&#xff08;你還不一定會&#xff0c;假設自動存款機還沒發明&#xff09;&#xff0c;object在數據庫中就…

java中為什么設計包裝類,Java 中為什么要設計包裝類

最近文章更新頻率慢了&#xff0c;因為最近在準備暑期實習&#xff0c;之前尋思著一邊復習一邊寫文章&#xff0c;兩全其美。后來發現一篇讀起來比較舒服的文章寫出來加上配圖得花上四五個小時甚至更多&#xff0c;但這個知識點我可能半個小時就能復習完了&#xff0c;春招在即…

bfc

BFC 已經是一個耳聽熟聞的詞語了&#xff0c;網上有許多關于 BFC 的文章&#xff0c;介紹了如何觸發 BFC 以及 BFC 的一些用處&#xff08;如清浮動&#xff0c;防止 margin 重疊等&#xff09;。雖然我知道如何利用 BFC 解決這些問題&#xff0c;但當別人問我 BFC 是什么&…

Python語法異常 Exception

常見異常&#xff1a;Exception 所有異常的基類AttributeError 特性應用或賦值失敗時引發IOError 試圖打開不存在的文件時引發IndexError 在使用序列中不存在的索引時引發KeyError …