我有一个简单的小部件层次结构:GraphWidget - > MotionWidget - > NodeWidget。我是Qt的新手,所以我不太清楚一些内部的工作原理。基本上,GraphWidget创建一个MotionWidget M 并将 M的父项设置为自身。 M 然后消失并创建一堆NodeWidgets。但是,NodeWidgets永远不会被绘制,也不会调用它们的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 );
}
现在,后者有效。即一切都得到了。那么问题就变成......为什么?为什么它不是在第一种情况下工作但在第二种情况下工作?
答案 0 :(得分:3)
我不同意Aiua's answer。将父级传递给对象会将子级添加到可视层次结构中。 (否则,使用Designer制作包含其他内容的小部件,但绝对定位,则不起作用。)但是,可能还有其他因素阻碍了绘画的发生。
由于布局使事情有效,我猜这两个版本中MotionWidget
都没有设置大小。这将意味着在第一个例子中它将被调整为0x0像素,Qt将在尝试绘制时优化。在第二个示例中,布局控制添加到其中的窗口小部件的大小,因此会放大MotionWidget
,因此它将再次开始接收绘制事件。
要解决此问题,您可以像对GraphWidget
一样明确设置大小,或者您可以根据父级的大小进行一些动态调整,或者GraphWidget
可以控制大小或任何大量的各种选择。布局也可以很好,但并非绝对必要。