2017-05-07 20 views
1

はこのようなClickableLabelています:Qtは親ウィジェットを取得できません

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_ASSERTparentWidget()理由関数は012を返す。今、親ウィジェットにアクセスする方法がわからない。コンストラクタで親が0にデフォルトで設定されていることがわかります。しかし、このデフォルトの親を削除すると、QLabelから継承することはできません。

私の質問は、どのように私はClickableLabelから親ウィジェットにアクセスできますか?

+0

私はコンストラクタをeddited: '明示ClickableLabel(のconst QStringの&テキスト=「」);'それでも親 – nocturne

+2

を得ることができないあなたはありません親をコンストラクタに渡すので、もちろんコンストラクタに親は存在しません。親は 'addWidget'によって設定されますが、もちろん、コンストラクタが返った後に発生します。 –

+0

コンストラクタが完了した後にのみアクセスできます。 – nocturne

答えて

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(); 
関連する問題