访问Qt中的父级

时间:2014-07-31 10:53:26

标签: c++ qt qt4

我尝试从孩子那里访问父母。 Parent和Child类继承QWidget 让我们看看:

//parent.h

public:
child* h_child = nullptr; //pointer to child - now i can control child in parent methods


//method in parent.cpp
h_child = new child(); //show child window
h_child->show(); //show next window

和孩子

//child.cpp in child method
 parent_class *sth = qobject_cast<parent_class*>(parentWidget());

if (sth == NULL){
    QMessageBox::warning(this, "error !", "error!");
}

而且我看到了错误&#39;

  1. 我尝试将parentWidget()替换为this->parent()。 //结果相同
  2. 我尝试像这样运行子实例:

    h_child = new child(this); //show child window

  3. 但是,当我尝试使用h_child->show()时,显示的窗口已被打破&#39; (我在窗口中有窗口(父窗口中的子窗口,没有子窗口框架) - 看起来很难看)

    那么如何访问父方法和变量呢?

3 个答案:

答案 0 :(得分:1)

创建孩子之后,您是否将父级设置为parentWidget?通常,当您创建QWidget时,您将父项传递给构造函数,但在您的代码中,我看到child()构造函数没有任何参数。这就是parentWidget()返回NULL的原因,您只是不将它设置在任何地方。

答案 1 :(得分:1)

要设置窗口小部件的父级,您可以执行以下操作:

widget = new Widget( parent );

或者这个:

widget->setParent( parent );

当然,如果您尝试显示没有父级的窗口小部件,则会显示它们自己的窗口边框。

实现新窗口小部件时,您将“传播”父指针窗体构造函数:

class Widget : public QWidget
{
  public:

    Widget( QWidget* parent ) : QWidget( parent )
    { }
};

如果您忘记了此步骤,则基本Qt小部件不会注意到该分配,并且此小部件将没有有效的父级。

答案 2 :(得分:0)

正如其他人已经说过的那样,您需要在构造函数中设置子级的父级。 如果您将this作为父级传递,并且之后窗口小部件/窗口看起来已损坏,则可能是布局问题。您的小部件是否有布局,是否将child添加到parent的布局?