首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt Graphics View 框架核心架構:場景-視圖模式與百萬物件即時渲染

     編輯:關於C語言

Qt 繪圖系統的壓軸登場——**Graphics View Framework**。它採用 Item-Based 架構與 Model-View 設計,支援百萬級圖形物件即時操作、多視圖同步觀察、縮放旋轉無失真,是 KDE Plasma 桌面、專業繪圖軟體的核心基礎。

為什麼需要 Graphics View?

特性QPainter 即時模式Graphics View 保留模式
程式設計範式面向過程 (drawLine, drawRect...)面向物件 (Item 實體)
物件管理開發者自行管理列表/狀態Scene 自動管理 (增刪查改)
複雜場景效能O(N) 重繪所有指令BSP 樹索引 O(log N) 可見性裁剪
多視圖支援需手動計算座標轉換一 Scene 多 View,自動同步
互動處理自行處理滑鼠事件座標映射Item 直接接收場景座標事件
變換支援手動矩陣運算內建縮放/旋轉/剪切

三大核心類別

  • QGraphicsScene:場景 (Model),無限大的 2D 平面,管理所有 Item,提供碰撞檢測、選取、索引
  • QGraphicsView:視圖 (View),Widget 子類,顯示 Scene 的可見區域,支援捲動、縮放、旋轉、多視圖
  • QGraphicsItem:圖形元件基類,內建 QGraphicsLineItem、RectItem、EllipseItem、TextItem、PixmapItem、PathItem、PolygonItem 等

最小可行範例:5 行程式碼建立場景

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    // 1. 建立場景
    QGraphicsScene *scene = new QGraphicsScene;
    
    // 2. 添加圖形項目 (座標為場景座標)
    scene->addLine(10, 10, 150, 300);  // 返回 QGraphicsLineItem*
    scene->addRect(200, 50, 100, 80);
    scene->addEllipse(400, 100, 120, 60);
    
    // 3. 建立視圖並關聯場景
    QGraphicsView *view = new QGraphicsView(scene);
    view->resize(600, 400);
    view->setWindowTitle("Graphics View Demo");
    view->show();
    
    return app.exec();
}

關鍵行為差異:自動置中 vs 原始座標

Graphics View 自動置中 QWidget 原始座標

  • Graphics View:預設將場景內容**置中顯示**於視口,拖曳視圖可平移場景
  • QWidget + QPainter:嚴格依座標繪製,(10,10) 固定在視窗左上角附近

若需 Graphics View 行為如 QPainter:

view->setAlignment(Qt::AlignLeft | Qt::AlignTop); // 取消置中
view->setSceneRect(0, 0, 800, 600);              // 固定場景矩形

座標系統三層轉換

滑鼠/螢幕座標 (View) 
    ⇅ QGraphicsView::mapToScene() / mapFromScene()
場景座標 (Scene) ———— 所有 Item 位置、幾何運算基準
    ⇅ QGraphicsItem::mapToScene() / mapFromScene() / mapFromItem()
項目座標 (Item) ———— Item 內部繪圖、碰撞檢測、事件處理基準

BSP 樹空間索引:百萬物件的秘密

  • Scene 內部維護 **BSP (Binary Space Partitioning) 樹**
  • Item 添加/移動/移除時自動更新索引
  • scene->items(QRectF)、scene->itemAt(QPointF)、碰撞檢測皆為 **O(log N)**
  • 可自訂索引策略:scene->setItemIndexMethod(QGraphicsScene::NoIndex) 關閉 (適合極動態場景)

進階特性預覽

  1. 自定義 Item:繼承 QGraphicsItem,實作 boundingRect()、paint()、shape()
  2. 事件處理:Item 直接接收 mousePressEvent、hoverEnterEvent、keyPressEvent 等 (場景座標)
  3. 動畫框架整合:QPropertyAnimation 驅動 Item 的 pos、rotation、scale、opacity
  4. OpenGL 加速:view->setViewport(new QOpenGLWidget) 啟用 GPU 渲染
  5. 列印/匯出:scene->render(&painter) 輸出至 QPrinter、QImage、QSvgGenerator

Graphics View 將 2D 繪圖從「畫指令」提升為「管物件」,是構建專業圖形應用 (CAD、EDA、地圖、設計工具) 的標準選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved