Qt开发经验 --- 避坑指南(10)
文章目录
- @[toc]
- 1 QGraphicsView插入控件
- 2 QGraphicsView鼠标移动
- 3 QGraphicsScene重绘Bug
- 4 QGraphicsView开启OpenGL渲染显示Bug
文章目录
- @[toc]
- 1 QGraphicsView插入控件
- 2 QGraphicsView鼠标移动
- 3 QGraphicsScene重绘Bug
- 4 QGraphicsView开启OpenGL渲染显示Bug
更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1 QGraphicsView插入控件
有时候我们想在UI设计师里拖一个控件到QGraphicsView里,发现只要添加布局后,QGraphicsView就不允许拖入控件,因为这不是一个容器,所有不是容器的控件都无法拖入子控件,这要怎么办呢?
其实很好解决,不能直接拖入,但是可以通过指定父对象的方式插入子控件;
-
QGraphicsView插入控件有两种方式,一种是通过
QGraphicsProxyWidget
,但是这种添加控件会受到场景类的管理; -
如果我在使用QGraphicsView绘图时想在空白处插入一个QLabel显示信息,但不想随着
QGraphicsScene
缩放、移动,就可以通过指定父对象的方式插入子控件,例如m_but = new QPushButton(ui->graphicsView);
,但是在QGraphicsView里面其它功能会和这个功能出现冲突; -
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已经实现了,需要两个条件就可以实现;
QGraphicsScene
场景的大小比QGraphicsView
视图的大小大,出现了滚动条;- 通过
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设置背景了,否则会出现大量残影无法消除。