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

Qt开发经验 --- 避坑指南(10)

文章目录

    • @[toc]
      • 1 QGraphicsView插入控件
      • 2 QGraphicsView鼠标移动
      • 3 QGraphicsScene重绘Bug
      • 4 QGraphicsView开启OpenGL渲染显示Bug

更多精彩内容
👉内容导航 👈
👉Qt开发经验 👈

1 QGraphicsView插入控件

有时候我们想在UI设计师里拖一个控件到QGraphicsView里,发现只要添加布局后,QGraphicsView就不允许拖入控件,因为这不是一个容器,所有不是容器的控件都无法拖入子控件,这要怎么办呢?

其实很好解决,不能直接拖入,但是可以通过指定父对象的方式插入子控件;

  1. QGraphicsView插入控件有两种方式,一种是通过QGraphicsProxyWidget,但是这种添加控件会受到场景类的管理;

  2. 如果我在使用QGraphicsView绘图时想在空白处插入一个QLabel显示信息,但不想随着QGraphicsScene缩放、移动,就可以通过指定父对象的方式插入子控件,例如m_but = new QPushButton(ui->graphicsView);,但是在QGraphicsView里面其它功能会和这个功能出现冲突;

  3. QGraphicsView可以通过setViewport(QWidget *widget)函数设置使用OpenGL渲染绘图,但是如果指定了父对象后再调用这个函数,就会导致本来显示在QGraphicsView上的子控件无法显示,这个bug可以通过下列代码解决,先将子控件的父对象置为空,再重新指定父对象为QGraphicsView,然后show()就可以显示了。

    void Widget::on_checkBox_clicked(bool checked)
    {// 切换显示方式if(checked){ui->graphicsView->setViewport(new QOpenGLWidget);}else{ui->graphicsView->setViewport(new QWidget);}if(!m_but){m_but = new QPushButton("QPushButton", ui->graphicsView);}// 解决切换OpenGL后子控件无法显示Bugm_but->setParent(nullptr);                 // 将父对象设置为空,这一步不能少m_but->setParent(ui->graphicsView);        // 再将父对象设置为QGraphicsViewm_but->show();
    }
    

    在这里插入图片描述

2 QGraphicsView鼠标移动

  • 很多时候我们再使用QGraphicsView绘图时想实现鼠标拖动功能,这个没必要自己写,QGraphicsView已经实现了,需要两个条件就可以实现;
    1. QGraphicsScene场景的大小比QGraphicsView视图的大小大,出现了滚动条;
    2. 通过setDragMode(QGraphicsView::ScrollHandDrag)函数设置可拖动。

在这里插入图片描述

3 QGraphicsScene重绘Bug

有时候我们想通过调用QGraphicsScene::update()函数将所有图元重绘,但是其中QGraphicsItemGroup就有一个Bug,不知道是不是就是这样设计的,当开启鼠标拖动时,将场景原点(0, 0)拖动到视图外后,QGraphicsScene::update()可以触发普通图元的重绘,但是QGraphicsItemGroup重绘不会触发

4 QGraphicsView开启OpenGL渲染显示Bug

QGraphicsView可以通过setViewport函数开启OpenGL显示,在绘制复杂图形时会比较流畅,但是QGraphicsView开启OpenGL后就不能使用Qss设置背景了,否则会出现大量残影无法消除。



相关文章:

  • 使用Java实现HTTP协议服务:从自定义服务器到内置工具
  • MySQL 8.0(主从复制)
  • 如何删除豆包本地大模型
  • 操纵杆支架加工工艺及钻3φ11孔夹具设计
  • L48.【LeetCode题解】904. 水果成篮
  • 《P1177 【模板】排序》
  • 高质量老年生活:从主动健康管理到预防医学的社会价值
  • 一种安全不泄漏、高效、免费的自动化脚本平台
  • C++学习-入门到精通-【5】类模板array和vector、异常捕获
  • CMA认证对象?CMA评审依据,CMA认证好处
  • PPI-ID: 德克萨斯大学研究团队最新款蛋白-蛋白互作(PPI)预测工具上线
  • Java中医门诊系统源码 中医诊所系统源码
  • Ascend的aclgraph(2)_npu_backend中还有些什么秘密?
  • 数据类型详解(布尔值、整型、浮点型、字符串等)-《Go语言实战指南》
  • jenkins 启动报错
  • 少儿编程机构用的教务系统
  • 集成电路流片随笔26:tinyriscv的三级流水线细则pc
  • Windows 10 无法启动或黑屏的修复指南(适用于更新失败或磁盘故障)
  • ResNet详解
  • 全层微调:解锁预训练模型的无限潜力
  • 巴基斯坦称对印度发起军事行动
  • 西安机场回应航站楼“水帘洞”事件:屋面排水系统被冰雹堵塞
  • 一周文化讲座|城市移民与数字时代的新工作
  • 牛市早报|国家发改委:今年将推出约3万亿元优质项目,支持民营企业参与
  • 印官员称巴基斯坦在克什米尔实控线附近开火已致7死38伤
  • 央行行长详解降息:将通过利率自律机制引导商业银行相应下调存款利率