使用Qt框架實現基於QPainter類的自定義場景圖

2021-01-12 夢話你我他

演示如何使用Qt框架實現基於 QPainter的自定義場景圖項。

"繪製項"示例演示如何使用 QML 場景圖框架使用QPainter 實現自定義場景圖項。

QQuickPaintedItem類是從QQuickItem 派生的類,用於使用 QPainter 接口實現自定義 QML 場景圖形項。

該示例包括項目類、插件類和 QML 文件,以使用此插件。該類表示擴展QQuickPaintedItem的單個文本氣球,該類表示Qt Quick插件的骨架代碼,文件用於加載插件並顯示文本氣球。TextBalloonTextBalloonPlugintextballoons.qml

我們將重點介紹類第一,並繼續文件。有關如何實現Qt快速插件的示例,請查看編寫擴展插件TextBalloontextballoons.qml

文本氣球類聲明

該類繼承自QQuickPaintedItem。QQuickPaintedItem是QML 場景圖框架中所有基於 QPainter 項的基類。TextBalloon

class TextBalloon : public QQuickPaintedItem{Q_OBJECTQ_PROPERTY(bool rightAligned READ isRightAligned WRITE setRightAligned NOTIFY rightAlignedChanged)QML_ELEMENTpublic:TextBalloon(QQuickItem *parent = 0);void paint(QPainter *painter);bool isRightAligned();void setRightAligned(bool rightAligned);private:bool rightAligned;signals:void rightAlignedChanged();};

要實現QQuickPaintedItem,您必須實現 QQuickPaintedIem 的純虛擬函數畫(),該畫實現了類型的繪製。

文本氣球類定義

我們必須確保為 TextBalloon 項初始化正確的對齊屬性。

TextBalloon::TextBalloon(QQuickItem *parent): QQuickPaintedItem(parent), rightAligned(false){}

然後,我們實現由場景圖框架自動調用的函數來繪製項目的內容。函數在局部坐標中繪製項。paint()

void TextBalloon::paint(QPainter *painter){QBrush brush(QColor("#007430"));painter->setBrush(brush);painter->setPen(Qt::NoPen);painter->setRenderHint(QPainter::Antialiasing);QSizeF itemSize = size();painter->drawRoundedRect(0, 0, itemSize.width(), itemSize.height() - 10, 10, 10);if (rightAligned){const QPointF points[3] = {QPointF(itemSize.width() - 10.0, itemSize.height() - 10.0),QPointF(itemSize.width() - 20.0, itemSize.height()),QPointF(itemSize.width() - 30.0, itemSize.height() - 10.0),};painter->drawConvexPolygon(points, 3);}else{const QPointF points[3] = {QPointF(10.0, itemSize.height() - 10.0),QPointF(20.0, itemSize.height()),QPointF(30.0, itemSize.height() - 10.0),};painter->drawConvexPolygon(points, 3);}}

我們從設置筆和筆刷開始定義項目的外觀。之後我們開始繪圖。請注意,根據項目的大小調用內容BoundingRect()項進行繪製。內容BoundingRect() 函數返回的矩形是 QML 文件中定義的項的大小。

文本氣球. qml 文件

接口由兩個主要部分組成。帶文本氣球和控制項按鈕的可滾動區域以添加新氣球。

氣球視圖

ListModel {id: balloonModelListElement {balloonWidth: 200}ListElement {balloonWidth: 120}}ListView {anchors.bottom: controls.topanchors.bottomMargin: 2anchors.top: parent.topid: balloonViewdelegate: TextBalloon {anchors.right: index % 2 == 0 ? undefined : parent.rightheight: 60rightAligned: index % 2 == 0 ? false : truewidth: balloonWidth}model: balloonModelspacing: 5width: parent.width}

氣球模型包含兩種類型在應用程式開始,將由氣球視圖顯示。氣球視圖在左對齊和右對齊之間對 TextBalloon 委託項進行分門不行。

控制

Rectangle {id: controlsanchors.bottom: parent.bottomanchors.left: parent.leftanchors.margins: 1anchors.right: parent.rightborder.width: 2color: "white"height: parent.height * 0.15Text {anchors.centerIn: parenttext: "Add another balloon"}MouseArea {anchors.fill: parenthoverEnabled: trueonClicked: {balloonModel.append({"balloonWidth": Math.floor(Math.random() * 200 + 100)})balloonView.positionViewAtIndex(balloonView.count -1, ListView.End)}onEntered: {parent.color = "#8ac953"}onExited: {parent.color = "white"}}}

UI 的控制項部分包含一個帶MouseArea 的矩形,當滑鼠懸停在滑鼠懸停在它上方時,該矩形會更改顏色。此控制項"按鈕"將新對象添加到具有隨機寬度的模型末尾。

Qt創建基於Widget小部件的應用程式

Qt6對Concurrent並發模塊的更新

C++Qt框架Concurrent並發模塊使用方法

Qt框架流布局QFlowlayout使用實例

Qt 6中網絡模塊的最新更新和修改,以及未來可能的發展方向

#Qt#

相關焦點

  • Qt框架QThread類線程基礎知識
    因此,將工作分發到多個線程可以使程序在多核 CPU 上運行得更快,因為可以使用其他內核。GUI 線程和輔助線程如前所述,每個程序在啟動時都有一個線程。此線程稱為"主線程"(在 Qt應用程式中也稱為"GUI 線程")。Qt GUI 必須在此線程中運行。所有小部件和幾個相關類(例如QPixmap)在輔助線程中不起作用。
  • qt creator連接資料庫並實現用戶登錄和註冊相關的開發源碼詳解
    項目最終實現效果圖具體代碼詳解1 如何給qt界面設置相關的圖片呢?首先我們新建一個基於對話框的程序,名字自己定義即可。其次我們需要將自己的背景圖做好,保存為png或者img或者jpg等相關的格式,然後右鍵點擊creator,選擇添加現有文件,將圖片添加到creator界面如上圖所示。這樣的話,我們的基本文件已經存在了,接下來就是需要調用代碼進行相關的圖像的關聯了。
  • Qt實現圖片翻轉(開源)
    一、思路使用Qt的Graphics View Framework可以非常容易實現翻轉的效果。該框架中的item可以通過設置QGraphicsRotation實現沿x軸、y軸和z軸(垂直於屏幕)方向上的旋轉。再配合上動畫便能達到上圖的效果。二、關鍵代碼1.既然是基於圖形視圖框架,那view是必不可少的。
  • 類似Qt 的「跨平臺 GUI 框架 GOSP」時隔一年有重大更新
    但Qt太重量級了(Qt需要很多的RAM和ROM),因此我開發了GOSP這個框架。GOSP在不依賴Qt的前提下,提供了非常類似Qt的API接口,僅需要幾百KB的硬體資源(比Qt小的多),能運行在Qt不支持的低性能領域(對Qt形成補充),適用於嵌入式開發。
  • Qt框架流布局QFlowlayout使用實例
    Qt 是跨平臺C++圖形界面編程應用程式開發框架。它既可以開發GUI程序,也可用於開發非GUI程序,比如控制臺工具和伺服器。Qt是面向對象的框架,使用特殊的代碼生成擴展(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴展,並且允許真正地組件編程。
  • qt5.12下繼承於Qdialog的類調用slot函數編譯錯誤匯總
    最近由於項目需要,需要使用qt做一套連接資料庫並且實現用戶登錄,註冊的界面,但是做起來卻很費勁,出現了一堆奇怪的編譯錯誤。然後會報出來一堆很基礎的錯誤,如mainwindow類不識別了,qstring類找不到了,即使你有頭文件,但是還是報很多的錯誤。如果是這個錯誤,建議你先使用這個方法:使用vs調試器打開你的代碼,在文件中,找到高級保存選項,將代碼保存為代籤名的,然後保存。
  • 手擼rpc框架,並基於spring進行二次註解開發
    (二)、rpc_api代碼很簡單,定義服務端提供的api即可,使用自定義註解@RpcServiceAPIpackage com.zte;(如同mybatis中使用@AutoWired UserDao dao一樣,雖然我們只定義了接口,但是依然可以使用它的方法,原因就是因為,spring將mybatis生成的動態代理類注入了。)
  • 基於人類獨特性,實現自由人像實例分割檢測
    圖1 使用人體姿勢比邊框更容易分割高度本文將回顧《pose2seg:自由檢測人像實例分割》這篇論文。在這篇論文中,作者介紹了一種新型基於姿勢的人像實例分割框架,可基於人體姿勢來分離圖像實例。直覺Pose2Seg背後的產生原因是儘管一般對象實例分割方法運作良好,但這些工作大部分基於強大的物體檢測。也就是說,首先生成大量建議局域,然後使用非極大值抑制(NMS)刪除冗餘區域,如圖3所示。圖3(左)在非極大值抑制前,(右)在使用非極大值抑制之後。當同類的兩個事物有很大面積的重疊,NMS會將其當作冗餘的候選區域,然後將它刪除。
  • 如何在Web應用中實現Velocity 與Struts2框架相互集成的應用實例
    在Struts 2應用框架中集成Velocity模板引擎的實現過程比在Struts應用框架中集成Velocity模板引擎要簡單的多,因為Struts 2應用框架系統內帶有對Velocity模板引擎的技術支持。
  • 如何在Web應用中實現Velocity 與Struts 框架相互集成的應用實例
    2、VelocityStruts系統包文件和用於 VelocityStruts 集成的各種工具由於在Velocity模板引擎系統中沒有提供類似於Struts應用框架標籤庫中的各個功能標籤,而替代的方式是採用toolbox.xml定義文件自定義工具類,這些工具類可以直接在Velocity模板引擎的模板頁面中使用
  • API統一、乾淨,新型EagerPy實現多框架無縫銜接
    選自arXiv編輯:杜偉、小舟這個新型 Python 框架對庫開發者和用戶都大有裨益。近年來,深度學習領域的進展與深度學習框架的開發同步進行。這些框架為自動微分和 GPU 加速提供了高級且高效的 API,從而可以利用相對較少和簡單的代碼實現極度複雜和強大的深度學習模型。
  • Hyperf 發布 v2.0.22 版本,企業級的 PHP 微服務雲原生協程框架
    建議用戶使用以下命令更新此版本。composer update "hyperf/*" -o直接訪問 官網 hyperf.io 或 文檔 hyperf.wiki 查看更新內容新增 #2896 允許 view-engine 組件配置自定義加載類組件和匿名組件。
  • 飛槳深度學習開源框架2.0搶先看:成熟完備的動態圖開發模式
    同時在該版本中將默認的開發模式定為動態圖模式,滿足用戶直接使用該模式完成計算機視覺、自然語言處理、語音、推薦等全場景的AI算法開發。可見飛槳團隊對採用動態圖模式開發的成熟度,以及未來主力推廣應用有著強大的自信和期待。為什麼飛槳在開發模式升級上持續大量投入?
  • MXFlutter:基於JS的Flutter框架,用JS也能寫出Flutter應用
    MXFlutter Team開源許可協議:MIT項目地址:https://gitee.com/huoxd/MXFlutter項目簡介MXFlutter 是一套基於JavaScript 的 Flutter 框架,可以用極其類似 Dart 的開發方式,通過編寫 JavaScript 代碼,來開發 Flutter 應用,或者使用 mxjsbuilder 編譯器,把現有Flutter 工程編譯為JS,運行在 mxflutter 之上。
  • ...首個自動圖機器學習工具包AutoGL,開源易用可擴展,支持自定義模型
    AutoGL 工具包首先使用 AutoGL Dataset 維護圖機器學習任務所需數據集。AutoGL Dataset 導入了 和圖神經網絡庫 PyTorch Geometric (PyG) 中的數據集模塊,並添加對 的支持,同時還添加了一些支持以便集成 auto solver 框架。
  • 戰歌競技場自定義英雄是什麼意思 自定義英雄使用方法[多圖]
    ,很多玩家都不知道如何使用,那麼自定義英雄該怎麼操作呢,接下來18183小陳為大家介紹戰歌競技場自定義英雄使用方法。 《戰歌競技場》的特色系統也給棋手大大們帶來了更多驚喜,「自定義英雄」、「師徒系統」、「棋魂系統」全面優化上新。
  • 為你Springboot項目自定義一個通用的異常(實用乾貨)
    如果我們定義一個標準的異常處理體系。並在所有的服務中使用。那樣開發起來就可以快速定位。頁面也會更加的簡單和直觀。本文開發環境基於springboot2.4,IDE環境是IDEA。這裡從一個最簡單的異常案例。逐步過渡到完全自定義自己的異常。案例:Springboot查詢資料庫數據,發現返回的是null,就拋出異常。OK,基於這個思想,看一下實現的思路。
  • QT環境開發下根據excel表格導入數據源碼
    將excel表格中的內容進行讀取---qt下excel表格相關的開發//插入新數據for (int i = nStartRow + 1, r = 0; i < rowcnt; i++, r++ )
  • 從曠視開源自研深度學習框架 看曠視商業進化的底層邏輯
    自公司創辦以來,曠視一直奔跑在AI的主流賽道上,並形成了眾多基於核心AI算法的硬體、軟體、解決方案。但曠視唐文斌認為,真正影響產業跑速的不是算法、不是軟體和硬體,也不是解決方案,而是AI的基礎設施。唐文斌指出:」AI的基礎設施只有兩部分組成—— 晶片平臺和生產力平臺。「 其中,晶片平臺承載AI的計算,那麼AI生產力該如何理解?
  • 飛槳框架高層API,一起輕鬆玩轉AI
    為了簡化深度學習的學習過程、降低深度學習的開發難度,百度飛槳框架歷經近一年的打磨,不斷地優化深度學習 API,並針對開發者的使用場景進行封裝,在飛槳框架的最新版本中,推出了高低融合、科學統一的飛槳全新 API 體系。飛槳框架將 API 分為兩種,基礎 API 和高層 API。