Не следует использовать имя класса с именем виджета, поэтому первое, что нужно сделать, это изменить его имя:
первый вариант:
С другой стороны, QLabel
это внутри DemoPromotedWidget
не означает, что DemoPromotedWidget
может получить доступ к QLabel
и меньше в конструкторе, поскольку в этом методе он еще не добавлен в главное окно, Возможное решение - создать атрибут, в котором вы можете присвоить ему QLabel
:
demopromotedwidget.h
#ifndef DEMOPROMOTEDWIDGET_H
#define DEMOPROMOTEDWIDGET_H
#include <QLabel>
#include <QWidget>
class DemoPromotedWidget : public QWidget
{
Q_OBJECT
public:
explicit DemoPromotedWidget(QWidget *parent = nullptr);
QLabel *getLabel() const;
void setLabel(QLabel *value);
private:
QLabel *label;
};
#endif // DEMOPROMOTEDWIDGET_H
demopromotedwidget.cpp
#include "demopromotedwidget.h"
DemoPromotedWidget::DemoPromotedWidget(QWidget *parent) : QWidget(parent)
{
}
QLabel *DemoPromotedWidget::getLabel() const
{
return label;
}
void DemoPromotedWidget::setLabel(QLabel *value)
{
label = value;
if(label)
label->setText("some text");
}
mainwindow.cpp
...
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->widget->setLabel(ui->DemoLabel);
}
...
второй вариант:
Еще один гораздо более простой способ, но это можно сделать, только если виджет (QLabel) добавлен с использованием Qt Designer, как в этом случае с использованием методов showEvent()
и findChild()
:
demopromotedwidget.h
#ifndef DEMOPROMOTEDWIDGET_H
#define DEMOPROMOTEDWIDGET_H
#include <QLabel>
#include <QWidget>
class DemoPromotedWidget : public QWidget
{
Q_OBJECT
public:
explicit DemoPromotedWidget(QWidget *parent = nullptr);
private:
QLabel *label;
protected:
void showEvent(QShowEvent *event);
};
#endif // DEMOPROMOTEDWIDGET_H
demopromotedwidget.cpp
#include "demopromotedwidget.h"
DemoPromotedWidget::DemoPromotedWidget(QWidget *parent) : QWidget(parent)
{
}
void DemoPromotedWidget::showEvent(QShowEvent *event)
{
label = findChild<QLabel *>("DemoLabel");
if(label)
label->setText("some text");
QWidget::showEvent(event);
}
Обновление:
Новый подход состоит в том, что вы создаете форму, которая является QWidget и имеет .ui
, .h
и .cpp
:
Как я уже сказал, создайте новый класс, который в отличие от вашего исходного кода имеет .ui, затем откройте его с помощью Qt Designer и добавьте метку
Но это также класс, который вы можете продвигать, как вы это делали при первом подходе.
Полный пример можно найти по следующей ссылке