QGraphics View 框架是 Qt 中用于管理和渲染大量 2D 图形对象的强大工具,适合构建绘图软件、游戏编辑器、数据可视化等场景。以下是关键使用步骤和示例:
#include
#include
#include
#include
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建场景(设置场景范围)
QGraphicsScene *scene = new QGraphicsScene();
scene->setSceneRect(0, 0, 800, 600);
// 添加图形项(例如红色矩形)
QGraphicsRectItem *rect = scene->addRect(50, 50, 200, 100);
rect->setBrush(Qt::red);
// 创建视图并关联场景
QGraphicsView *view = new QGraphicsView(scene);
view->setWindowTitle("Graphics View Demo");
view->resize(800, 600);
view->show();
return app.exec();
}
继承 QGraphicsItem
并重写关键方法:
class CustomItem : public QGraphicsItem {
public:
QRectF boundingRect() const override {
return QRectF(-10, -10, 20, 20); // 定义绘制区域
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override {
painter->setBrush(Qt::blue);
painter->drawEllipse(-10, -10, 20, 20); // 绘制蓝色圆形
}
// 鼠标事件示例
void mousePressEvent(QGraphicsSceneMouseEvent *event) override {
qDebug() << "Item clicked!";
QGraphicsItem::mousePressEvent(event);
}
};
// 使用自定义项
CustomItem *item = new CustomItem();
scene->addItem(item);
item->setPos(100, 100);
// 缩放视图
view->scale(1.2, 1.2); // 放大20%
// 旋转视图
view->rotate(45); // 顺时针旋转45度
// 启用鼠标拖拽滚动
view->setDragMode(QGraphicsView::ScrollHandDrag);
// 将视图坐标转换为场景坐标
QPointF scenePos = view->mapToScene(view->mapFromGlobal(QCursor::pos()));
// 获取图形项的全局位置
QPointF itemGlobalPos = item->mapToScene(item->boundingRect().center());
使用 QPropertyAnimation
实现移动动画:
QPropertyAnimation *anim = new QPropertyAnimation(item, "pos");
anim->setDuration(1000);
anim->setStartValue(QPointF(0, 0));
anim->setEndValue(QPointF(300, 300));
anim->start();
scene->setItemIndexMethod(QGraphicsScene::BspTreeIndex);
view->setViewport(new QOpenGLWidget());
QGraphicsPixmapItem
中。boundingRect()
和 paint()
正确实现。setAcceptHoverEvents(true)
或 setFlags(QGraphicsItem::ItemIsFocusable)
。GitHub 示例仓库 中查看 Qt 官方示例。
掌握这些核心概念后,可进一步探索信号槽交互、复杂布局管理和3D集成(通过 QGraphicsView
+ OpenGL)等高级主题。