2

我有一个简单的小部件层次结构: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 );
}

现在,后者起作用了。即一切都被绘制。那么问题就变成了……为什么?为什么它在第一种情况下不起作用但在第二种情况下起作用?

4

1 回答 1

3

我不同意Aiua 的回答。将父对象传递给对象会将子对象添加到视觉层次结构中。(否则,使用 Designer 制作包含其他小部件但具有绝对定位的小部件将不起作用。)但是,可能还有其他因素阻止了绘画的发生。

由于布局使事情正常,我猜测在这两个版本中,MotionWidget都没有设置大小。这意味着在第一个示例中,它将被调整为 0x0 像素,Qt 将在尝试绘制时对其进行优化。在第二个示例中,布局控制添加到其中的小部件的大小,因此会放大MotionWidget,因此它将再次开始接收绘制事件。

要解决此问题,您可以像 for 一样显式设置大小GraphWidget,或者您可以根据父级的大小进行一些动态调整大小,或者GraphWidget可以控制大小,或大量各种选项中的任何一个。布局也可以很好,但不是绝对必需的。

于 2009-03-13T17:27:57.480 回答