【问题标题】:Why QWidget::paintEvent doesn't get called?为什么 QWidget::paintEvent 没有被调用?
【发布时间】:2009-03-12 13:52:57
【问题描述】:

我有一个简单的小部件层次结构:GraphWidget -> MotionWidget -> NodeWidget。我是 Qt 的新手,所以我不太确定某些内部是如何工作的。基本上,GraphWidget 创建单个 MotionWidget M 并将 M's 的父级设置为自身。 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 );
}

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

【问题讨论】:

  • this->setGeometry(parent->rect()) 放在 MotionWidget 构造函数中会消除对另一个布局的需要吗?如果创建后调用n->show()呢?

标签: c++ user-interface qt widget


【解决方案1】:

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

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

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

【讨论】:

  • 你说得对。抱歉我的回答不好。我从不使用绝对定位,所以我忘记了在这种情况下它使用父小部件作为视觉层次结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多