让 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 访问父窗口小部件?
最佳答案
QWidget
的父级在构造期间(不是您的情况)或在将其添加到另一个小部件的对象树时分配。 在将其添加到布局后,您将拥有父小部件:
auto label = new ClickableLabel("myLabel");
qDebug() << label->parentWidget();
layouts[0]->addWidget(label); // added here as a child of another widget
qDebug() << label->parentWidget();
关于c++ - Qt - 无法获取父小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43831467/