基于QWidget+QGraphicsView纯手工的传输拓扑图

17 篇文章 ¥119.90 ¥299.90
本文介绍了一种在Qt环境下,不依赖Qt Designer,仅使用QWidget和QGraphics*对象手工创建的传输拓扑图。内容涵盖拓扑图的布局、使用的Qt类、功能实现,包括节点和连线的绘制、移动、保存、放大缩小、悬浮信息显示及右键菜单等。通过提供完整的代码文件,读者可以直接将拓扑图组件集成到项目中。

        在Qt Creator中,在未借助Qt Designer的情况下,基于QWidget+QGraphics*对象类纯手工编码的传输关系拓扑图,进行了升级和更版,下面就来介绍一下具体情况。

        代码模拟的场景是,针对多台机器间文件传输的节点和任务的对应关系,以UI拓扑图的方式来动态展示,如下图

        零)布局

        一)用到的Qt对象类,

  • 1)QGraphics*类,如QGraphicsView、QGraphicsScene、QGraphicsItem、QGraphicsPixmapItem、QGraphicsProxyWidget、QGraphicsSceneHoverEvent;
  • 2)布局类,QVBoxLayout、QHBoxLayout、QFormLayout、QGridLayout;
  • 3)控件类,如QP
### QT中结合OpenGL与QGraphicsView实现图形渲染的方法 在QT中,结合OpenGL和`QGraphicsView`可以显著提升渲染性能,尤其是在需要处理复杂图形或启用抗锯齿功能时。以下是一个详细的实现方法: #### 设置OpenGL作为视口 为了将OpenGL集成到`QGraphicsView`中,可以通过设置一个新的`QGLWidget`(旧版)或`QOpenGLWidget`(新版)作为视口来实现。这一步是关键,因为它替换了默认的基于`QWidget`的视口,从而利用了OpenGL的硬件加速功能[^1]。 ```cpp #include <QApplication> #include <QGraphicsView> #include <QGraphicsScene> #include <QOpenGLWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个图形场景 QGraphicsScene *scene = new QGraphicsScene(); scene->addRect(0, 0, 100, 100, QPen(Qt::black), QBrush(Qt::blue)); // 创建一个图形视图并设置场景 QGraphicsView view(scene); // 使用 QOpenGLWidget 替代默认视口 view.setViewport(new QOpenGLWidget()); // 启用抗锯齿 view.setRenderHint(QPainter::Antialiasing); // 设置视口更新模式为全视口更新 view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); view.show(); return app.exec(); } ``` #### 配置OpenGL特性 如果需要启用OpenGL的特定功能(如抗锯齿),可以通过`QGLFormat`(旧版)或`QSurfaceFormat`(新版)进行配置。例如,为了支持多采样抗锯齿(MSAA),可以在创建`QOpenGLWidget`时指定格式。 ```cpp QSurfaceFormat format; format.setSamples(4); // 设置多采样级别为4 QOpenGLWidget *openGLWidget = new QOpenGLWidget(); openGLWidget->setFormat(format); view.setViewport(openGLWidget); ``` #### 实现自定义OpenGL渲染逻辑 如果需要在`QGraphicsView`中嵌入自定义的OpenGL渲染逻辑,可以继承`QOpenGLWidget`并重写其`initializeGL`、`resizeGL`和`paintGL`方法[^2]。 ```cpp class CustomOpenGLWidget : public QOpenGLWidget { protected: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 设置清除颜色为黑色 } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); // 设置视口大小 } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除缓冲区 // 在这里添加自定义OpenGL渲染代码 } }; // 使用自定义 OpenGL Widget 作为视口 CustomOpenGLWidget *customOpenGLWidget = new CustomOpenGLWidget(); view.setViewport(customOpenGLWidget); ``` #### 注意事项 1. **性能优化**:使用`QGraphicsView::FullViewportUpdate`可以确保整个视口在每次更新时重新绘制,这对于复杂的OpenGL渲染尤为重要[^3]。 2. **兼容性**:在较新的QT版本中,推荐使用`QOpenGLWidget`替代已废弃的`QGLWidget`[^1]。 3. **抗锯齿支持**:确保系统支持OpenGL的采样缓冲区(Sample Buffers),否则可能无法启用抗锯齿功能。 ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pony12

助力1000篇OpenDDS文

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值