【问题标题】:Qt - Cannot get parent widgetQt - 无法获取父小部件
【发布时间】:2017-05-07 22:51:52
【问题描述】:

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();
}

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

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

【问题讨论】:

  • 我将构造函数编辑为:explicit ClickableLabel(const QString&amp; text=""); 但仍然无法获取父级
  • 您没有将父级传递给构造函数,因此构造函数中当然没有父级。父级将由addWidget 设置 - 当然,这发生在构造函数返回之后。
  • 所以我只能在构造函数完成它的工作后才能访问它,谢谢

标签: c++ qt


【解决方案1】:

QWidget 的父级在构造期间(不是您的情况)或添加到另一个小部件的对象树时分配。 将父小部件添加到布局中:

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

【讨论】:

    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 2014-05-04
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多