Qt - 无法获取父窗口小部件

时间:2017-05-07 12:29:30

标签: c++ qt

ClickableLabel像这样:

gui.h

class ClickableLabel : public QLabel
{
    Q_OBJECT
public:
    explicit ClickableLabel(Card card,const QString& text="", QWidget* parent=0);
    ~ClickableLabel();
signals:
    void clicked(const QString &text);

protected:

private:
    QSignalMapper *signalMapper;
};

gui.cpp

ClickableLabel::ClickableLabel(Card card,const QString& text,QWidget* parent) : QLabel(parent)
{
    QWidget *w = this->parentWidget();
    Q_ASSERT(w);
}

档案main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    gui w;

    QList<QVBoxLayout*> layouts = w.findChildren<QVBoxLayout*>();
    layouts[0]->addWidget(new ClickableLabel("myLabel"));

    w.show();
    return a.exec();
}

此应用不断突破Q_ASSERT因为parentWidget()函数返回0。现在我不明白它是如何访问父窗口小部件的。我看到在构造函数中,父级默认设置为0。但是当我删除这个默认父级时,我将无法继承QLabel。

所以我的问题是,如何从ClickableLabel访问父窗口小部件?

1 个答案:

答案 0 :(得分:3)

QWidget的父级在构造期间(不是您的情况)或者被添加到另一个小部件的对象树中时被分配。 将其添加到布局后,您将拥有父窗口小部件

auto label = new ClickableLabel("myLabel");
qDebug() << label->parentWidget();
layouts[0]->addWidget(label); // added here as a child of another widget
qDebug() << label->parentWidget();