Qt QGraphics簡述及例程
- 引言
- 一、簡單例程
- 二、關于坐標系問題
引言
QGraphics*
是Qt框架中,主要用于處理2D圖形項的顯示、交互和管理的模塊,包括QGraphicsView、QGraphicsScene和QGraphicsItem。提供了一套高效的場景-視圖架構,適合開發復雜的圖形應用程序,如繪圖工具、數據可視化、游戲等。該模塊通過分層設計平衡了靈活性與性能,是Qt中處理復雜圖形交互的首選方案。
- QGraphicsView
用于顯示場景內容的視圖組件,支持縮放、旋轉、滾動等交互操作。多個視圖可以關聯同一個場景,實現不同視角的同步展示。- QGraphicsScene
作為容器管理所有圖形項(QGraphicsItem),負責場景的坐標系統、碰撞檢測、事件傳遞等。場景可以包含數百萬個項,但仍能保持高性能。- QGraphicsItem
所有圖形項的基類,提供位置、變換、碰撞、繪制等基本功能。常見的派生類包括QGraphicsEllipseItem(圓形)、QGraphicsRectItem(矩形)等。
一、簡單例程
簡單的比喻:QGraphicsScene是一個場景,QGraphicsItem是場景里物體 (可以是多個),QGraphicsView是看場景的視角。
-
可拖動Item的效果展示:
-
源碼:
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
#include <QBrush>
#include <QPen>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 創建一個場景QGraphicsScene scene;scene.setSceneRect(0, 0, 400, 300);// 創建一個矩形項并添加到場景QGraphicsRectItem *rectItem = new QGraphicsRectItem(50, 50, 100, 100);rectItem->setBrush(QBrush(Qt::blue));rectItem->setPen(QPen(Qt::black));rectItem->setFlag(QGraphicsItem::ItemIsMovable); // 允許拖動scene.addItem(rectItem);// 創建一個橢圓項并添加到場景QGraphicsEllipseItem *ellipseItem = new QGraphicsEllipseItem(200, 100, 150, 100);ellipseItem->setBrush(QBrush(Qt::red));ellipseItem->setPen(QPen(Qt::black));ellipseItem->setFlag(QGraphicsItem::ItemIsMovable); // 允許拖動scene.addItem(ellipseItem);// 創建一個視圖并設置場景QGraphicsView view(&scene);view.setWindowTitle("示例");view.resize(500, 400);view.show();return app.exec();
}
Qt QGraphics體系及刷新機制介紹:https://zhuanlan.zhihu.com/p/613637924
二、關于坐標系問題
Qt圖形視圖框架三–坐標系統簡介:https://blog.csdn.net/zhaoxd200808501/article/details/76177497
-
- QgraphicsScene的
setSceneRect
函數可以設置場景的位置(或者說View查看的位置
)和大小。默認scene的中心和View的中心是重合的(默認Qt::AlignmentCenter
),或者說默認原點(0,0)在中心,如下圖所示:
- QgraphicsScene的
QGraphicsScene *scene = new QGraphicsScene();scene->setBackgroundBrush(Qt::yellow);QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 100);scene->addItem(rectItem);//scene->setSceneRect(-50, -50, 100, 100);QGraphicsView *view = new QGraphicsView(scene);//view->setAlignment(Qt::AlignLeft|Qt::AlignTop);this->setCentralWidget(view);this->setGeometry(300, 300, 200, 200);
-
- 使用
scene->setSceneRect(-50, -50, 100, 100)
進行偏移,就是將view的查看的位置向左上都移動50 (也可以看作scene向右下移動50),由于默認Qt::AlignmentCenter
,所有偏移是距離中心原點的距離,如下圖所示:
- 使用
-
- 再設置
view->setAlignment(Qt::AlignLeft|Qt::AlignTop);
,setSceneRect
所設置的-50偏移,就是距離左上頂點的偏移,如下圖所示:
- 再設置
坐標系統問題總結:
- View和Scene的對齊方式,決定坐標系原點(0,0) (默認
Qt::AlignmentCenter
,中心作為原點),不是左上角為原點。setSceneRect
設置的位置,是距離原點的位置。- 換句話說就是,默認設置Scene的中心為坐標系原點,setSceneRect設置的(-50,-50)就是:View的中心在Scene中心左上方50處。
Qt工作筆記-QGraphicsView框架容易忽視的坐標問題-“畫布”QgraphicsScene到底放在了哪兒?:https://blog.csdn.net/qq78442761/article/details/80965627
一個例子,搞懂QGraphicsView,QGraphicsScene坐標系統以及sceneRect設置:https://blog.csdn.net/biewenwoaaaa/article/details/144597336