小工具知识网

当前位置: 首页 > 行业知识 > QT之QGraphicsView详细介绍

行业知识

QT之QGraphicsView详细介绍

2026-11-08 15:14:52 来源:互联网转载

此篇文章来源于自己在完成一个图片编辑软件而遇到的三个类:QGraphicsScene、QGraphicsPixmapItem、QGraphicsView。此篇文章先介绍QGraphicsView,另外两个类在其他文章,大家可查看博主其他文章。本人能力有限,大家有任何问题可评论区评论,共同学习,共同进步。

一、QGraphicsView介绍

QGraphicsView 是 Qt GUI 库中的一个核心类,它是 Qt 图形视图框架的一部分,主要用于可视化地显示 QGraphicsScene 中的内容。QGraphicsView 提供了一个灵活且可定制的二维图形界面,支持丰富的交互功能,如平移、缩放、旋转,并能够管理和布局复杂的图形场景。

基本特性:

  1. 视图与场景分离:

    • QGraphicsView 类本身负责渲染和显示图形场景 (QGraphicsScene),而场景则负责存储和管理所有的图形项 (QGraphicsItem),这些图形项可以是文本、形状、图片等任何可视化元素。
  2. 视口与坐标系统:

    • QGraphicsView 内部有一个视口,视口映射的是场景的部分或全部内容。它可以有自己的坐标系统,并且可以通过调整视口边界或缩放级别来改变显示效果。
    • 视口坐标与场景坐标之间存在转换关系,QGraphicsView 提供了一系列方法来处理这种坐标变换。
  3. 交互功能:

    • 支持鼠标滚轮和键盘事件,用于缩放和平移场景内容。
    • 使用 scroll() 和 centerOn() 方法可以方便地移动视图焦点。
    • scale() 和 rotate() 方法可用于缩放和旋转视图中的场景内容。
    • 可以通过 dragMode 属性控制用户是否可以拖动场景或视图。
  4. 缓存机制:

    • QGraphicsView 支持多种缓存模式 (CacheModeFlag),通过预渲染并缓存部分内容在 QPixmap 中,提高复杂场景的重绘效率。
  5. 适应场景大小:

    • fitInView() 函数可以自动调整视图大小以适应指定的场景区域,并可以选择保持纵横比或忽略它。
  6. 事件处理与信号槽:

    • QGraphicsView 处理各种图形视图相关的事件,包括但不限于鼠标点击、鼠标移动、鼠标滚轮事件等。
    • 它还发出一系列信号,以便与其他组件协同工作,比如当视图区域发生更改时,可以连接相应的槽函数进行响应。
  7. 可扩展性:

    • 用户可以通过继承 QGraphicsView 并重写其虚函数来自定义视图的行为,例如实现自定义的绘图、鼠标跟踪以及触摸屏交互等高级功能。

总结来说,QGraphicsView 是构建复杂图形用户界面的强大工具,尤其适用于那些需要动态更新、可交互的2D图形化应用程序,如图表绘制、流程图编辑器、游戏地图显示等等。通过结合使用 QGraphicsScene 和 QGraphicsItem,开发者可以创建出高度定制化、性能优良的图形用户界面组件。

下面是一个简单的 QGraphicsView 使用示例,展示如何创建一个包含一个矩形图形项的基本场景,并将其显示在一个 QGraphicsView 控件中:

#include int main(int argc, char *argv[]){    QApplication app(argc, argv);    // 创建一个图形场景    QGraphicsScene* scene = new QGraphicsScene();    // 在场景中添加一个矩形图形项    QGraphicsRectItem* rectItem = scene->addRect(50, 50, 100, 100);    rectItem->setBrush(Qt::blue); // 设置填充颜色    rectItem->setPen(QPen(Qt::black)); // 设置边框颜色    // 创建一个图形视图并设置场景    QGraphicsView* view = new QGraphicsView();    view->setScene(scene);    // 设置视图的一些基本属性    view->setRenderHint(QPainter::Antialiasing); // 启用抗锯齿    view->setDragMode(QGraphicsView::ScrollHandDrag); // 允许拖拽视图进行平移    // 显示视图到窗口    QMainWindow window;    window.setCentralWidget(view);    window.show();    return app.exec();}
  • 首先,我们创建了一个 QGraphicsScene 对象,它是所有图形项的容器。
  • 然后,在场景中添加了一个 QGraphicsRectItem(矩形图形项),并设置了填充色和边框色。
  • 接着,我们创建了 QGraphicsView 对象,并将其关联到已创建的场景上,这样视图就能显示场景内的内容。
  • 设置视图的渲染提示和拖拽模式,增强了视觉效果并允许用户通过鼠标拖拽来平移视图内容。
  • 最后,我们将 QGraphicsView 设置为主窗口的中央部件并显示窗口。

    运行这段代码,你会看到一个蓝色矩形出现在一个可滚动和平移的视图窗口中。这只是 QGraphicsView 功能的冰山一角,实际上还可以进一步添加更多图形项,实现动画、交互等功能。

    二、成员函数

    1、QGraphicsView::QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr)

    QGraphicsView::QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr) 是 QGraphicsView 类的一个构造函数。在 Qt 框架中,QGraphicsView 是一个用于显示 QGraphicsScene 中图形内容的视图组件。这个构造函数的用途是初始化一个新的 QGraphicsView 实例,并且可以指定一个与之关联的 QGraphicsScene 和父级 QWidget。

    参数说明:

    • QGraphicsScene *scene: 这是一个指向 QGraphicsScene 对象的指针。如果传入非空指针,则新创建的 QGraphicsView 将自动关联到该场景,用于显示场景中的图形元素。如果没有提供场景,或者传入 nullptr,则视图可以稍后通过调用 setScene() 方法来关联场景。
    • QWidget *parent: 这是指向父级 QWidget 对象的指针,默认为 nullptr。如果提供了父级窗口部件,那么新建的 QGraphicsView 将成为其子部件,并遵循父级的布局管理和生命周期管理规则。

      例如,基于上面的构造函数,你可以这样创建一个关联了特定场景的 QGraphicsView:

      // 创建一个图形场景QGraphicsScene *myScene = new QGraphicsScene();// 创建一个图形视图并将场景关联到视图上QGraphicsView *myView = new QGraphicsView(myScene, this);

      这里假设 this 是当前的 QWidget 或者 QObject 子类实例,即将 myView 添加为其子部件。

      2、QGraphicsView::QGraphicsView(QWidget *parent = nullptr)

      QGraphicsView::QGraphicsView(QWidget *parent = nullptr) 是 QGraphicsView 类的一个构造函数,它的主要作用是创建一个新的 QGraphicsView 对象实例。在这个版本的构造函数中,没有直接关联一个 QGraphicsScene 对象。

      参数说明:

      • QWidget *parent: 这是一个指向父级 QWidget 对象的指针,默认值为 nullptr。如果提供了父级窗口部件(即传递非空指针),那么新创建的 QGraphicsView 将成为该父窗口部件的子部件,会受到父窗口部件的布局管理,并且会在父窗口部件销毁时自动被删除。如果没有提供父窗口部件,那么 QGraphicsView 将成为一个顶级窗口或者可以在之后通过调用 setParent() 方法来设置父窗口部件。

        使用这个构造函数创建 QGraphicsView 的示例代码如下:

        // 创建一个图形视图,暂时不关联任何图形场景QGraphicsView *myView = new QGraphicsView(this);// 创建一个图形场景QGraphicsScene *myScene = new QGraphicsScene();// 将创建的图形场景关联到视图上myView->setScene(myScene);

        在这个例子中,首先创建了一个没有关联场景的 QGraphicsView,然后创建了一个 QGraphicsScene,最后通过调用 setScene() 方法将场景设置给视图。这样,即使在创建视图时不直接关联场景,也能在后续操作中完成关联。

        3、void QGraphicsView::invalidateScene(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = QGraphicsScene::AllLayers)

        QGraphicsView::invalidateScene(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = QGraphicsScene::AllLayers) 是 QGraphicsView 类的一个成员函数,用于通知视图某个区域的场景内容已经改变,需要重新绘制。

        参数说明:

        • const QRectF &rect: 表示需要无效化的场景区域,默认为空 QRectF,表示整个场景都需要无效化并重新绘制。如果你仅修改了场景中的某个特定区域,可以传递这个区域的矩形坐标,这样只会重新绘制这一部分区域,从而提升性能。
        • QGraphicsScene::SceneLayers layers: 表示需要无效化的场景层,默认为 QGraphicsScene::AllLayers,表示所有层都需要无效化。也可以指定只无效化某一层或多层,如背景层、前景层等。

          当你调用此函数时,视图将会安排在下次事件循环迭代时更新指定区域的显示,确保视图所显示的内容与场景中的实际内容一致。这对于在程序中动态修改了场景内容,尤其是图形项的位置、大小、形状或外观等属性后,是非常有用的。

          4、void QGraphicsView::rubberBandChanged(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint)

          void QGraphicsView::rubberBandChanged(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint) 这个函数签名看起来并不是标准的 Qt QGraphicsView 类的成员函数。通常,在 QGraphicsView 中处理橡皮筋选择(rubber band selection)时,不会有直接名为 rubberBandChanged 的信号或槽函数,并且不接受这种特定形式的参数。

          不过,基于函数名和参数,我们可以推测这可能是一个自定义实现或者派生类中的一个函数,用来响应橡皮筋选择框的变化。在这个假设下:

          • QRect rubberBandRect: 橡皮筋选择框当前的矩形区域,它代表用户通过鼠标拖拽在视图上画出的选择范围。
          • QPointF fromScenePoint: 橡皮筋选择开始时在场景坐标系下的点。
          • QPointF toScenePoint: 橡皮筋选择结束时(或者当前状态)在场景坐标系下的点。

            当用户在 QGraphicsView 上拖动鼠标来创建一个选择区域时,这个函数可能是用来实时更新并显示橡皮筋效果,或者是用来记录选择过程中的相关数据。在标准Qt库中,要实现橡皮筋选择的效果,一般会通过重载鼠标事件处理函数并在其中创建一个临时的 QRubberBand 对象,并随着鼠标移动动态调整其位置和大小。

            #include #include #include class CustomGraphicsView : public QGraphicsView {    Q_OBJECTpublic:    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent), rubberBand(new QRubberBand(QRubberBand::Rectangle, this)) {}protected:    void mousePressEvent(QMouseEvent *event) override {        if (event->button() == Qt::LeftButton) {            rubberBandOrigin = event->pos();            rubberBand->setGeometry(QRect(rubberBandOrigin, QSize()));            rubberBand->show();        }        QGraphicsView::mousePressEvent(event);    }    void mouseMoveEvent(QMouseEvent *event) override {        if (rubberBand->isVisible()) {            QRect rect = rubberBand->geometry();            rect.setBottomRight(event->pos());            rubberBand->setGeometry(rect);            // 在这里可以模拟调用 rubberBandChanged 函数,传递当前的矩形区域            rubberBandChanged(rect, rubberBandOrigin.toPoint(), event->pos().toPoint());        }        QGraphicsView::mouseMoveEvent(event);    }    void mouseReleaseEvent(QMouseEvent *event) override {        if (rubberBand->isVisible()) {            rubberBand->hide();            // 处理选择完成逻辑...        }        QGraphicsView::mouseReleaseEvent(event);    }signals:    // 假设我们添加了一个自定义信号用于通知橡皮筋框变化    void rubberBandChanged(const QRect &rect, const QPointF &from, const QPointF &to);private:    QPoint rubberBandOrigin;    QRubberBand *rubberBand;};// 主要程序中连接信号与槽int main(int argc, char *argv[]) {    QApplication app(argc, argv);    CustomGraphicsView view;    QObject::connect(&view, &CustomGraphicsView::rubberBandChanged,                     [](const QRect &r, const QPointF &f, const QPointF &t) {                         // 在这里处理橡胶带矩形变化的实际逻辑                         qDebug() mimeData()->hasFormat("application/x-qgraphicsitem")) {        // 设置拖拽动作的接受策略        event->acceptProposedAction();    } else {        // 拒绝此次拖拽操作        event->ignore();    }}

            在这个例子中,我们检查了拖拽的数据是否携带 "application/x-qgraphicsitem" 类型,如果是,则接受拖拽操作,否则忽略。通过这种方式,您可以定制您的 QGraphicsView 对拖拽事件的响应行为。

            14、void QGraphicsView::dragLeaveEvent(QDragLeaveEvent *event)

            void QGraphicsView::dragLeaveEvent(QDragLeaveEvent *event) 是Qt框架中的一个事件处理函数,它是 QGraphicsView 类的一个重载方法。当拖拽的对象离开 QGraphicsView 视图的有效区域时,这个函数会被调用。

            在自定义这个函数时,通常用来清理在 dragEnterEvent 或 dragMoveEvent 中设置的一些临时状态,例如恢复视图或场景的原始样式,或者取消任何正在等待的拖拽操作指示。

            例如:

            void MyGraphicsView::dragLeaveEvent(QDragLeaveEvent *event){    // 清理操作,如隐藏拖拽过程中的临时指示器    myDragIndicatorItem->setVisible(false);    event->accept();}

            在上面的示例中,当拖拽事件离开视图时,隐藏了一个可能用于指示当前拖拽位置的临时图形项(myDragIndicatorItem)。调用 event->accept() 表示已处理此事件,不再需要进一步传递给其它事件处理器。

            15、void QGraphicsView::dragMoveEvent(QDragMoveEvent *event)

            void QGraphicsView::dragMoveEvent(QDragMoveEvent *event) 是Qt GUI框架中 QGraphicsView 类的一个重载事件处理函数。当拖拽操作中的数据在 QGraphicsView 视图内移动时,这个函数会被调用。

            在自定义 dragMoveEvent 函数时,您可以实时追踪拖拽操作的位置,并据此做出反应,比如更新预览效果或更改拖拽反馈指示。例如:

            void MyGraphicsView::dragMoveEvent(QDragMoveEvent *event){    // 获取当前鼠标位置对应的场景坐标    QPointF scenePos = this->mapToScene(event->pos());    // 若拖拽的是图片文件    if (event->mimeData()->hasUrls()) {        foreach (const QUrl &url, event->mimeData()->urls()) {            if (QFile::exists(url.toLocalFile())) {                // 更新拖拽预览效果,这里假设有一个跟随鼠标移动的预览图                myPreviewPixmapItem->setPos(scenePos);                // 接受拖动事件,允许继续拖拽操作                event->acceptProposedAction();                break;            }        }    } else {        event->ignore(); // 如果拖拽的数据不符合要求,则忽略此事件    }}

            在这个示例中,当拖拽的数据包含有效的图片文件URL时,我们将一个预览图元(myPreviewPixmapItem)跟随鼠标在场景中的位置进行移动,从而实现拖拽过程中图片预览的效果。如果拖拽的数据不满足要求,则忽略此次拖动事件。

            16、void QGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)

            void QGraphicsView::drawBackground(QPainter *painter, const QRectF &rect) 是Qt GUI框架中 QGraphicsView 类的一个虚函数,用于自定义视图背景的绘制方式。每当视图区域需要重绘其背景时,这个函数会被调用。

            在派生自 QGraphicsView 的类中重写此函数,可以让您自定义视图背景的样式和内容,如添加颜色填充、渐变、图案或者绘制自定义图形等。

            下面是一个简单的例子:

            class CustomGraphicsView : public QGraphicsView{protected:    void drawBackground(QPainter *painter, const QRectF &rect) override    {        // 获取视图的背景色        QColor backgroundColor = Qt::lightGray;        // 设置画笔的颜色        painter->setBrush(backgroundColor);        // 填充背景矩形        painter->drawRect(rect);        // 或者绘制更复杂的背景,例如添加渐变背景        QLinearGradient gradient(rect.topLeft(), rect.bottomRight());        gradient.setColorAt(0.0, Qt::white);        gradient.setColorAt(1.0, Qt::darkGray);        painter->fillRect(rect, gradient);    }};

            在这个例子中,我们首先设置了画笔的背景色并填充了给定的矩形区域作为背景。另外,还演示了如何使用线性渐变来填充背景,从左上角到右下角颜色逐渐变化。通过这样的方式,您可以根据需求自由地定制 QGraphicsView 的背景显示效果。

            17、void QGraphicsView::drawForeground(QPainter *painter, const QRectF &rect)

            void QGraphicsView::drawForeground(QPainter *painter, const QRectF &rect) 同样是Qt GUI框架中的 QGraphicsView 类的一个虚函数,它提供了自定义视图前景绘制的能力。当视图区域的内容需要更新(包括前景部分)时,该函数会被调用。

            在自定义的 QGraphicsView 子类中重写此方法,可以实现一些特定的前景元素绘制,比如覆盖在所有场景项之上的标注、图标或其他固定装饰元素等。

            以下是一个基本示例:

            class CustomGraphicsView : public QGraphicsView{protected:    void drawForeground(QPainter *painter, const QRectF &rect) override    {        // 继承默认行为的同时,在前景绘制一个十字线辅助线        QGraphicsView::drawForeground(painter, rect);        // 设置线条颜色为红色        painter->setPen(QPen(Qt::red, 1, Qt::DashLine));        // 在视图中心绘制垂直和水平的十字线        QPointF center = mapToScene(rect.center());        painter->drawLine(center.x(), 0, center.x(), height());        painter->drawLine(0, center.y(), width(), center.y());    }};

            在这个示例中,除了保留默认的前景绘制外,我们在视图的中心位置额外绘制了一条红色的十字线作为辅助线。这只是一个简单示例,实际应用中可以根据具体需求绘制任意的前景元素。

            18、void QGraphicsView::dropEvent(QDropEvent *event)

            void QGraphicsView::dropEvent(QDropEvent *event) 是Qt框架中的 QGraphicsView 类的一个重载事件处理函数,用于处理拖放操作中的“放置”阶段(drop)。当用户将数据从外部源(例如文件管理器或其他应用程序)拖放到 QGraphicsView 上,并释放鼠标按钮完成拖放动作时,这个函数会被调用。

            在自定义的 QGraphicsView 类中,你可以通过重写 dropEvent 函数来处理拖放到视图上的数据,通常包括解析拖放的数据格式,然后根据这些数据在场景中添加或更新相应的图形项目。下面是一个简化的示例:

            class CustomGraphicsView : public QGraphicsView{protected:    void dropEvent(QDropEvent *event) override    {        if (event->mimeData()->hasFormat("text/uri-list")) { // 检查是否拖放的是文件路径            event->acceptProposedAction();            QStringList files = event->mimeData()->urls().map(                [](const QUrl& url) { return url.toLocalFile(); });            for (const QString &file : files) {                // 假设我们加载图像文件并将其显示为场景中的QGraphicsPixmapItem                QPixmap pixmap(file);                if (!pixmap.isNull()) {                    QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap);                    scene()->addItem(item);                    // 可能还需要设置初始位置或调整缩放等                }            }        } else {            event->ignore();        }    }};

            在这个示例中,如果拖放的数据包含文件路径,那么我们就获取这些路径并将它们转换为本地文件名。接着,尝试加载每个文件为 QPixmap,并创建一个新的 QGraphicsPixmapItem 显示所加载的图像,最后将这些图形项添加到与视图关联的 QGraphicsScene 中。当然,实际应用场景可能更为复杂,需要处理更多的数据类型和逻辑。

            19、void QGraphicsView::ensureVisible(const QRectF &rect, int xmargin = 50, int ymargin = 50)

            void QGraphicsView::ensureVisible(const QRectF &rect, int xmargin = 50, int ymargin = 50) 是Qt GUI框架中 QGraphicsView 类的一个成员函数,它的作用是确保指定的 QRectF 区域在视图中可见,并且在其周围留下一定的边距(默认为左右各50像素,上下各50像素)。

            参数说明:

            • const QRectF &rect: 需要确保在视图中可见的矩形区域,该区域基于场景坐标系。
            • int xmargin: 水平方向上的额外边距(可选,默认为50像素),确保矩形区域两边都有至少这么多的空白空间。
            • int ymargin: 垂直方向上的额外边距(可选,默认为50像素),确保矩形区域上下都有至少这么多的空白空间。

              通过调用这个函数,视图会自动滚动到合适的位置,使指定的矩形区域完全出现在视图中,并且留有一定的边距,提高用户的视觉体验和交互便利性。

              20、void QGraphicsView::ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50)

              void QGraphicsView::ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50) 是Qt GUI框架中 QGraphicsView 类的一个成员函数,它的作用是确保指定的矩形区域(由x、y、w、h四个参数确定)在视图中可见,并且在该矩形区域四周提供指定的边距(默认分别为左右各50像素,上下各50像素)。

              参数说明:

              • qreal x: 矩形区域的左上角x坐标,基于场景坐标系。
              • qreal y: 矩形区域的左上角y坐标,基于场景坐标系。
              • qreal w: 矩形区域的宽度。
              • qreal h: 矩形区域的高度。
              • int xmargin: 水平方向上的额外边距(可选,默认为50像素),确保矩形区域两边都有至少这么多的空白空间。
              • int ymargin: 垂直方向上的额外边距(可选,默认为50像素),确保矩形区域上下都有至少这么多的空白空间。

                调用此函数后,视图会自动滚动到适当的位置,确保指定大小和位置的矩形区域及其周围边距都在视图的可视范围内。这对于高亮显示某个特定区域或焦点跟踪非常有用。

                21、void QGraphicsView::ensureVisible(const QGraphicsItem *item, int xmargin = 50, int ymargin = 50)

                void QGraphicsView::ensureVisible(const QGraphicsItem *item, int xmargin = 50, int ymargin = 50) 是Qt GUI框架中 QGraphicsView 类的一个成员函数,它的作用是确保指定的 QGraphicsItem 在视图中可见,并且为其四周预留一定数量的空白边距(默认为左右各50像素,上下各50像素)。

                参数说明:

                • const QGraphicsItem *item: 指向需要确保可见的 QGraphicsItem 指针。
                • int xmargin: 水平方向上的额外边距(可选,默认为50像素),确保图形项两边都有至少这么多的空白空间。
                • int ymargin: 垂直方向上的额外边距(可选,默认为50像素),确保图形项上下都有至少这么多的空白空间。

                  当调用此函数时,QGraphicsView 会自动滚动至适当的位置,确保指定的图形项及围绕它的指定边距完全显示在视图内,有助于用户更好地查看和操作指定的图形项。

                  22、bool QGraphicsView::event(QEvent *event)

                  bool QGraphicsView::event(QEvent *event) 是Qt GUI框架中 QGraphicsView 类的一个重载函数,它处理发送给视图的各种事件。该函数的主要目的是对传入的事件进行处理,并根据事件类型执行相应的操作。

                  在自定义的 QGraphicsView 类中,可以通过重写 event() 函数来处理特定类型的事件,或者修改事件的默认处理方式。当事件被分发给视图时,会先调用此函数,如果该函数返回 true,则表示事件已被处理,不会再传递给其他事件处理器;如果返回 false,则表明事件未被处理,将会继续传递给父类或者其他已安装的事件过滤器。

                  例如,你可以在 event() 函数中捕获并处理键盘、鼠标、窗口以及其他各种类型的事件,如下所示:

                  bool CustomGraphicsView::event(QEvent *event){    switch (event->type()) {    case QEvent::KeyPress:        // 处理按键事件        break;    case QEvent::MouseButtonPress:        // 处理鼠标按下事件        break;    default:        // 对于其他事件,调用基类的处理方式        return QGraphicsView::event(event);    }    // 如果在此处处理了事件,则返回true    return true;}

                  需要注意的是,对于大部分标准的GUI事件,Qt已经为 QGraphicsView 提供了专门的事件处理函数(如 keyPressEvent, mousePressEvent 等),在大多数情况下,优先使用这些专用函数而非直接在 event() 中处理事件。

                  23、void QGraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)

                  void QGraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio) 是Qt GUI框架中 QGraphicsView 类的一个成员函数。该函数的作用是调整视图的缩放级别,使得指定的 QRectF 区域适应视图的大小,保持或忽略指定的宽高比。

                  参数说明:

                  • const QRectF &rect:这是要在视图中适应的场景坐标的矩形区域。
                  • Qt::AspectRatioMode aspectRatioMode:这是一个枚举值,决定了是否保持原矩形的宽高比。默认值为 Qt::IgnoreAspectRatio,意味着在适应视图时不考虑原矩形的宽高比。如果希望保持宽高比,可以选择 Qt::KeepAspectRatio 或 Qt::KeepAspectRatioByExpanding。

                    调用此函数后,视图会自动调整其缩放比例,使得整个指定的矩形区域能在视图中完整显示,同时根据 aspectRatioMode 参数选择是否保持原始矩形的比例关系。这对于确保用户可以看到全部内容,特别是在场景较大的时候很有用。

                    #include #include #include #include #include #include class MyGraphicsView : public QGraphicsView{public:    MyGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)    {        // 创建一个场景和一个矩形项        QGraphicsScene *scene = new QGraphicsScene(this);        QGraphicsRectItem *rectItem = scene->addRect(-100, -100, 200, 200, QPen(Qt::black), QBrush(Qt::blue));                // 设置视图的场景        setScene(scene);        // 让视图自动适应矩形项的大小,保持宽高比        fitInView(rectItem->boundingRect(), Qt::KeepAspectRatio);    }};int main(int argc, char *argv[]){    QApplication app(argc, argv);    // 创建并显示图形视图    MyGraphicsView view;    view.show();    return app.exec();}

                    在这个例子中,我们首先创建了一个 QGraphicsView 的子类 MyGraphicsView。在构造函数中,我们创建了一个 QGraphicsScene 场景并添加了一个 QGraphicsRectItem 矩形项。然后,我们调用 fitInView() 函数,传入矩形项的边界矩形(boundingRect() 方法获取),并指定要保持宽高比(Qt::KeepAspectRatio)。最后,我们创建并显示 MyGraphicsView 实例,此时视图将自动调整缩放比例,使得矩形项恰好适应视图的大小且保持原始的宽高比。

                    24、void QGraphicsView::fitInView(qreal x, qreal y, qreal w, qreal h, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)

                    void QGraphicsView::fitInView(qreal x, qreal y, qreal w, qreal h, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio) 这个函数的作用是调整 QGraphicsView 的缩放级别,使其能够容纳指定坐标(x, y)处,宽度(w)和高度(h)的区域,并根据 aspectRatioMode 参数来决定是否保持纵横比。

                    参数说明:

                    • qreal x: 要适应的区域左上角的x坐标(基于场景坐标系)。
                    • qreal y: 要适应的区域左上角的y坐标(基于场景坐标系)。
                    • qreal w: 要适应的区域的宽度。
                    • qreal h: 要适应的区域的高度。
                    • Qt::AspectRatioMode aspectRatioMode:一个枚举值,用于指定是否保持适应区域的纵横比。默认为 Qt::IgnoreAspectRatio,即不保持纵横比;如果设置为 Qt::KeepAspectRatio 或 Qt::KeepAspectRatioByExpanding,则视图在缩放时会尽量保持适应区域的纵横比。

                      实例:

                      QGraphicsView view;view.setScene(new QGraphicsScene());// 假设有某个矩形区域需要适应视图大小qreal x = 50;qreal y = 50;qreal w = 200;qreal h = 100;// 调整视图以适应这个矩形区域,并保持纵横比view.fitInView(x, y, w, h, Qt::KeepAspectRatio);// 显示视图view.show();

                      在这段代码中,视图会自动调整其缩放级别,使得坐标(50, 50)处,宽为200,高为100的区域能在视图中完全显示,同时保持原始的宽高比。

                      25、void QGraphicsView::fitInView(const QGraphicsItem *item, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)

                      void QGraphicsView::fitInView(const QGraphicsItem *item, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio) 是Qt GUI库中 QGraphicsView 类的一个成员函数,用于调整视图的缩放级别,使得指定的 QGraphicsItem 完全显示在视图内,并根据 aspectRatioMode 参数来决定是否保持该图形项的纵横比。

                      参数说明:

                      • const QGraphicsItem *item:指向需要适应视图的 QGraphicsItem 指针。
                      • Qt::AspectRatioMode aspectRatioMode:一个枚举值,指定适应视图时是否保持图形项的纵横比。默认值为 Qt::IgnoreAspectRatio,这意味着在适应视图时不考虑图形项的原有比例;如果设置为 Qt::KeepAspectRatio 或 Qt::KeepAspectRatioByExpanding,则视图在缩放时会尽可能保持图形项的纵横比。

                        实例:

                        // 假设已经有一个 QGraphicsView 对象 view 和 QGraphicsItem 对象 myItem// myItem 已经添加到了 view 关联的 QGraphicsScene 中// 调整视图以适应 myItem 的大小,并保持纵横比view.fitInView(myItem, Qt::KeepAspectRatio);// 显示视图view.show();

                        在这个示例中,QGraphicsView 对象 view 会自动调整其缩放级别,使得 myItem 完全显示在视图内,并且保持 myItem 的原始纵横比。如果视图原本的大小不足以完整显示 myItem,则视图会进行相应的缩放。

                        26、void QGraphicsView::focusInEvent(QFocusEvent *event)

                        void QGraphicsView::focusInEvent(QFocusEvent *event) 是Qt GUI框架中 QGraphicsView 类的一个重载事件处理函数。当 QGraphicsView 控件获得焦点时(例如用户通过键盘Tab键切换焦点或鼠标点击该控件),该函数会被调用。

                        通过重写这个函数,开发者可以自定义视图获取焦点时的行为,比如改变视图外观以显示当前具有焦点,或者启动某些与焦点有关的功能。

                        一个简单的重写示例:

                        void CustomGraphicsView::focusInEvent(QFocusEvent *event){    // 调用父类的实现,以确保默认的焦点事件处理也能执行    QGraphicsView::focusInEvent(event);    // 自定义处理焦点进入事件的代码    if (event->gotFocus())    {        // 当视图获取焦点时,改变其边框颜色        setStyleSheet("border: 2px solid red;");        // 或者执行其他与获取焦点相关的操作        // ...    }}

                        在这个示例中,当 CustomGraphicsView 获得焦点时,视图的边框颜色会变为红色,以此来可视化地标识当前焦点所在。当然,你可以根据自己的需求编写不同的处理逻辑。

                        27、bool QGraphicsView::focusNextPrevChild(bool next)

                        bool QGraphicsView::focusNextPrevChild(bool next) 是Qt GUI框架中 QGraphicsView 类的一个成员函数。此函数用于在视图的子控件之间切换焦点,参数 next 决定了焦点是向前切换还是向后切换。

                        当 next 参数为 true 时,焦点会转移到下一个可以接收焦点的子控件;当 next 为 false 时,焦点会转移到前一个可以接收焦点的子控件。

                        该函数的返回值为布尔类型,如果成功转移焦点,则返回 true,否则返回 false,例如当没有更多可聚焦的子控件时。

                        在 QGraphicsView 中,此函数主要用于处理嵌套在视图内部的可聚焦控件,如文本编辑框或其他可聚焦的 QGraphicsItem。通常情况下,开发者并不需要直接调用此函数,而是依赖于键盘导航(如 Tab 键)或者通过其他方式间接触发焦点切换。不过在某些情况下,如果需要自定义焦点切换逻辑,可能需要重写或利用这个函数。

                        28、void QGraphicsView::focusOutEvent(QFocusEvent *event)

                        void QGraphicsView::focusOutEvent(QFocusEvent *event) 是Qt GUI框架中 QGraphicsView 类的一个重载事件处理函数。当 QGraphicsView 控件失去焦点时(例如用户通过键盘Tab键切换焦点至其他控件或鼠标点击了其他可聚焦的控件),该函数会被调用。

                        通过重写这个函数,开发者可以自定义视图失去焦点时的行为,例如改变视图的外观以显示当前不再具有焦点,或者停止某些与焦点有关的功能。

                        一个简单的重写示例:

                        void CustomGraphicsView::focusOutEvent(QFocusEvent *event){    // 调用父类的实现,以确保默认的焦点事件处理也能执行    QGraphicsView::focusOutEvent(event);    // 自定义处理焦点离开事件的代码    if (event->lostFocus())    {        // 当视图失去焦点时,恢复其边框颜色        unsetStyleSheet();        // 或者执行其他与失去焦点相关的操作        // ...    }}

                        在这个示例中,当 CustomGraphicsView 失去焦点时,视图会恢复其原来的边框样式,以此来反映当前焦点已不在该视图上。你可以根据具体需求编写不同的处理逻辑。

                        29、void QGraphicsView::inputMethodEvent(QInputMethodEvent *event)

                        void QGraphicsView::inputMethodEvent(QInputMethodEvent *event) 是Qt GUI框架中 QGraphicsView 类的一个重载事件处理函数,它负责处理与输入法(IME)相关的事件。在多语言环境下,特别是东亚地区(如中国、日本、韩国等),输入法事件常用于处理文字输入,如汉字、假名、韩文等字符的输入。

                        当用户使用输入法进行文本输入时,操作系统会发送 QInputMethodEvent 到当前具有焦点的控件。重写 inputMethodEvent 函数可以使 QGraphicsView 或其子类支持通过输入法输入文本,并在图形场景中显示相应的文本内容。

                        然而,QGraphicsView 默认情况下可能并不直接支持这种事件,因为它的主要用途是对图形场景进行显示和交互。通常,如果您想在 QGraphicsView 中的某个 QGraphicsItem 中接收和处理输入法事件,您需要在相应的 QGraphicsItem 子类中重写 inputMethodEvent 函数。而对于 QGraphicsView 自身,可能需要处理输入法事件来更新视图状态或协助焦点管理等。

                        在Qt中,通常我们会为 QGraphicsTextItem 这样的文本项处理输入法事件,而不是直接在 QGraphicsView 上处理。这是因为 QGraphicsView 主要是用于显示和控制 QGraphicsScene 中的图形项,而输入法事件通常关联到文本输入。

                        以下是一个在 QGraphicsTextItem 子类中处理输入法事件的示例:

                        class CustomGraphicsTextItem : public QGraphicsTextItem{public:    using QGraphicsTextItem::QGraphicsTextItem;protected:    void inputMethodEvent(QInputMethodEvent *event) override    {        // 删除现有预编辑文本(如果有)        if (!preeditText().isEmpty()) {            setText(preeditText().mid(preeditText().indexOf(QString("\uFFF9")) + 1,                                     preeditText().length() - 2));        }        // 分配新的预编辑文本        setText(event->preeditString());        // 处理插入的文本        for (auto it = event->attributes().constBegin(); it != event->attributes().constEnd(); ++it) {            if (it.value().type() == QVariant::String && it.key() == QLatin1String("insert")) {                setText(text() + it.value().toString());            }        }        // 调用父类的实现以确保默认行为        QGraphicsTextItem::inputMethodEvent(event);    }};// 使用自定义的文本项CustomGraphicsTextItem *textItem = new CustomGraphicsTextItem("Hello, World!", scene);

                        在上述代码中,我们创建了一个名为 CustomGraphicsTextItem 的 QGraphicsTextItem 子类,并重写了 inputMethodEvent 函数,以处理输入法事件并更新文本项的内容。

                        实际上,QGraphicsTextItem 已经内置了对输入法事件的支持,通常不需要额外重写 inputMethodEvent。但在某些特殊需求下,如自定义预编辑文本的显示方式或扩展输入法事件处理逻辑时,才需要这样做。在常规使用情境下,我们只需创建一个 QGraphicsTextItem,它就能自动处理输入法事件。

                        30、QVariant QGraphicsView::inputMethodQuery(Qt::InputMethodQuery query) const

                        QVariant QGraphicsView::inputMethodQuery(Qt::InputMethodQuery query) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数,用于查询与输入法相关的信息。当输入法(IME)需要获取与视图相关的输入法属性时,会调用此函数。

                        参数 query 是一个枚举类型 Qt::InputMethodQuery,用于指定要查询的信息类型,例如:

                        • Qt::ImCursorRectangle:查询光标所在的矩形区域。
                        • Qt::ImFont:查询当前使用的字体。
                        • Qt::ImHints:查询输入法提示信息。
                        • Qt::ImMicroFocus:查询微焦点区域(输入法所需关注的文本区域)。

                          该函数返回一个 QVariant 对象,包含了对应查询请求的结果。

                          虽然 QGraphicsView 类可能不直接处理文本输入,但其子类(如 QGraphicsTextItem)可能需要支持输入法功能。在某些情况下,QGraphicsView 可能需要参与输入法查询以协助正确的焦点管理和文本布局。

                          一个典型的使用场景可能是在自定义的 QGraphicsItem 子类中,而不是直接在 QGraphicsView 中使用 inputMethodQuery 函数。例如:

                          QVariant MyGraphicsTextItem::inputMethodQuery(Qt::InputMethodQuery query) const{    if (query == Qt::ImCursorPosition) {        QTextCursor cursor = textCursor();        return QVariant(cursor.position());    }    return QGraphicsTextItem::inputMethodQuery(query);}

                          31、bool QGraphicsView::isTransformed() const

                          bool QGraphicsView::isTransformed() const 是Qt GUI框架中 QGraphicsView 类的一个成员函数,用于检测视图是否应用了任何变换(如缩放、旋转、平移等)。如果视图应用了任何变换,该函数将返回 true,反之则返回 false。

                          这个函数可以帮助开发人员了解视图当前的状态,例如在需要保存视图状态或恢复之前的状态时,可以检查视图是否进行了变换操作。在实际应用中,结合 resetTransform() 等函数可以有效地管理视图的变换状态。

                          32、QGraphicsItem *QGraphicsView::itemAt(const QPoint &pos) const

                          QGraphicsItem *QGraphicsView::itemAt(const QPoint &pos) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数,它用于查找在视图坐标系统中指定点(pos)下的 QGraphicsItem 对象。

                          函数参数:

                          • const QPoint &pos:表示视图坐标系中的一个点。

                            返回值:

                            • QGraphicsItem *:返回位于指定点下的顶层可见 QGraphicsItem 指针,如果没有找到任何项目,则返回 nullptr。

                              这个函数对于实现交互式图形界面非常有用,例如,当用户在视图上单击鼠标时,我们可以调用 itemAt() 来确定用户点击的具体图形项目,并根据该项目执行相应的操作。此外,该函数只会返回最上层的图形项目,如果有多个项目重叠在同一位置,只有最上层的项目会被返回。如果需要获取所有重叠的项目,可以使用 items() 函数。

                              33、QGraphicsItem *QGraphicsView::itemAt(int x, int y) const

                              QGraphicsItem *QGraphicsView::itemAt(int x, int y) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数,其功能与 itemAt(const QPoint &pos) const 几乎相同,只是参数形式不同。这个函数同样用于查找在视图坐标系统中指定位置(x 和 y)下的顶层可见 QGraphicsItem 对象。

                              函数参数:

                              • int x:表示视图坐标系中的x坐标值。
                              • int y:表示视图坐标系中的y坐标值。

                                返回值:

                                • QGraphicsItem *:返回位于指定位置下的顶层可见 QGraphicsItem 指针,如果没有找到任何项目,则返回 nullptr。

                                  这个函数可以帮助开发人员快速定位到视图上特定坐标点的图形项目,进而实现诸如鼠标单击事件处理、交互式图形界面等功能。同理,如果需要获取所有位于同一位置的重叠项目,应使用 items() 函数配合相应参数。

                                  34、QList QGraphicsView::items() const

                                  QList QGraphicsView::items() const 是Qt GUI框架中 QGraphicsView 类的一个成员函数,它返回与视图关联的 QGraphicsScene 中的所有可见 QGraphicsItem 对象列表。

                                  这个函数不接受任何参数,它遍历整个场景并收集所有可见的图形项。返回值是一个 QList 类型的容器,包含了场景中所有可见的 QGraphicsItem 指针。

                                  当你需要访问视图中所有的图形项,或者对所有图形项进行某种操作时,可以使用这个函数。例如,你可能想要遍历所有图形项以改变它们的颜色或处理碰撞检测等。

                                  请注意,这个函数返回的是所有可见的图形项,如果某个图形项被其他图形项遮挡或其自身的可见性设置为隐藏,则不会被包含在这个列表中。如果你需要获取场景中所有的(无论是否可见)QGraphicsItem,应当调用 QGraphicsScene::items() 函数。

                                  #include #include #include #include #include #include // 为了方便展示,我们定义一个简单的自定义图形项,带有名称class NamedRectItem : public QGraphicsRectItem{public:    NamedRectItem(const QString &name, QGraphicsItem *parent = nullptr)        : QGraphicsRectItem(0, 0, 50, 50, parent), m_name(name)    {}    QString name() const { return m_name; }private:    QString m_name;};int main(int argc, char *argv[]){    QApplication app(argc, argv);    // 创建一个QGraphicsView和QGraphicsScene    QGraphicsView view;    QGraphicsScene *scene = new QGraphicsScene(&view);    // 添加几个自定义的NamedRectItem到场景中    NamedRectItem item1("Item 1");    NamedRectItem item2("Item 2");    NamedRectItem item3("Item 3");    scene->addItem(&item1);    scene->addItem(&item2);    scene->addItem(&item3);    // 设置视图的场景并显示视图    view.setScene(scene);    view.show();    // 获取并打印所有可见的QGraphicsItem的名称    QList visibleItems = view.items();    for (QGraphicsItem *item : visibleItems) {        NamedRectItem *namedItem = qgraphicsitem_cast(item);        if (namedItem) {            std::cout addRect(75, 75, 50, 50, QPen(Qt::black), QBrush(Qt::red));    view.setScene(scene);    view.show();    // 获取并打印指定位置的所有图形项    QPoint pos(100, 100); // 选择一个在两个矩形相交区域的位置    QList itemsAtPosition = view.items(pos);    for (QGraphicsItem *item : itemsAtPosition) {        qDebug() addRect(75, 75, 50, 50, QPen(Qt::black), QBrush(Qt::red));    view.setScene(scene);    view.show();    // 获取并打印指定坐标的所有图形项    int x = 100;    int y = 100; // 选择一个在两个矩形相交区域的坐标    QList itemsAtPosition = view.items(x, y);    for (QGraphicsItem *item : itemsAtPosition) {        qDebug() setValue(verticalScrollBar()->value() - 10);            break;        case Qt::Key_Down:            // 按下箭头键时,平移视图向下            verticalScrollBar()->setValue(verticalScrollBar()->value() + 10);            break;        default:            // 如果不是特殊处理的键,则传递给父类处理            QGraphicsView::keyPressEvent(event);            break;        }    }};

                                  在这个例子中,当我们按下方向键时,视图的内容会按照相应方向平移一定的像素距离。如果接收到的按键事件不是我们特别处理的,那么就将其交给基类的 keyPressEvent 函数来处理默认的行为。

                                  42、void QGraphicsView::keyReleaseEvent(QKeyEvent *event)

                                  void QGraphicsView::keyReleaseEvent(QKeyEvent *event) 是Qt GUI框架中 QGraphicsView 类的一个重载函数,它处理键盘按键释放事件。当用户在 QGraphicsView 上释放某个键时,这个函数会被自动调用。

                                  该函数同样接收一个指向 QKeyEvent 对象的指针作为参数,QKeyEvent 对象包含了按键释放的相关信息,如释放的是哪个键以及释放时的按键状态等。

                                  在一些应用场景中,可能需要监听键盘按键释放的时刻来执行特定的操作,这时就需要重写(override)keyReleaseEvent 函数。例如,当用户长按某个键时,可能在按下期间执行一种操作,在释放时结束该操作:

                                  class MyGraphicsView : public QGraphicsView {protected:    bool isMoving = false;    QPointF moveStartPos;    void keyPressEvent(QKeyEvent *event) override {        if (event->key() == Qt::Key_Space) {            // 按下空格键开始移动操作            isMoving = true;            moveStartPos = mapToScene(event->pos());        } else {            QGraphicsView::keyPressEvent(event);        }    }    void keyReleaseEvent(QKeyEvent *event) override {        if (event->key() == Qt::Key_Space) {            // 释放空格键结束移动操作            isMoving = false;            // 在这里执行移动结束后需要做的清理工作        } else {            QGraphicsView::keyReleaseEvent(event);        }    }    void mouseMoveEvent(QMouseEvent *event) override {        if (isMoving) {            QPointF moveEndPos = mapToScene(event->pos());            // 在这里计算并执行视图的平移操作        }        QGraphicsView::mouseMoveEvent(event);    }};

                                  在这个示例中,我们监听空格键的释放事件,并在释放时结束视图的移动操作。同时,在 mouseMoveEvent 中根据 isMoving 的状态判断是否进行视图的平移。这只是一个简化的示例,实际应用可能会更复杂。

                                  43、QPoint QGraphicsView::mapFromScene(const QPointF &point) const

                                  QPoint QGraphicsView::mapFromScene(const QPointF &point) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数。该函数用于将给定的场景坐标系中的点(QPointF 类型)映射到视图(viewport)的坐标系中,并返回对应的视图坐标系中的点(QPoint 类型)。

                                  参数说明:

                                  • const QPointF &point:表示场景坐标系中的一个点。

                                    示例代码:

                                    QGraphicsView view;QGraphicsScene *scene = new QGraphicsScene(&view);// 假设我们在场景中有一个点QPointF scenePoint(100, 100);// 将场景中的点转换为视图坐标系中的点QPoint viewPoint = view.mapFromScene(scenePoint);// 现在viewPoint就是scenePoint在视图坐标系中的位置

                                    通过这个函数,您可以根据场景中的坐标得到视图窗口中对应的坐标,这对于处理鼠标事件、图形项与视图间的相对位置等问题非常有用。

                                    44、QPolygon QGraphicsView::mapFromScene(const QRectF &rect) const

                                    QPolygon QGraphicsView::mapFromScene(const QRectF &rect) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数。该函数用于将给定的场景坐标系中的矩形(QRectF 类型)映射到视图(viewport)的坐标系中,并返回对应的视图坐标系中的多边形(QPolygon 类型)。

                                    参数说明:

                                    • const QRectF &rect:表示场景坐标系中的一个矩形区域。

                                      示例代码:

                                      QGraphicsView view;QGraphicsScene *scene = new QGraphicsScene(&view);// 假设我们在场景中有一个矩形区域QRectF sceneRect(100, 100, 200, 150);// 将场景中的矩形区域转换为视图坐标系中的多边形QPolygon viewPolygon = view.mapFromScene(sceneRect);// 现在viewPolygon就是sceneRect在视图坐标系中的顶点序列

                                      通过这个函数,您可以根据场景中的矩形区域得到视图窗口中对应的顶点序列,这对于将场景中的图形区域转换为视图坐标以便进一步处理非常有用,比如绘制、选区操作等。

                                      重载函数:

                                      1、QPolygon QGraphicsView::mapFromScene(const QPolygonF &polygon) const

                                      2、QPainterPath QGraphicsView::mapFromScene(const QPainterPath &path) const

                                      45、QPoint QGraphicsView::mapFromScene(qreal x, qreal y) const

                                      QPoint QGraphicsView::mapFromScene(qreal x, qreal y) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数。该函数用于将给定的场景坐标系中的坐标(x, y,均为 qreal 类型)映射到视图(viewport)的坐标系中,并返回对应的视图坐标系中的点(QPoint 类型)。

                                      参数说明:

                                      • qreal x:表示场景坐标系中的X坐标值。
                                      • qreal y:表示场景坐标系中的Y坐标值。

                                        示例代码:

                                        QGraphicsView view;QGraphicsScene *scene = new QGraphicsScene(&view);// 假设我们在场景中有一个点 (100.5, 100.5)qreal sceneX = 100.5;qreal sceneY = 100.5;// 将场景中的点转换为视图坐标系中的点QPoint viewPoint = view.mapFromScene(sceneX, sceneY);// 现在viewPoint就是(100.5, 100.5)在视图坐标系中的位置

                                        通过这个函数,您可以根据场景中的坐标得到视图窗口中对应的坐标,这对于处理鼠标事件、图形项与视图间的相对位置等问题非常有用。

                                        46、QPolygon QGraphicsView::mapFromScene(qreal x, qreal y, qreal w, qreal h) const

                                        函数功能类似于QPolygon QGraphicsView::mapFromScene(const QRectF &rect) const成员函数,都是将场景坐标映射到视图坐标系当中

                                        47、QPointF QGraphicsView::mapToScene(const QPoint &point) const

                                        QPointF QGraphicsView::mapToScene(const QPoint &point) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数。该函数用于将给定的视图(viewport)坐标系中的点(QPoint 类型)映射到场景坐标系中,并返回对应的场景坐标系中的点(QPointF 类型)。

                                        参数说明:

                                        • const QPoint &point:表示视图坐标系中的一个点。

                                          示例代码:

                                          QGraphicsView view;QGraphicsScene *scene = new QGraphicsScene(&view);// 假设我们在视图窗口中有一个点 (100, 100)QPoint viewPoint(100, 100);// 将视图中的点转换为场景坐标系中的点QPointF scenePoint = view.mapToScene(viewPoint);// 现在scenePoint就是(100, 100)在场景坐标系中的位置

                                          通过这个函数,您可以根据视图中的坐标得到场景中的对应坐标,这对于处理视图与场景之间的交互,如鼠标事件的处理,图形项在场景中的放置等操作非常有用。

                                          48、QPolygonF QGraphicsView::mapToScene(const QRect &rect) const

                                          QPolygonF QGraphicsView::mapToScene(const QRect &rect) const 是Qt GUI框架中 QGraphicsView 类的一个成员函数。该函数用于将给定的视图(viewport)坐标系中的矩形区域(QRect 类型)映射到场景坐标系中,并返回对应的场景坐标系中的点集合(QPolygonF 类型)。

                                          参数说明:

                                          • const QRect &rect:表示视图坐标系中的一个矩形区域。

                                            示例代码:

                                            QGraphicsView view;QGraphicsScene *scene = new QGraphicsScene(&view);// 假设我们在视图窗口中有一个矩形区域 (100, 100, 200, 150)QRect viewRect(100, 100, 200, 150);// 将视图中的矩形区域转换为场景坐标系中的点集合QPolygonF scenePolygon = view.mapToScene(viewRect);// 现在scenePolygon就是视图矩形区域在场景坐标系中的各个顶点

                                            通过这个函数,您可以根据视图中的矩形区域得到场景中的对应顶点集合,这对于将视图空间的选区、绘制区域等转换到场景空间进行处理非常有用。

                                            重载函数:

                                            1、QPolygonF QGraphicsView::mapToScene(const QPolygon &polygon) const

                                            2、QPolygonF QGraphicsView::mapToScene(const QPainterPath &path) const

                                            3、QPolygonF QGraphicsView::mapToScene(int x, int y) const

                                            4、QPolygonF QGraphicsView::mapToScene(int x, int y, int w, int h) const

                                            49、void QGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)

                                            void QGraphicsView::mouseDoubleClickEvent(QMouseEvent *event) 是Qt GUI框架中 QGraphicsView 类的一个重载函数,用于处理视图上的鼠标双击事件。当用户在 QGraphicsView 视图区域内双击鼠标时,这个函数会被自动调用。

                                            函数参数:

                                            • QMouseEvent *event:这是一个指向 QMouseEvent 对象的指针,包含了关于鼠标双击事件的详细信息,如鼠标按键、点击位置、事件发生的全局和局部坐标等。

                                              示例代码:

                                              class CustomGraphicsView : public QGraphicsView{protected:    void mouseDoubleClickEvent(QMouseEvent *event) override    {        // 获取鼠标双击事件发生的位置        QPointF scenePos = mapToScene(event->pos());        // 打印鼠标双击的场景坐标位置        qDebug() 

上一篇:斗鱼直播源码仿制揭秘,探索直播技术的神秘之旅

下一篇:怎么黑进阿里云服务器?