当前位置: 首页 > article >正文

QGraphicsView类介绍

一、QGraphicsView类 简介

QGraphicsView 是 Qt 中的一个重要的类,用于显示 QGraphicsScene 中的内容。它提供了一个窗口小部件(widget),该窗口小部件可以用来查看和与 QGraphicsScene 中的对象进行交互。下面是关于 QGraphicsView 的详细介绍:

基本概念

  • QGraphicsScene:这是 QGraphicsView 显示的内容。QGraphicsScene 包含一组 QGraphicsItem 对象,并定义了它们的位置和关系。

  • QGraphicsView:这是一个窗口小部件,它包含了 QGraphicsScene 并提供了视图来显示场景中的内容。它可以包含滚动条、缩放和平移等功能。

  • QGraphicsItem:这是场景中的基本图形对象。它可以是任何形状,例如矩形、线条、文本等,并且可以具有子项形成一个层次结构。

功能特性

  1. 显示和渲染QGraphicsView 负责渲染 QGraphicsScene 中的所有图形项,并将它们显示在屏幕上。

  2. 滚动和缩放QGraphicsView 提供了滚动和缩放的功能,允许用户查看场景中的不同部分,并调整视图的细节程度。

  3. 交互性QGraphicsView 支持鼠标和键盘事件,使得用户能够与场景中的图形项进行交互,比如选择、移动、放大和缩小等。

  4. 自定义渲染:可以通过重写 QGraphicsView 的方法来定制渲染行为,例如 drawBackground()drawForeground()drawFrame() 方法。

常用方法

  • 设置场景:使用 setScene(QGraphicsScene *) 方法将一个 QGraphicsScene 设置给 QGraphicsView

  • 获取场景:使用 scene() 方法来获取当前的 QGraphicsScene

  • 滚动条:通过 horizontalScrollBar()verticalScrollBar() 获取水平和垂直滚动条。

  • 缩放scale(qreal sx, qreal sy) 用于缩放视图;zoomIn()zoomOut() 用于增加和减少缩放比例。

  • 平移translate(qreal dx, qreal dy) 方法用于平移视图。

  • 中心点centerOn(const QPointF &point)centerOn(qreal x, qreal y) 用于将视图的中心移动到指定位置。

示例代码

下面是一个简单的例子,展示如何使用 QGraphicsViewQGraphicsScene

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建一个 QGraphicsScene
    QGraphicsScene scene;
    scene.setSceneRect(0, 0, 400, 300);  // 设置场景大小

    // 在场景中添加一个红色矩形
    QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 100);
    rect->setBrush(Qt::red);
    scene.addItem(rect);

    // 创建一个 QGraphicsView
    QGraphicsView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);  // 启用抗锯齿
    view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);  // 更新模式
    view.setBackgroundBrush(Qt::lightGray);  // 设置背景色
    view.show();

    return app.exec();
}

总结

QGraphicsView 提供了一个强大的工具集来管理和显示复杂的二维图形界面。它不仅提供了基本的视图功能,还支持高级的交互和渲染特性。通过结合 QGraphicsSceneQGraphicsItem,你可以创建出高度定制化的图形界面。

二、QGraphicsView 类关键方法

QGraphicsView 类提供了几个关键的方法,允许开发者定制视图的渲染行为。这些方法主要用于在渲染场景之前或之后添加额外的视觉元素或者改变默认的行为。下面是一些常用的方法以及如何使用它们来进行定制:

1. drawBackground(QPainter *painter, const QRectF &rect)

这个方法用于在场景的背景上绘制额外的图形。当视图需要重新绘制时,会调用此方法。

用法示例:
void MyView::drawBackground(QPainter *painter, const QRectF &rect)
{
    // 调用基类实现
    QGraphicsView::drawBackground(painter, rect);

    // 在背景上绘制网格
    painter->setPen(QPen(Qt::gray, 0.5, Qt::DotLine));
    int gridStep = 20;
    for (int x = rect.left(); x <= rect.right(); x += gridStep)
        painter->drawLine(x, rect.top(), x, rect.bottom());
    for (int y = rect.top(); y <= rect.bottom(); y += gridStep)
        painter->drawLine(rect.left(), y, rect.right(), y);
}

2. drawForeground(QPainter *painter, const QRectF &rect)

这个方法用于在所有场景项之上绘制额外的图形。这通常用于绘制辅助线或其他覆盖在场景顶部的信息。

用法示例:
void MyView::drawForeground(QPainter *painter, const QRectF &rect)
{
    // 绘制一些指示箭头或者其他覆盖元素
    painter->setPen(QPen(Qt::blue, 2));
    painter->drawLine(rect.center().x(), rect.top(), rect.center().x(), rect.bottom());
    painter->drawLine(rect.left(), rect.center().y(), rect.right(), rect.center().y());
}

3. drawFrame()

如果视图的样式设置了框架,那么此方法会在视图周围绘制一个边框。这个方法在视图的框架被绘制之前被调用。

用法示例:
void MyView::drawFrame(QPainter *painter)
{
    // 调用基类实现
    QGraphicsView::drawFrame(painter);

    // 添加额外的边框效果
    painter->setPen(QPen(Qt::darkGreen, 3));
    painter->drawRect(rect());
}

注意事项

  • 当重写这些方法时,通常需要先调用基类的实现以保持默认的行为。
  • 使用这些方法时要确保只绘制在传入的 rect 内,以避免不必要的绘制开销。

其他相关方法

除了上述三个主要方法之外,还有一些其他方法可以用来控制视图的渲染行为:

  • viewportEvent(QEvent *event): 可以用来处理特定的视口事件。
  • resizeEvent(QResizeEvent *event): 重写此方法可以对视口大小变化做出反应。
  • wheelEvent(QWheelEvent *event): 可以用来处理滚轮事件,例如用于缩放。

示例代码

这里有一个完整的示例,展示了如何创建一个带有定制渲染行为的 QGraphicsView

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QPainter>

class CustomView : public QGraphicsView
{
    Q_OBJECT
public:
    CustomView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void drawBackground(QPainter *painter, const QRectF &rect) override;
    void drawForeground(QPainter *painter, const QRectF &rect) override;
    void drawFrame(QPainter *painter) override;
};

void CustomView::drawBackground(QPainter *painter, const QRectF &rect)
{
    QGraphicsView::drawBackground(painter, rect);

    painter->setPen(QPen(Qt::gray, 0.5, Qt::DotLine));
    int gridStep = 20;
    for (int x = rect.left(); x <= rect.right(); x += gridStep)
        painter->drawLine(x, rect.top(), x, rect.bottom());
    for (int y = rect.top(); y <= rect.bottom(); y += gridStep)
        painter->drawLine(rect.left(), y, rect.right(), y);
}

void CustomView::drawForeground(QPainter *painter, const QRectF &rect)
{
    painter->setPen(QPen(Qt::blue, 2));
    painter->drawLine(rect.center().x(), rect.top(), rect.center().x(), rect.bottom());
    painter->drawLine(rect.left(), rect.center().y(), rect.right(), rect.center().y());
}

void CustomView::drawFrame(QPainter *painter)
{
    QGraphicsView::drawFrame(painter);

    painter->setPen(QPen(Qt::darkGreen, 3));
    painter->drawRect(rect());
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QGraphicsScene scene;
    scene.setSceneRect(0, 0, 400, 300);

    QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 100);
    rect->setBrush(Qt::red);
    scene.addItem(rect);

    CustomView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);
    view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
    view.setBackgroundBrush(Qt::lightGray);
    view.show();

    return app.exec();
}

这个示例创建了一个带有网格背景、中心指示线和额外边框的自定义视图。通过重写 drawBackground(), drawForeground(), 和 drawFrame() 方法,可以轻松地实现这些定制化需求。


http://www.kler.cn/news/282914.html

相关文章:

  • MySQL迁移到ClickHouse
  • Docker 基本命令
  • [windows][软件]Windows平台MongoDB的安装
  • 【机器学习】线性回归正则化的概念、三种正则化方法的优缺点、使用场景以及在python中的实例
  • 关于武汉芯景科技有限公司的MCU监控芯片XJ809S开发指南(兼容MAX809S)
  • <数据集>手部识别数据集<目标检测>
  • Qt WebSocket
  • 【论文阅读】YOLOv10: Real-Time End-to-End Object Detection
  • SQL 简易建库和增删改查
  • 【Redis】主从复制
  • 操作系统 --王道计算机考研--学习笔记
  • 海信电视与《黑神话 :悟空》合作,大屏端流畅游戏体验如何保障?
  • 构建自闭症解决之道:多维度策略的探索与实践
  • YOLOv8 训练15种动物目标检测模型
  • day03-面向对象-内部类泛型常用API
  • [底层原理] C/C++获取时间(将时间戳转换为年月日)?
  • EmguCV学习笔记 VB.Net 7.2 特征点检测
  • Java之内部类
  • 浅谈Kafka(三)
  • 深度学习基础--深度学习网络
  • 服务器内存飙升分析小记
  • PostgreSQL遍历所有的表并设置id为自增主键(基于自建函数)
  • FineReport帆软报表:使用JAVA批量更新报表里的数据集连接名
  • 【python量化分析专题】最新整理的已经实测可用的各类免费股票数据接口之实时交易数据
  • 『大模型笔记』林纳斯·托瓦兹(Linux之父):谈论热议与人工智能的未来!
  • Linux 网络技术栈,看这篇就够了!!
  • 【ACM独立出版 | 厦大主办】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024,10月18-20)
  • 基于web 在线影院系统网站设计与实现
  • 交通流量监测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • Qt 调用执行 Python 函数