1. 程式人生 > >QT畫線教程(GraphicsViewFramework)

QT畫線教程(GraphicsViewFramework)

現在基本上也已經到了2D繪圖部分的尾聲,所謂重頭戲都是在最後壓軸的,現在我們就要來看看在繪圖部分功能最強大的Graphics View。我們經常說KDE桌面,新版本的KDE桌面就是建立在Graphics View的基礎之上,可見其強大之處。 Qt的白皮書裡面這樣寫道:“Qt Graphics View 提供了用於管理和互動大量定製的 2D 圖形物件的平面以及視覺化顯示物件的檢視 widget,並支援縮放和旋轉功能。Graphics View 使用 BSP(二進位制空間劃分)樹形可非常快速地找到物件,因此即使是包含百萬個物件的大型場景,也能實時圖形化顯示。” Graphics View是一個基於item的M-V架構的框架。 基於item意思是,它的每一個元件都是一個item。這是與QPainter的狀態機不同。回憶一下,使用QPainter繪圖多是採用一種面向過程的描述方式,首先使用drawLine()畫一條直線,然後使用drawPolygon()畫一個多邊形;而對於Graphics View來說,相同的過程可以是,首先建立一個場景scene,然後建立一個line物件和一個polygon物件,再使用scene的add()函式將line和polygon新增到scene,最後通過視口view就可以看到了。乍看起來,後者似乎更加複雜,但是,如果你的影象中包含了成千上萬的直線、多邊形之類,管理這些物件要比管理QPainter的draw語句容易得多。並且,這些圖形物件也更加符合面向物件的設計要求:一個很複雜的圖形可以很方便的複用。 M-V架構的意思是,Graphics View提供一個model和一個view。所謂model就是我們新增的種種物件,所謂view就是我們觀察這些物件的視口。同一個model可以由很多view從不同的角度進行觀察,這是很常見的需求。使用QPainter就很難實現這一點,這需要很複雜的計算,而Qt的Graphics View就可以很容易的實現。 Graphics View提供了一個QGraphicsScene作為場景,即是我們新增圖形的空間,相當於整個世界;一個QGraphicsView作為視口,也就是我們觀察的視窗,相當於照相機的取景框,這個取景框可以覆蓋整個場景,也可以是場景的一部分;一些QGraphicsItem作為圖形元件,以便scene新增,Qt內建了很多圖形,比如line、polygon等,都是繼承自QGraphicsItem。 下面我們來看一下程式碼:
#include <QtGui> 
 
class DrawApp : public QWidget { 
public
        DrawApp(); 
protected
        void paintEvent(QPaintEvent *event); 
}; 
 
DrawApp::DrawApp() 

 

 
void DrawApp::paintEvent(QPaintEvent *event

        QPainter painter(this); 
        painter.drawLine(10, 10, 150, 300); 

 
int main(int
 argc, char *argv[]) 

        QApplication a(argc, argv); 
        QGraphicsScene *scene = new QGraphicsScene; 
        scene->addLine(10, 10, 150, 300); 
        QGraphicsView *view = new QGraphicsView(scene); 
        view->resize(500, 500); 
        view->setWindowTitle("Graphics View"); 
        view->show(); 
 
        DrawApp *da = new DrawApp; 
        da->resize(500, 500); 
        da->setWindowTitle("QWidget"); 
        da->show(); 
        return a.exec(); 
} 為了突出重點,我們就直接include了QtGui,不過在實際應用中不建議這麼做。這裡提供了直線的兩種實現:一個是DrawApp使用我們前面介紹的技術,重寫paintEvent()函式,這裡就不在贅述,重點來看main()函式裡面的實現。 首先,我們建立了一個QGraphicsScene作為場景,然後在scene中添加了一個直線,這樣就把我們需要的圖形元件放到了scene中。然後建立一個QGraphicsView物件進行觀察。就這樣,我們就是用Graphics View搭建了一個最簡單的應用。執行這個程式來看結果: 第一張圖是Graphics View的,第二個是DrawApp的。雖然這兩個直線是同樣的座標,但是,DrawApp按照原始座標繪製出了直線,而Graphics View則按照座標繪製出直線之後,自動將直線居中顯示在view視口。你可以通過拖動Graphics View來看直線是一直居中顯示的。 這裡僅僅是一個很簡單的對比,不過你已經可以看到Graphics View功能的強大。僅這一個居中的操作,如果你是用QPainter,就需要很大的計算量了!當然,如果你不需要這種居中,Graphics View也是可以像QPainter繪製的一樣進行顯示的。

相關推薦

QT教程GraphicsViewFramework

現在基本上也已經到了2D繪圖部分的尾聲,所謂重頭戲都是在最後壓軸的,現在我們就要來看看在繪圖部分功能最強大的Graphics View。我們經常說KDE桌面,新版本的KDE桌面就是建立在Graphics View的基礎之上,可見其強大之處。 Qt的白皮書裡面這樣寫道:

Qt 3D教程初步顯示3D的內容

初始 應用 frame 通過 net settings mod rgba bsp Qt3D教程(二)初步顯示3D的內容 前一篇很easy,全然就沒有牽涉到3D的內容,它僅僅是我們搭建3D應用的基本框架而已,而這一篇。我們將要利用它來初步地顯示3D

SpringCloud 教程 消息總(Spring Cloud Bus)

.html nco mile 你會 ava arp try nap 圖片 Spring Cloud Bus 將分布式的節點用輕量的消息代理連接起來。它可以用於廣播配置文件的更改或者服務之間的通訊,也可以用於監控。本文要講述的是用Spring Cloud Bus實現通知微服務

互聯網架構多程並發編程高級教程

rri service 累加 機制 jms exceptio 模式 設置 擁有 基礎篇幅:線程基礎知識、並發安全性、JDK鎖相關知識、線程間的通訊機制、JDK提供的原子類、並發容器、線程池相關知識點 高級篇幅:ReentrantLock源碼分析、對比兩者源碼,更加深入理解讀

互聯網架構多程並發編程高級教程

並發 取模 守護 事務 分段 喚醒 提升 程序 服務 #基礎篇幅:線程基礎知識、並發安全性、JDK鎖相關知識、線程間的通訊機制、JDK提供的原子類、並發容器、線程池相關知識點? #高級篇幅:ReentrantLock源碼分析、對比兩者源碼,更加深入理解讀寫鎖,JAVA內存模

QT中使用OpenGL1——一個三角形

QOpenGLBuffer QT提供給我們使用OpenGL緩衝區的輔助類,使用此類由QT負責後端實現 我們可以自由的使用而不用擔心效率問題,如果呼叫了destroy(),緩衝區就變為了無效, 此時就不要在使用緩衝區。 QOpenGLVertexArrayObject 頂點陣

OpenCV入門教程2-Mat類之素的讀寫

一、矩陣元素的基本表達 對於單通道影象,其元素型別一般為 8U(即 8 位無符號整數),當然也可以是 16S、32F等;這些型別可以直接用 uchar、short、float 等 C/C++語言中的基本資料型別表達。 如果多通道影象,如 RGB 彩色影象,需

使用PowerDesignerE-R圖詳細教程1

一、概念資料模型概述資料模型是現實世界中資料特徵的抽象。資料模型應該滿足三個方面的要求: 1)能夠比較真實地模擬現實世界 2)容易為人所理解 3)便於計算機實現 概念資料模型也稱資訊模型,它以實體-聯絡(Entity-RelationShip,簡稱E-R)理論為基礎,並對這一理論進行了擴充。它從使用者的觀點

echartsk折線

引用echarts的庫,寫以下js檔案 //k線圖 function makeMapKLine(result){ var changeChart=echarts.init(document.getElementById("changeConten

GuozhongCrawler系列教程 1 三大PageDownloader

特點 string null 瀏覽器兼容 ror down odi 系列 lan GuozhongCrawler QQ群 202568714 教程源代碼下載地址:http://pan.baidu.com/s/1pJBmerL GuozhongCrawl

java

讀寫 img 其他 手動 dem com 字段 只讀 停止線程 java5線程並發庫   線程並發庫是JDK 1.5版本級以上才有的針對線程並發編程提供的一些常用工具類,這些類被封裝在java.concurrent包下。   該包下又有兩個子包,分別是atomic和lock

函數式編程入門教程

制作 說明 讀取 ttf 中國 png if...else per 部分 初涉函數式編程語言python,轉載了一篇文章,先簡單來了解一下函數式編程的概念. 文章原址:http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.ht

Spring MVC新手教程

erp -s sil troy .html 解釋 rand rtu wire 直接幹貨 model 考慮給用戶展示什麽。關註支撐業務的信息構成。構建成模型。 control 調用業務邏輯產生合適的數據以及傳遞數據給視圖用於呈獻; view怎樣對數據進行布局,以

任務管理器 應用程序 public 多線程 start 這邊來談談java中,我對對多線程的理解在了解多線程前,先說說進程。進程就是正在運行的應用程序。 當你打開任務管理器的時候,你就會發現很多的進程。而我們要說的線程,就是依賴於進程而存在的,一個進程可以開啟多個線程。Thread類說到

Spring 新手教程 註入和自己主動裝配

文件 auto 進行 上下文 xxx -s 重要 mls 上下 Spring註入是指在啟動Spring容器載入bean配置的時候。對類變量的賦值。 兩種經常使用註入方式:設值註入和構造註入 以下就這部分知識看代碼以及代碼中的註解: 1、首先看S

linux學習入門標準教程2

linux標準教程Linux系統篇2.1 Linux系統管理經過前兩章的學習,咱們現已可以獨立裝置Linux體系,現已把握了Linux學習的竅門,那接下來,咱們將體系的來了解Linux體系各目錄、權限及常用命令的運用。2.1. 1 Linux目錄初識通過前面的學習,我們已經能夠獨立安裝完一個linux

Java - Struts框架教程 Hibernate框架教程 Spring框架入門教程新版 sping mvc spring boot spring cloud Mybatis

java ee cloud pac .cn java get pin nat 輕量級 https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html

ArcGIS Pro 簡明教程1Pro簡介

配置 動畫 name app 產品 版本 鼠標拖動 nal mage ArcGIS Pro 簡明教程(1)Pro簡介 轉載地址:http://www.cnblogs.com/lazygis/p/5870545.html ArcGIS Pro 簡明教程(1)Pro簡

android入門 — 多

xtend 分享 調用 管理 ava 導致 ui線程 rec thread   android中的一些耗時操作,例如網絡請求,如果不能及時響應,就會導致主線程被阻塞,出現ANR,非常影響用戶體驗,所以一些耗時的操作,我們會想辦法放在子線程中去完成。   android的U

iptables實用教程:管理鏈和策略

否則 命令顯示 accept 目的 number cep 存在 當前 末尾 概念和原理請參考上一篇文章“iptables實用教程(一)”。 本文講解如果管理iptables中的鏈和策略。 下面的代碼格式中,下劃線表示是一個占位符,需要根據實際情況輸入參數,不帶下劃線的表示是