Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么QWidget::paintEvent不';你没接到电话吗?_C++_User Interface_Qt_Widget - Fatal编程技术网

C++ 为什么QWidget::paintEvent不';你没接到电话吗?

C++ 为什么QWidget::paintEvent不';你没接到电话吗?,c++,user-interface,qt,widget,C++,User Interface,Qt,Widget,我有一个简单的小部件层次结构:GraphWidget->MotionWidget->NodeWidget。我是Qt新手,所以我还不太确定一些内部是如何工作的。基本上,GraphWidget创建单个MotionWidget M并将M的父对象设置为自身。然后M离开并创建了一组nodewidget。但是,NodeWidget永远不会被绘制,它们的paintEvent()函数也不会被调用 我尝试直接创建MotionWidget,没有GraphWidget,一切正常。那么,如果我将GraphWidget添

我有一个简单的小部件层次结构:GraphWidget->MotionWidget->NodeWidget。我是Qt新手,所以我还不太确定一些内部是如何工作的。基本上,GraphWidget创建单个MotionWidget M并将M的父对象设置为自身。然后M离开并创建了一组nodewidget。但是,NodeWidget永远不会被绘制,它们的paintEvent()函数也不会被调用

我尝试直接创建MotionWidget,没有GraphWidget,一切正常。那么,如果我将GraphWidget添加到层次结构中,为什么会出现问题

下面是我的项目中相关代码的粘贴。我还在顶部包含了GraphWidget::dumpObjectTree()的输出

编辑:忘记包含粘贴链接;)

更新:我将MotionWidget包装到一个布局中

之前:

GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    MotionWidget *n = new MotionWidget( 5, this );
}
之后


现在,后者起作用了。也就是说,一切都被画出来了。问题就变成了。。。为什么?为什么它在第一种情况下不起作用,但在第二种情况下起作用?

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

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


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

this->setGeometry(parent->rect())
放置在MotionWidget构造函数中是否会消除对其他布局的需要?如果在创建后调用
n->show()
会怎么样?你完全正确。对不起,我的回答不好。我从不使用绝对定位,所以我忘了在这种情况下,它使用父窗口小部件作为视觉层次。
GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    QVBoxLayout *l = new QVBoxLayout;

    MotionWidget *n = new MotionWidget( 5 );

    l->addWidget( n );

    setLayout( l );
}