我有一个简单的小部件层次结构:GraphWidget-> MotionWidget-> NodeWidget。我是Qt的新手,所以我不确定某些内部工作原理。基本上,GraphWidget创建单个MotionWidget M并将M的父级设置为其自身。然后M走开并创建一堆NodeWidget。但是,NodeWidget永远不会被绘制,也不会调用它们的paintEvent()函数。
我尝试直接创建MotionWidget,而没有GraphWidget,一切正常。那么,如果将GraphWidget添加到层次结构中,为什么事情会中断?
这是我的项目中相关代码片段的粘贴。我还在顶部包括了GraphWidget::dumpObjectTree()的输出。
编辑:忘记包括粘贴链接;)http://rafb.net/p/Zp39CF94.html
更新:我将MotionWidget包装到一个布局中。
之前:
GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
setFixedSize( 500, 500 );
MotionWidget *n = new MotionWidget( 5, this );
}
后
GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
setFixedSize( 500, 500 );
QVBoxLayout *l = new QVBoxLayout;
MotionWidget *n = new MotionWidget( 5 );
l->addWidget( n );
setLayout( l );
}
现在,后者有效。即一切都画完了。问题变成了……为什么?为什么在第一种情况下不起作用,而在第二种情况下起作用?
最佳答案
我不同意Aiua's answer。将父级传递给对象会将子级添加到可视层次结构中。 (否则,使用Designer制作包含其他组件但具有绝对定位的小部件将不起作用。)但是,可能还有其他因素阻止了绘画的发生。
由于布局使事情正常进行,因此我猜这两个版本中的MotionWidget
没有设置大小。这将意味着在第一个示例中,它将被设置为0x0像素,Qt在尝试绘制时将对其进行优化。在第二个示例中,布局控制添加到其中的小部件的大小,因此将扩大MotionWidget
,因此它将开始再次接收绘制事件。
要解决此问题,您可以像设置GraphWidget
一样显式地设置大小,或者可以基于父级的大小进行一些动态调整大小,或者GraphWidget
可以控制大小,或者使用各种选项中的任何一个。布局也可以很好,但不是绝对必需的。